SpringMVC 多視圖解析器配置以及問題


在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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM