spring_reference/IX. ‘How-to’ guides/65.8. Customize ViewResolve...

4.7 KiB
Raw Blame History

65.8. 自定义ViewResolvers

ViewResolver是Spring MVC的核心组件它负责转换@Controller中的视图名称到实际的View实现。注意ViewResolvers主要用在UI应用中而不是REST风格的服务View不是用来渲染@ResponseBody。Spring有很多你可以选择的ViewResolver实现并且Spring自己对如何选择相应实现也没发表意见。另一方面Spring Boot会根据classpath上的依赖和应用上下文为你安装一或两个ViewResolver实现。DispatcherServlet使用所有在应用上下文中找到的解析器resolvers并依次尝试每一个直到它获取到结果所以如果你正在添加自己的解析器那就要小心顺序和你的解析器添加的位置。

WebMvcAutoConfiguration将会为你的上下文添加以下ViewResolvers

  • bean id为defaultViewResolver的InternalResourceViewResolver。这个会定位可以使用DefaultServlet渲染的物理资源比如静态资源和JSP页面。它在视图view name上应用了一个前缀和后缀默认都为空但你可以通过spring.view.prefixspring.view.suffix外部配置设置然后查找在servlet上下文中具有该路径的物理资源。可以通过提供相同类型的bean覆盖它。
  • id为beanNameViewResolver的BeanNameViewResolver。这是视图解析器链的一个非常有用的成员它可以在View被解析时收集任何具有相同名称的beans。
  • id为viewResolver的ContentNegotiatingViewResolver只会在实际View类型的beans出现时添加。这是一个'主'解析器,它的职责会代理给其他解析器,它会尝试找到客户端发送的一个匹配'Accept'的HTTP头部。这有一篇有用的关于你需要更多了解的ContentNegotiatingViewResolver的博客,也要具体查看下源码。通过定义一个名叫'viewResolver'的bean你可以关闭自动配置的ContentNegotiatingViewResolver。
  • 如果使用Thymeleaf你将有一个id为thymeleafViewResolver的ThymeleafViewResolver。它会通过加前缀和后缀的视图名来查找资源外部配置为spring.thymeleaf.prefixspring.thymeleaf.suffix,对应的默认为'classpath:/templates/'和'.html'。你可以通过提供相同名称的bean来覆盖它。
  • 如果使用FreeMarker你将有一个id为freeMarkerViewResolver的FreeMarkerViewResolver。它会使用加前缀和后缀外部配置为spring.freemarker.prefixspring.freemarker.suffix,对应的默认值为空和'.ftl')的视图名从加载路径(外部配置为spring.freemarker.templateLoaderPath,默认为'classpath:/templates/'下查找资源。你可以通过提供一个相同名称的bean来覆盖它。
  • 如果使用Groovy模板实际上只要你把groovy-templates添加到classpath下你将有一个id为groovyTemplateViewResolver的Groovy TemplateViewResolver。它会使用加前缀和后缀外部属性为spring.groovy.template.prefixspring.groovy.template.suffix,对应的默认值为'classpath:/templates/'和'.tpl'的视图名从加载路径下查找资源。你可以通过提供一个相同名称的bean来覆盖它。
  • 如果使用Velocity你将有一个id为velocityViewResolver的VelocityViewResolver。它会使用加前缀和后缀外部属性为spring.velocity.prefixspring.velocity.suffix,对应的默认值为空和'.vm')的视图名从加载路径(外部属性为spring.velocity.resourceLoaderPath,默认为'classpath:/templates/'下查找资源。你可以通过提供一个相同名称的bean来覆盖它。

具体参考: WebMvcAutoConfigurationThymeleafAutoConfigurationFreeMarkerAutoConfigurationGroovyTemplateAutoConfigurationVelocityAutoConfiguration