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


參考文章:https://www.cnblogs.com/daxin/p/3551537.html

多個視圖解析器的配置

在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方法,判斷當前解析器對視圖是否能夠解析。如不能解析在依次調用。

具體使用

單個視圖解析器:

1、springmvc配置文件

     <!-- 3.配置jsp 顯示ViewResolver視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

2、靜態頁面

 3、Controller接口

 可以成功跳轉!

問題,如果jsp頁面不在jsp目錄下,怎么跳轉?

關於springmvc多視圖解析器解析的問題:

假設我現在有兩個jsp頁面,分別在其它的目錄下怎么辦:

1、WEB-INF/A/a.jsp  

2、WEB-INF/B/b.jsp  

controller接口

但是報404,因為jsp目錄下沒有a.jsp這個頁面,顯然返回的視圖名有一開始定義的視圖解析器處理了。

那要如何按照自己的設想進行跳轉呢? 

 

解決方案

最簡單的辦法是使用其viewNames屬性,來指定一個是否可以處理的規則

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

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

如上兩個的意思是對A或B開頭的視圖名進行處理,比如返回的視圖名為A/a(或者A_a) 那么會交給viewNames為A*的那個解析器處理;支持的規則可以查看javadoc。

 

多視圖解析器配置

controller層

SpringMVC配置

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <!--
            支持通配符,如果返回的視圖名的開頭是A,則使用該視圖解析器
            也可以定義為 *A*:表示包含A的
         -->
        <property name="viewNames" value="A*"/>
        <!-- 如果定義為:value="/WEB-INF/A/",返回的視圖名為A/a,會拼接成/WEB-INF/A/A/a.jsp就找不到了 -->
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="viewNames" value="B*"/>
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

 

注意點

新增兩個視圖解析器,注意默認的視圖解析器(就是沒有設置viewNames屬性的),必須放在新增的視圖解析器的后面。

否則返回的頁面還是由默認的視圖解析器解析的,就會導致404。

如果就想要默認的視圖解析器寫在最上面該怎么辦,我們可以通過設置視圖解析器的順序。

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 默認的視圖:不定義順序或者定義的順序要比其他的視圖解析器的order值要大 -->
        <property name="order" value="2"/>
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- viewNames和order屬性需要同時定義,先后順序可隨意-->
        <property name="order" value="1"/>
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <!--
            支持通配符,如果返回的視圖名的開頭是A,則使用該視圖解析器
            也可以定義為 *A*:表示包含A的
         -->
        <property name="viewNames" value="A*"/>
        <!-- 如果定義為:value="/WEB-INF/A/",返回的視圖名為A/a,會拼接成/WEB-INF/A/A/a.jsp就找不到了 -->
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="order" value="1"/>
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="viewNames" value="B*"/>
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

 成功!

 


免責聲明!

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



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