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 数据封装到即将要显示的页面上,最终展示给用户。