多個視圖解析器的配置
在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
但是報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>
成功!