SpringMVC-05-视图解析器(ViewResolver)

2.5 View Resolver
  • 视图解析器(ViewResolver)是 Spring MVC 的重要组成部分,将逻辑视图名解析为具体的视图对象xxxView,这个视图对象,之后把这个对象交到前端控制器与model数据进行试图渲染,成为真正的视图。

  • Spring MVC 提供了很多视图解析类

UrlBasedViewResolver

InternalResourceViewResolver 是UrlBasedViewResolver的子类

FreeMarkerViewResolver是 UrlBasedViewResolver 的子类

2.5.1 UrlBasedViewResolver
  • UrlBasedViewResolver 是对 ViewResolver 的一种简单实现,主要提供了一种拼接 URL 的方式来解析视图。

  • UrlBasedViewResolver 通过 prefix 属性指定前缀,suffix 属性指定后缀。当 ModelAndView 对象返回具体的 View 名称时,它会将前缀 prefix 和后缀 suffix 与具体的视图名称拼接,得到一个视图资源文件的具体加载路径,从而加载真正的视图文件并反馈给用户。

示例:prefix="/WEB-INF/jsp/", suffix=".jsp", viewname="test" → "/WEB-INF/jsp/test.jsp"
  • 作为一项特殊功能,可以通过“redirect:”前缀指定重定向 URL。例如:“redirect:myAction”将触发到给定 URL 的重定向,而不是作为标准视图名称的解析。这通常用于在完成表单工作流程后重定向到控制器 URL。

  • 通过“forward:”前缀指定转发 URL。例如:“forward:myAction”将触发对给定 URL 的转发,而不是作为标准视图名称解析。这通常用于控制器 URL;它不应该用于 JSP URL - 在那里使用逻辑视图名称。

  • 此解析器生成的所有视图的视图类可以通过“viewClass”属性指定,一般是具体类型的InternalResourceViewResolver或FreeMarkerViewResolver。viewClass不可以省略。

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">            
    <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceViewResolver"/> <!--不能省略-->
    <!--前缀-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--后缀-->
    <property name="suffix" value=".jsp"/>  
 </bean>
2.5.2 InternalResourceViewResolver
  • InternalResourceViewResolver 为“内部资源视图解析器”,是日常开发中最常用的视图解析器类型。它是 URLBasedViewResolver 的子类。

InternalResourceViewResolver 能自动将返回的视图名称解析为 InternalResourceView 类型的对象。InternalResourceView 会把 Controller 处理器方法返回的模型属性都存放到对应的 request 属性中,然后通过 RequestDispatcher 在服务器端把请求 forword 重定向到目标 URL。也就是说,使用 InternalResourceViewResolver 视图解析时,无需再单独指定 viewClass 属性。

InternalResourceViewResolver的工作方式是以项目的根路径为参考(在开发时,对应的是webapp文件夹),使用前缀+视图组件名+后缀得到视图文件的位置,例如实际存在的jsp文件是webapp/WEB-INF/helloworld.jsp,由于它本身使用webapp作为根级,所以,前缀是/WEB-INF/,后缀是.jsp,结合控制器返回的"helloworld"进行拼接,就可以得到以上路径,从而确定视图组件的位置,

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--前缀-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--后缀-->
    <property name="suffix" value=".jsp"/>  
 </bean>
2.5.3 FreeMarkerViewResolver
  • FreeMarkerViewResolver 是 UrlBasedViewResolver 的子类,可以通过 prefix 属性指定前缀,通过 suffix 属性指定后缀
  • FreeMarkerViewResolver 最终会解析逻辑视图配置,返回 freemarker 模板。不需要指定 viewClass 属性。
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="prefix" value="fm_"/>
    <property name="suffix" value=".ftl"/>
</bean>
  • FreeMarkerView 类型最终生成的实体视图(模板文件)的路径以及其他配置。需要给 FreeMarkerViewResolver 设置一个 FreeMarkerConfig 的 bean 对象来定义 FreeMarker 的配置信息
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPath" value="/WEB-INF/ftl" />
</bean>
  • 这块用templateLoaderPath 指定了 FreeMarker 模板文件的具体位置,若模板位于不同的路径时,可以配置 templateLoaderPath 属性,来指定多个资源路径。

执行过程:

当 FreeMarkerViewResolver 拿到 ModelAndView 对象,解析逻辑视图信息时,会生成一个 URL 为“前缀+视图名+后缀”(这里即“fm_freemarker.ftl”)的 FreeMarkerView 对象,然后通过 FreeMarkerConfigurer 的配置找到 templateLoaderPath 对应文本文件的路径,在该路径下找到该文本文件,从而 FreeMarkerView 就可以利用该模板文件进行视图的渲染,并将 model 数据封装到即将要显示的页面上,最终展示给用户。

下一篇:SpringMVC-06-使用@Controller、@RequestMapping注解开发
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值