搭建Spring MVC
配置DispatcherServlet
Java 配置
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {RootAppConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {WebAppConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
- 扩展
AbstractAnnotationConfigDispatcherServletInitializer
的任意类都会自动地配置DispatherServlet和Spring应用上下文,Spring的应用上下文会位于应用程序的Servlet上下文之中。
在Servlet3.0环境中,容器会在类路径中查找实现
javax.servlet.ServletContainerInitializer
接口的类,如果能发现的话,就会用它来配置Servlet容器。
Spring提供了这个接口的实现,名为SpringServletContainerInitializer
,这个类反过来又会查找实现WebApplicationInitializer
的类并将配置的任务交给它们来完成。Spring3.2引入了一个便利的WebApplicationInitializer
实现,也就是AbstractAnnotationConfigDispatcherServletInitializer
,我们自定义的类扩展了它,也就实现了WebApplicationInitializer
,因此部署到Servlet3.0容器中时,容器会自动发现它,并用它来配置Servlet上下文。
getServletMappings()
将一个或多个路径映射到DispatcherServlet上getServletConfigClasses()
方法返回的带有@Configuration
注解的类将会用来定义DispatcherServlet应用上下文中的beangetRootConfigClasses()
方法返回的带有@Configuration
注解的类将会用来配置ContextLoaderListener创建应用上下文中的bean
启动SpringMVC
<mvc:annotation-driven />
或
@Configuration
@EnableWebMvc
public class WebConfig {
}
SpringMVC基本配置
@Configuration
@EnableWebMvc
@ComponentScan("com.websocket")
public class WebAppConfig extends WebMvcConfigurerAdapter {
//配置jsp视图解析器
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
viewResolver.setExposeContextBeansAsAttributes(true);
return viewResolver;
}
//配置静态资源的处理
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
- 通过调用DefaultServletHandlerConfigurer 的enable方法,我们要求DispatcherServlet将对静态资源的请求转发到Servlet容器中默认的Servlet上,而不是使用DispatcherServlet本身来处理此类请求。
@Configuration
@ComponentScan(basePackages = {"com.websocket"},
excludeFilters = {@Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
public class RootAppConfig {
}
测试控制器1
通过路径参数接收输入
@RequestMapping(value = "/show", method = RequestMethod.GET)
public String showSpittle(@RequestParam("spittle_id") long spittleId, Model model) {
... //use spittleId
}
- 这个处理器方法将会处理形如
/show?spittle_id=123
这样的请求
为了实现/show/123
路径变量,Spring允许我们在@RequestMapping路径中添加占位符,占位符名称需要用大括号括起来。路径中的其他部分要与所处理的请求完全匹配,但是占位符可以是任意的值
@RequestMapping(value = "/show/{spittleId}", method = RequestMethod.GET)
public String showSpittle(@PathVariable("spittleId") long spittleId, Model model) {
... //use spittleId
}
- 如果方法参数名和占位符名称相同,我们可以去掉@PathVariable中的value属性
public String showSpittle(@PathVariable long spittleId, Model model) {}
InternalResourceViewResolver 可以识别 redirect:
和 forword:
前缀:
@RequestMapping(...)
public String ...(...) {
...
return "redirect:..."; //重定向到...
}
使用Java 校验API所提供的校验注解 校验参数
SpringMVC中提供了对Java 校验 API的支持。Java API定义了多个注解,这些注解可以放到属性上,从而限制这些属性的值。所有注解都位于javax.validation.constraints
包中
@AssertFalse
所注解的元素必须是boolean类型,并且值为false@AssertTrue
……true@DecimalMax
所注解的元素必须是数字,并且它的值要小于或等于给定的BigDecimalString值@DecimalMin
……大于或等于……@Digits
所注解的元素必须是数字,并且它的值必须有指定的位数@Max
所注解的元素必须是数字,并且它的值要小于或等于给定的值@Min
……大于或等于……@NotNull
所注解的元素的值不能为null@Null
……必须为null@Future
所注解的元素的值必须是一个将来的日期@Past
……已过去的日期@Pattern
所注解的元素的值必须匹配给定的正则表达式@Size
所注解的元素的值必须是String、集合或数组,并且它的长度要符合给定的范围
public class Spitter {
@NotNull
@Size(min=5, max=16)
private String username;
@NotNull
@Size(min=5, max=25)
private String password;
...
}
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String processRegistration(@Valid Spitter spitter, Errors errors) {
if(errors.hasErrors()) { //校验出现错误
return "registerForm";
}
...
}
- 控制器方法接收对象作为参数,对象的属性将会使用请求中同名的参数进行填充
- 如果校验出现错误的话,那么这些错误可以通过Errors对象进行访问
- Errors参数要紧跟在带有@Valid注解的参数后面
- 如果有错误的话,errors.hasErrors()将会返回到registerForm
//Lang 包的方法
EqualsBuilder.reflectionEquals() //重写equals方法
HashCodeBuilder.reflectionHashCode() //重写hashCode方法
p145 ↩︎