1. 程式人生 > >SpringMVC中支持多視圖解析

SpringMVC中支持多視圖解析

存在 會有 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中支持多視圖解析