【Web开发】Spring MVC 中的视图解析机制

101 阅读1分钟

视图解析的实现基础

视图解析器(ViewResolver)是 Spring MVC 的重要组成部分,负责将逻辑视图名解析为具体的视图对象。
Spring MVC 提供了很多视图解析类,其中每一项都对应 Java Web 应用中特定的某些视图技术。

viewResolver组件会将viewName解析成view对象,view对象会调用render完成结果的处理。

  • ViewResolver 与 View 接⼝

    • AbstractCachingViewResolver

      • UrlBasedViewResolver

        • FreeMarkerViewResolver
        • InternalResourceViewResolver
      • ContentNegotiatingViewResolver 根据请求文件名或Accept头解析视图。

一些可参阅的博客:

c.biancheng.net/spring_mvc/…

blog.csdn.net/fengyuhan12…

DispatcherServlet 中的视图解析逻辑

  • initStrategies()

    • initViewResolvers() 初始化了对应 ViewResolver
  • doDispatch()

    • processDispatchResult()
    • 没有返回视图的话,尝试 RequestToViewNameTranslator
    • resolveViewName() 解析 View 对象

一些可参阅的博客:

blog.csdn.net/u013541707/…

使⽤ @ResponseBody 的情况

  • 在 HandlerAdapter.handle() 的中完成了 Response 输出

    • RequestMappingHandlerAdapter.invokeHandlerMethod()

      • HandlerMethodReturnValueHandlerComposite.handleReturnValue()

      • RequestResponseBodyMethodProcessor.handleReturnValue()

转发与重定向

  • redirect: 重定向
  • forward: 转发

Spring MVC 中的常⽤视图

Spring MVC ⽀持的视图

官方文档:docs.spring.io/spring-fram…

⽀持的视图列表:

  • 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.” – 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