一、概述
视图解析器(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;
}
}