Spring多视图配置

来源:互联网 发布:网络交易管理办法解读 编辑:程序博客网 时间:2024/06/05 05:14

在SpringMVC模式当中可以通过如下配置来支持多视图解析

    <!-- jsp jstl -->    <bean id="JSPViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>        <property name="viewNames" value="*jsp" />        <property name="contentType" value="text/html; charset=utf-8"/>          <property name="prefix" value="/" />        <property name="suffix" value="" />        <property name="order" value="1"></property>    </bean>
    <bean id="FMViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">        <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>        <property name="viewNames" value="*html" />        <property name="contentType" value="text/html; charset=utf-8"/>        <property name="cache" value="true" />        <property name="prefix" value="/" />        <property name="suffix" value="" />        <property name="order" value="0"></property>    </bean>

首先可以使用order属性进行设置 系统首先按解析器的order值进行查找 首先使用FreeMarkerViewResolver解析器调用canHandle方法,判断当前解析器对视图是否能够解析。如不能解析在依次调用。

最近被问到过几次关于springmvc多视图解析器解析的问题;总结一下。

假设我有两个jsp:

1 WEB-INF/html/a.jsp  

2 WEB-INF/report/b.jsp  

且我配置了视图解析器:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="1">      <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>      <property name="contentType" value="text/html"/>      <property name="prefix" value="/WEB-INF/html/"/>      <property name="suffix" value=".jsp"/>  </bean>    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="2">      <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>      <property name="contentType" value="text/html"/>      <property name="prefix" value="/WEB-INF/report/"/>      <property name="suffix" value=".jsp"/>  </bean>  

然后呢,我分别返回视图名为a和b;为什么a能找到,而b的时候是404;我配置了两个视图解析器,第一个找不到的话,第二个能找到啊?遇到过这个问题的朋友基本上会有类似的问题;

分析

此处我们使用了InternalResourceViewResolver,其有一个buildView方法,该方法一定会创建一个View;所以呢View永远不为null(即使该jsp不存在);问题就是出在这;因为我们使用这个的时候默认是使用servlet forward转发的,此时并不知道该jsp是否存在。

解决方案

最简单的办法是使用其viewNames属性,来指定一个是否可以处理的规则

<property name= "viewNames" value= "html*" />

<property name= "viewNames" value= "report*" />

如上两个的意思是对html或report开头的视图名进行处理,比如返回的视图名为html/a 那么会交给viewNames为html*的那个解析器处理;支持的规则可以查看javadoc。

NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config

 
使用spring3.05 mvc进行开发,使用tomcat容器,通过url映射寻找view的时候,会报错NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config,如果随便去找个jstl包过来放入web-inf/lib会报错,正确的下载地址在这里,下载jakarta-taglibs-standard-1.1.2.zip这个包,解压缩后将standard和jstl两个包放入lib下即可


0 0