视图解析的实现基础
视图解析器(ViewResolver
)是 Spring MVC 的重要组成部分,负责将逻辑视图名解析为具体的视图对象。
Spring MVC 提供了很多视图解析类,其中每一项都对应 Java Web 应用中特定的某些视图技术。
viewResolver
组件会将viewName解析成view
对象,view对象会调用render
完成结果的处理。
-
ViewResolver 与 View 接⼝
-
AbstractCachingViewResolver
-
UrlBasedViewResolver
- FreeMarkerViewResolver
- InternalResourceViewResolver
-
ContentNegotiatingViewResolver 根据请求文件名或Accept头解析视图。
-
-
一些可参阅的博客:
http://c.biancheng.net/spring_mvc/view-resolver.html
https://blog.youkuaiyun.com/fengyuhan123/article/details/79723310
DispatcherServlet 中的视图解析逻辑
-
initStrategies()
- initViewResolvers() 初始化了对应 ViewResolver
-
doDispatch()
- processDispatchResult()
- 没有返回视图的话,尝试 RequestToViewNameTranslator
- resolveViewName() 解析 View 对象
一些可参阅的博客:
https://blog.youkuaiyun.com/u013541707/article/details/108511017
使⽤ @ResponseBody 的情况
-
在 HandlerAdapter.handle() 的中完成了 Response 输出
-
RequestMappingHandlerAdapter.invokeHandlerMethod()
-
HandlerMethodReturnValueHandlerComposite.handleReturnValue()
-
RequestResponseBodyMethodProcessor.handleReturnValue()
-
-
转发与重定向
- redirect: 重定向
- forward: 转发
Spring MVC 中的常⽤视图
Spring MVC ⽀持的视图
⽀持的视图列表:
- Jackson-based JSON / XML
- Thymeleaf & FreeMarker
配置 HttpMessageConverter
在之前的RequestMapping的Handler也有提到过Converter,在视图的部分也有自己对应的HttpMessageConverter
- 通过 WebMvcConfigurer 的 configureMessageConverters()
- Spring Boot ⾃动查找 HttpMessageConverter 进⾏注册
Spring Boot 对 Jackson 的⽀持
-
JacksonAutoConfiguration
- Spring Boot 通过 @JsonComponent 注册 JSON 序列化组件
- Jackson2ObjectMapperBuilderCustomizer
-
JacksonHttpMessageConvertersConfiguration
- 增加 jackson-dataformat-xml 以⽀持 XML 序列化
Thymeleaf
“Thymeleaf is a modern server-side Java template engine for both web and standalone environments.” – https://www.thymeleaf.org/
-
添加 Thymeleaf 依赖
- org.springframework.boot:spring-boot-starter-thymeleaf
-
Spring Boot 的⾃动配置
- ThymeleafAutoConfiguration
- ThymeleafViewResolver
-
Thymeleaf 的⼀些默认配置
- spring.thymeleaf.cache=true
- spring.thymeleaf.check-template=true
- spring.thymeleaf.check-template-location=true
- spring.thymeleaf.enabled=true
- spring.thymeleaf.encoding=UTF-8
- spring.thymeleaf.mode=HTML
- spring.thymeleaf.servlet.content-type=text/html
- spring.thymeleaf.prefix=classpath:/templates/
- spring.thymeleaf.suffix=.html