Spring Web MVC 多viewResolver视图解析器解决方案

25人阅读 评论(0) 收藏 举报
分类:

viewResolver的定义如下:

public interface ViewResolver {  
   View resolveViewName(String viewName, Locale locale) throws Exception;  
}

在spring 中,常用的ViewResolver 有如下几种:

InternalResourceViewResolver 将逻辑视图名字解析为一个路径
BeanNameViewResolver 将逻辑视图名字解析为bean的Name属性,从而根据name属性,找定义View的bean
ResourceBundleResolver 和BeanNameViewResolver一样,只不过定义的view-bean都在一个properties文件中,用这个类进行加载这个properties文件
XmlViewResolver 和ResourceBundleResolver一样,只不过定义的view-bean在一个xml文件中,用这个类来加载xml文件

 

当我们需要多个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>

DispatcherServlet会加载所有的viewResolver到一个list中,并按照优先级进行解析。

注意:①order中的值越小,优先级越高。

②而id为viewResolver的viewResolver的优先级是最低的。

PS:

如果某个解析器没有找到合适的视图,Spring会在上下文中寻找是否配置了其它的解析器。 如果有,它会继续进行解析,否则,Srping会抛出一个Exception


要记住,当一个视图解析器找不到合适的视图时,它可能 返回null值。 但是,不是每个解析器都这么做。这是因为,在某些情况下,解析器可能无法侦测出符合要求的视图是否存在。 比如,InternalResourceViewResolver在内部调用了RequestDispatcher。 请求分发是检查一个JSP文件是否存在的唯一方法,不幸的是,这个方法只能用一次。 同样的问题在VelocityViewResolver和其它解析器中也有。 当使用这些解析器时,最好仔细阅读它们的Javadoc,看看需要的解析器是否无法发现不存在的视图。 这个问题产生的副作用是,如果InternalResourceViewResolver解析器没有放在链的末端, InternalResourceViewResolver后面的那些解析器根本得不到使用, 因为InternalResourceViewResolver总是返回一个视图!

如何解决这个问题呢?
第一种方法:把order的值修改下,把InternalResourceViewResolver的order改成最大的,即最后解析让其他的会check文件是否存在的解析器先运行。
第二种方法:自定义一个view类继承JstlView,自己写一个checkResource将父类的的checkResource override掉。代码如下:

    public boolean checkResource(Locale locale) throwsException {
        File file = new File(this.getServletContext().getRealPath("/") + getUrl());
        return file.exists();//判断该jsp页面是否存在

    }
查看评论

springMVC源码解析--ViewResolver视图解析器执行(三)

之前两篇博客 springMVC源码分析--ViewResolver视图解析器(一)和 springMVC源码解析--ViewResolverComposite视图解析器集合(二)中我们已经简单介绍了...
  • qq924862077
  • qq924862077
  • 2017-01-16 18:50:00
  • 1412

Spring MVC 视图解析器(ViewResolver )

我们在controller里面经常这样return一个ModelAndView: return new ModelAndView('user', 'model', model); Dispatche...
  • superdog007
  • superdog007
  • 2014-06-06 09:57:51
  • 42099

springmvc如何设置多个同类型的视图器(springmvc 多个 ViewResolver)

再做页面静态化处理时,有时候我们需要 两种或者两种以上的视图解析方式,比如 jsp,html,json,jstl,ftl等等,显然默认的 springmvc 只配置一种视图解析方式是满足不了我们的,但...
  • Mr_LeeHY
  • Mr_LeeHY
  • 2017-05-20 11:11:00
  • 618

springmvc如何设置多视图器,springmvc 多个 ViewResolver

springmvc如何设置多视图器,springmvc 多个 ViewResolver
  • cai_chinasoft
  • cai_chinasoft
  • 2016-06-08 10:53:01
  • 28033

springMVC源码分析--ViewResolver视图解析器(一)

SpringMVC用于处理视图最重要的两个接口是ViewResolver和View。ViewResolver的主要作用是把一个逻辑上的视图名称解析为一个真正的视图,SpringMVC中用于把View对...
  • qq924862077
  • qq924862077
  • 2017-01-16 18:48:39
  • 1213

SpringMVC之视图解析器(ViewResolver)

SpringMVC中的视图解析器的主要作用就是将逻辑视图转换成用户可以看到的物理视图。 当用户对SpringMVC应用程序发起请求时,这些请求都会被SpringMVC的DispatcherServl...
  • u012369373
  • u012369373
  • 2017-08-24 14:51:25
  • 1046

SpringMVC框架的视图解析器ViewResolver想用html不用jsp的spring-mvc.xml文件配置

在学习SpringMVC框架的搭建过程中因为前端想用html页面,但是一直报404,百度了很多视图解析器的配置都是对jsp的配置,特在此记录下改为html的配置方法:        &amp;lt;!...
  • qq_27635167
  • qq_27635167
  • 2018-02-25 18:22:24
  • 117

SpringMVC配置JSON、JSP、FreeMark多视图解析器配置

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring...
  • dearsny
  • dearsny
  • 2015-04-25 21:58:20
  • 4027

SpringMVC与Freemarker的集成以及多视图解析器配置

一、Spring MVC视图解析器 视图解析器的工作流程大致是这样的:Controller的某个方法执行完成以后,返回一个视图(比如:listUser),视图解析器要做的工作就是找到某个对象 来完...
  • Victor_Cindy1
  • Victor_Cindy1
  • 2015-06-07 17:53:48
  • 6484

13.SpringMVC 视图解析 - ViewResolver

基本概念所有的 MVC 框架都有一套它自己的解析视图的机制,springmvc 也不例外,它使用ViewResolver 进行视图解析,让用户在浏览器中渲染模型。Springmvc 处理视图最重要的两...
  • u012420654
  • u012420654
  • 2016-08-16 21:55:55
  • 5232
    个人资料
    持之以恒
    等级:
    访问量: 16万+
    积分: 3714
    排名: 1万+
    博客专栏