SpringMVC中支持多視圖解析
阿新 • • 發佈:2018-09-04
存在 會有 ram view ref back 能夠 ase weight
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/suo082407128/article/details/70173301
在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*,report*" />
如上兩個的意思是對html或report開頭的視圖名進行處理,比如返回的視圖名為html/a 那麽會交給viewNames為html*的那個解析器處理;
SpringMVC中支持多視圖解析