Spring实战(第4版) Spring Inaction 笔记(第五章)Spring MVC
2016-11-30 10:15
423 查看
web app 与application的区别就在于pom.xml中的一行
<packaging>war</packaging>
传统WebApp一切开始于web.xml,
web.xml 的配置请看http://blog.csdn.net/believejava/article/details/43229361
web.xml可以和这个类共存,但建议该类取代web.xml
WebConfig内容如下
RootConfig 把自身排除了
DataConfig展示了如何生成一个内存数据库的技巧,使用jdbc
对这个数据库的操作也非常简单
对Controller的技巧展示有如下几种
<packaging>war</packaging>
传统WebApp一切开始于web.xml,
web.xml 的配置请看http://blog.csdn.net/believejava/article/details/43229361
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; import spittr.web.WebConfig; public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { //需要ContextLoaderListener需要加载的bean类似下面的XML,加载其他的所有bean,一般是中间层或者数据层组件 // <context-param> // <param-name>contextConfigLocation</param-name> // <param-value>classpath:applicationContext.xml,classpath:daoContext.xml</param-value> // </context-param> @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[] { RootConfig.class }; } //加载定义在WebConfig类中的各种bean等,类似下面的XML,主要加载控制器,视图解析器,处理器映射, // <servlet> // <servlet-name>mvc-dispatcher</servlet-name> // <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> // <init-param> // <param-name>contextConfigLocation</param-name> // <param-value>classpath:mvc-dispatcher-servlet.xml</param-value> // </init-param> // <load-on-startup>1</load-on-startup> // </servlet> @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] { WebConfig.class }; } // 等同于 // <servlet-mapping> // <servlet-name>mvc-dispatcher</servlet-name> // <url-pattern>/</url-pattern> // </servlet-mapping> @Override protected String[] getServletMappings() { return new String[] { "/" }; } }
web.xml可以和这个类共存,但建议该类取代web.xml
WebConfig内容如下
@Configuration //等价于<mvc:annotation-driven>,即启用Spring MVC @EnableWebMvc @ComponentScan("spittr.web") //启用组件扫描 public class WebConfig extends WebMvcConfigurerAdapter { //启用jsp视图解析器,这样比如某个Controller返回home。就自动变成/WEB-INF/views/home.jsp @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; } //配置静态资源的处理 @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // TODO Auto-generated method stub super.addResourceHandlers(registry); } }
RootConfig 把自身排除了
@Configuration @Import(DataConfig.class) //设置WebPackage类不被自动扫描 @ComponentScan(basePackages={"spittr"}, excludeFilters={ @Filter(type=FilterType.CUSTOM, value=WebPackage.class) }) public class RootConfig { public static class WebPackage extends RegexPatternTypeFilter { public WebPackage() { super(Pattern.compile("spittr\\.web")); } } }
DataConfig展示了如何生成一个内存数据库的技巧,使用jdbc
@Configuration public class DataConfig { @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .addScript("schema.sql") .build(); } @Bean public JdbcOperations jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } }
对这个数据库的操作也非常简单
@Repository public class JdbcSpitterRepository implements SpitterRepository { private JdbcOperations jdbc; @Autowired public JdbcSpitterRepository(JdbcOperations jdbc) { this.jdbc = jdbc; } public Spitter save(Spitter spitter) { jdbc.update( "insert into Spitter (username, password, first_name, last_name, email)" + " values (?, ?, ?, ?, ?)", spitter.getUsername(), spitter.getPassword(), spitter.getFirstName(), spitter.getLastName(), spitter.getEmail()); return spitter; // TODO: Determine value for id } public Spitter findByUsername(String username) { return jdbc.queryForObject( "select id, username, null, first_name, last_name, email from Spitter where username=?", new SpitterRowMapper(), username); } private static class SpitterRowMapper implements RowMapper<Spitter> { public Spitter mapRow(ResultSet rs, int rowNum) throws SQLException { return new Spitter( rs.getLong("id"), rs.getString("username"), null, rs.getString("first_name"), rs.getString("last_name"), rs.getString("email")); } } }
对Controller的技巧展示有如下几种
//相同路径的映射,返回home.jsp @Controller @RequestMapping({"/", "/myhomepage"}) public class HomeController { @RequestMapping(method = GET) public String home(Model model) { return "home"; } }保存数据库,重定向,参数传递的基本用法如下
@Controller @RequestMapping("/spittles") public class SpittleController { private static final String MAX_LONG_AS_STRING = "9223372036854775807"; private SpittleRepository spittleRepository; @Autowired public SpittleController(SpittleRepository spittleRepository) { this.spittleRepository = spittleRepository; } @RequestMapping(method=RequestMethod.GET) public List<Spittle> spittles( @RequestParam(value="max", defaultValue=MAX_LONG_AS_STRING) long max, @RequestParam(value="count", defaultValue="20") int count) { return spittleRepository.findSpittles(max, count); } @RequestMapping(value="/{spittleId}", method=RequestMethod.GET) public String spittle( @PathVariable("spittleId") long spittleId, Model model) { model.addAttribute(spittleRepository.findOne(spittleId)); return "spittle"; } //保存数据库,以及重定向的操作 @RequestMapping(method=RequestMethod.POST) public String saveSpittle(SpittleForm form, Model model) throws Exception { spittleRepository.save(new Spittle(null, form.getMessage(), new Date(), form.getLongitude(), form.getLatitude())); return "redirect:/spittles"; } }
相关文章推荐
- SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-007-表单验证@Valid、Error
- SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-006-处理表单数据(注册、显示用户资料)
- Spring实战(第4版) Spring Inaction 笔记(第一章)依赖注入和AOP
- SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-005-以path parameters的形式给action传参数(value=“{}”、@PathVariable)
- Spring实战(第4版) Spring Inaction 笔记(第二章)bean深入
- SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-003-示例项目用到的类及配置文件
- SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-002-Controller的requestMapping、model
- SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-004-以query parameters的形式给action传参数(@RequestParam、defaultValue)
- SPRING IN ACTION 第4版笔记-第五章Building Spring web applications-001-SpringMVC介绍
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-004-消除BEAN自动装配的歧义@QUALIFIER及自定义注解
- SPRING IN ACTION 第4版笔记-第二章WIRING BEANS-007-以set方法注入<property>\p-namespace\util-space
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-004-使用AspectJ’s pointcut expression language定义Pointcut
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-009-用SPEL给bean运行时注入依赖值
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-002-AOP术语解析
- SPRING IN ACTION 第4版笔记-第二章Wiring Beans-005-<constructor-arg>和c-namespace
- SPRING IN ACTION 第4版笔记-第二章WIRING BEANS-006-当构造函数有集合时的注入
- Spring In Action 第4版笔记-第一章-001架构
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-004-消除bean自动装配的歧义@Primary
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-006-给bean运行时注入值(Environment,Property文件)
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-003-Spring对AOP支持情况的介绍