1. 程式人生 > >SpringMVC 配置多個檢視解析器遇到的問題

SpringMVC 配置多個檢視解析器遇到的問題

轉自: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。