1、类型转换
添加自定义的校验器,转换器,格式化器。
注册校验器的方式是重写getValidator方法,它获取的是Spring框架自身的Validator接口,而我们常用的是Hibernate validator。
注册转换器的方式是重写addFormatter方法,注册格式化器的方式也是重写addFormatter方法,在概念上格式化本质是对象转换之间的一个过程。
2、拦截器
添加拦截器实现Interceptor接口,注册拦截器的方式是重写addInterceptor方法,具体细节参考拦截器章节。
3、内容类型
设置响应的内容类型,最常使用的一种方式是设置@RequestMapping, @PostMapping等同类型注解的produces属性,它的值为MediaType,是一个枚举类。
这种方式只是给单个handler方法设置,若要全局设置,需要重写configureContentNegotiation方法。
Mvc判断响应内容类型的依据有三个
- 根据请求url的后缀,例如test/xxx.pdf,此时响应内容的类型为application-pdf
- 根据请求url的参数,默认情况下参数的名称为mediaType, 下述内容会介绍它是可以修改的。例如test/xx? mediaType=pdf
- 根据请求头中的信息。
若三者都无法判断响应的内容类型,会使用默认值。
重写configureContentNegotiation方法等价于自定义规则。示例如下
@Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { // 是否支持url中的后缀做为判断依据,false时会禁用 configurer.favorPathExtension(true) // 请求Url参数的名称,或者是请求头中的参数名称 .parameterName("mediatype") // 是否忽略请求头信息,true会忽略,此时相当于禁用根据请求头信息判断内容类型 .ignoreAcceptHeader(false) .useJaf(false) // 设置默认的响应类型,此时设置为Application_json .defaultContentType(MediaType.APPLICATION_JSON_UTF8) // 建立参数值或者是后缀值与响应类型MediaType之间的关系,例如请求url后缀为xx.json,此时根据json,响应类型为Application_JSON .mediaType("json", MediaType.APPLICATION_JSON) // xml表示Application_xml .mediaType("xml", MediaType.APPLICATION_XML); }
4、Message Converter
Message Converter的功能是将handler方法的返回值根据响应内容的类型转换为特定的数据类型。假设响应内容类型为json时,此时handler方法的返回值为实体对象时,message Converter会将实体对象转换为JSON字符串。
在之前介绍当响应类型为JSON时可以使用@JsonView注解,为Xml时,返回MarshallingView。此时无需message converter。
使用message converter的前提有两个
- 响应内容的类型是已知的,例如xml, json等。
- Handler方法的返回值为实体对象。
重写configureMessageConverters等价于注册HttpMessageConverter接口的实现类,示例如下:
/** * * 配置messageConverter */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 创建ObjectMapperBuilder对象 Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder().indentOutput(true) .dateFormat(new SimpleDateFormat("yyyy-MM-dd")); // 将对象转换为JSON converters.add(new MappingJackson2HttpMessageConverter(builder.build())); // 将对象转换为XML converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build())); }
5、ViewController
它是直接建立请求URL与视图View对象之间的关系。以往情况是请求URL建立与handler方法之间的关系,而后根据handler的返回值来生成View对象。
整个过程省略了handler方法,所以只适用于无任何处理逻辑的请求。示例如下:
@Override public void addViewControllers(ViewControllerRegistry registry) { // 直接跳转到登陆页面,login对应WEB-INF/view/login.jsp registry.addViewController("/login").setViewName("login"); }
6、ViewResolvers
视图解析器,在之前已编写过很多示例。具体参考视图解析器部分。
7、静态资源
静态资源的访问,关键点有两个,
- 第一个是建立静态资源请求与静态资源文件存放路径的映射关系
- 第二个是设置缓存。下述示例中创建了CacheControl对象,保存10天。
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 创建CacheControl对象 CacheControl cacheControl = CacheControl.maxAge(10, TimeUnit.DAYS).noTransform(); // 设置静态资源的请求 registry.addResourceHandler("/resources/**") // 静态资源存放的物理路径 .addResourceLocations("/WEB-INF/js/**","WEB-INF/images/**") // 设置浏览器缓存静态资源的时间 .setCacheControl(cacheControl); }
8、DefaultServlet
DefaultServlet是将/映射为默认的欢迎页面,学习过Servlet的知道,配置默认的欢迎页面是在web.xml中配置welcome-file-list子标签,打开Tomcat服务器的web.xml, 发现它的配置项是index.html, index.jsp, index.htm。
本质是将/映射为index.html或index.jsp或index.htm。
mvc它没有默认的defaultServlet,而是使用Web Server默认的servlet。mvc在其中的作用只是指定默认的servlet为Web server的默认servlet。
示例代码如下:
@Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); }
enable的参数为servlet的名称,可以将自定义的servlet作为默认的servlet,例如TestServlet的名称为testServlet,之后将testServlet作为enable方法的参数。
Enable方法参数指定的servlet必须是存在的,否则会抛出错误。