Spring MVC如何设置多个ViewResolver视图解析器呢?
下文笔者讲述Spring MVC中设置多个ViewResolver的方法分享,如下所示:
InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中
然后使用RequestDispatcher在服务器端把请求forword重定向到目标URL
比如在InternalResourceViewResolver中定义了prefix=/WEB-INF/,suffix=.jsp
当请求的Controller处理器方法返回的视图名称为javatest
则此时InternalResourceViewResolver就会把javatest解析为一个InternalResourceView对象
先把返回的模型属性都存放到对应的HttpServletRequest属性中 然后利用RequestDispatcher在服务器端把请求forword到/WEB-INF/javatest.jsp
ResourceBundleViewResolver和XmlViewResolver一样它也需要有一个配置文件来定义逻辑视图名称和真正的View对象的对应关系
不同的是ResourceBundleViewResolver的配置文件是一个属性文件,而且必须是放在classpath路径下面的
默认情况下这个配置文件是在classpath根目录下的views.properties文件
当不使用默认值的话,则可以通过属性baseName或baseNames来指定
baseName只是指定一个基名称
Spring会在指定的classpath根目录下寻找以指定的baseName开始的属性文件进行View解析
如指定的baseName是base 则base.properties、baseabc.properties等以base开始的属性文件都会被Spring当做ResourceBundleViewResolver解析视图的资源文件
该文件将使用和Spring的bean工厂配置文件一样的DTD定义
该文件就是用来定义视图的bean对象的
该文件中定义的每一个视图的bean对象都给定一个名字
然后XmlViewResolver将根据Controller处理器方法返回的逻辑视图名称到XmlViewResolver指定的配置文件中寻找对应名称的视图bean用于处理视图
该配置文件默认是/WEB-INF/views.xml文件
当不使用默认值的时候可以在XmlViewResolver的location属性中指定它的位置
XmlViewResolver还实现了Ordered接口
因此我们可以通过其order属性来指定在ViewResolver链中它所处的位置,order的值越小优先级越高。
spring 框架为我们提供了很好的支持
只需在[spring-dispatcher-name]-servlet.xml中定义多个ViewResolver即可
Spring MVC常用的ViewResolver
InternalResourceViewResolver
InternalResourceViewResolver会把返回的视图名称都解析为InternalResourceView对象InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中
然后使用RequestDispatcher在服务器端把请求forword重定向到目标URL
比如在InternalResourceViewResolver中定义了prefix=/WEB-INF/,suffix=.jsp
当请求的Controller处理器方法返回的视图名称为javatest
则此时InternalResourceViewResolver就会把javatest解析为一个InternalResourceView对象
先把返回的模型属性都存放到对应的HttpServletRequest属性中 然后利用RequestDispatcher在服务器端把请求forword到/WEB-INF/javatest.jsp
BeanNameViewResolver
BeanNameViewResolver视图解析器同XmlViewResolver有点类似 也是通过把返回的逻辑视图名称去匹配定义好的视图bean对象两者的不同之处 一:BeanNameViewResolver要求视图bean对象都定义在Spring的application context 二:XmlViewResolver是在指定的配置文件中寻找视图bean对象 三:BeanNameViewResolver不会进行视图缓存
ResourceBundleViewResolver
ResourceBundleViewResolver和XmlViewResolver一样,也是继承自AbstractCachingViewResolver,但是它缓存的不是视图ResourceBundleViewResolver和XmlViewResolver一样它也需要有一个配置文件来定义逻辑视图名称和真正的View对象的对应关系
不同的是ResourceBundleViewResolver的配置文件是一个属性文件,而且必须是放在classpath路径下面的
默认情况下这个配置文件是在classpath根目录下的views.properties文件
当不使用默认值的话,则可以通过属性baseName或baseNames来指定
baseName只是指定一个基名称
Spring会在指定的classpath根目录下寻找以指定的baseName开始的属性文件进行View解析
如指定的baseName是base 则base.properties、baseabc.properties等以base开始的属性文件都会被Spring当做ResourceBundleViewResolver解析视图的资源文件
XmlViewResolver
XmlViewResolver需要给定一个xml配置文件该文件将使用和Spring的bean工厂配置文件一样的DTD定义
该文件就是用来定义视图的bean对象的
该文件中定义的每一个视图的bean对象都给定一个名字
然后XmlViewResolver将根据Controller处理器方法返回的逻辑视图名称到XmlViewResolver指定的配置文件中寻找对应名称的视图bean用于处理视图
该配置文件默认是/WEB-INF/views.xml文件
当不使用默认值的时候可以在XmlViewResolver的location属性中指定它的位置
XmlViewResolver还实现了Ordered接口
因此我们可以通过其order属性来指定在ViewResolver链中它所处的位置,order的值越小优先级越高。
Spring MVC设置多个ViewResolver视图解析器
当我们需要多个viewResolver的时候spring 框架为我们提供了很好的支持
只需在[spring-dispatcher-name]-servlet.xml中定义多个ViewResolver即可
<!-- 定义JSP视图解析器--> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/"></property> <property name="suffix" value=".jsp"></property> <property name="order" value="1" /> </bean> <bean id="freemarkerViewResolver" class="com.founder.web.commom.springmvc.view.ExtFreeMarkerViewResolver"> <property name="contentType" value="text/html; charset=UTF-8"/> <property name="exposeRequestAttributes" value="false"/> <property name="exposeSessionAttributes" value="false"/> <property name="exposeSpringMacroHelpers" value="true"/> <property name="cacheUnresolved" value="false"/> <property name="order" value="0" /> </bean>例
1.新建一个html的解析器并继承 InternalResourceView 后重写 checkResource package com.java265.common.springmvc.view; import java.io.File; import java.util.Locale; import org.springframework.web.servlet.view.InternalResourceView; public class HtmlResourceView extends InternalResourceView { @Override public boolean checkResource(Locale locale) { File file = new File(this.getServletContext().getRealPath("/") + getUrl()); return file.exists();// 判断该页面是否存在 } } 2. 在xml配置文件中 指定解析器的 viewClass为该解析类 <bean id="htmlviewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="com.java265.common.springmvc.view.HtmlResourceView"/> <property name="order" value="0" /> <property name="prefix" value="/test/"/> <property name="suffix" value=".html" /> <property name="contentType" value="text/html;charset=UTF-8"></property> </bean> <!-- 定义JSP文件的位置 --> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="order" value="1" /> <property name="prefix" value="/views/"/> <property name="suffix" value=".jsp"/> </bean>
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。