SpringMVC 配置多個檢視解析器遇到的問題
阿新 • • 發佈:2018-12-14
轉自:https://www.cnblogs.com/daxin/p/3551537.html
SpringMVC 多檢視解析器配置以及問題
在SpringMVC模式當中可以通過如下配置來支援多檢視解析
<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。