SpringMVC(三)视图解析器(ViewResolver)

一、概述

视图解析器(ViewResolver)是Spring MVC重要组成部分,负责将逻辑视图名称解析为具体视图对象。

1.1、URLBasedViewResolver

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

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

<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>

上述视图解析器配置了前缀和后缀两个属性,这样缩短了view路径,控制类返回视图路径仅需要提供register和login,视图解析器会自动添加前缀和后缀,将其解析为/WEB-INF/jsp/register.jsp和/WEB-INF/jsp/login.jsp.

上述viewClass 值为 InternalResourceViewResolver,它用来展示JSP页面。如果需要使用jstl标签展示数据,将viewClass属性值指定为JstlView即可。

另外,存放在/WEB-INF/目录下的内容不能直接通过request请求得到,所以为了安全性考虑,通常把jsp文件放在WEB-INF目录下。

1.2、InternalResourceViewResolver

内部资源视图解析器,是日常开发中最常用的视图解析器类型。它是URLBasedViewResolver的子类,拥有URLBasedViewResolver的一切特性。

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

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <!--前缀-->
    <property name="prefix" value="/WEB-INF/jsp/" />
    <!--后缀-->
    <property name="suffix" value=".jsp" />
</bean>

1.3、FreeMarkerViewResolver

FreeMarkerViewResolver 是 UrlBasedViewResolver的子类,可以通过prefix属性指定前缀,可以通过suffix属性指定后缀。

FreeMarkerViewResolver最终会解析逻辑视图配置,返回feemarker模板。不需要指定viewClass属性。

<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="prefix" value="fm_"/>
    <property name="suffix" value=".ftl" />
</bean>

<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPath" value="/WEB-INF/ftl" />
</bean>
@Controller
@RequestMapping("viewtest")
public class TestController { 
    @RequestMapping("freemarker")
    public ModelAndView freemarker(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("username","JSONLiu");
        mv.setViewName("freemarker");
        return mv;
    } 
}
上一篇:正则表达式[^]、([^]*)表示什么意思


下一篇:300行代码手写SpringMVC