Spring MVC如何设置多个ViewResolver视图解析器呢?

java-教程王 SpringMVC 发布时间:2022-01-01 09:34:55 阅读数:12519 1
下文笔者讲述Spring MVC中设置多个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>  
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringMVC/202201/2112.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者