6.2、串連ViewResolver(Chaining ViewResolvers)

行一發表於2016-09-29

  Spring 支援多個檢視解析器。因此,你可以串連解析器,並且在特定的情況下重寫指定檢視。你可以通過在應用程式上下文中新增多個檢視解析器來把它們串連起來,並且如果有必要的話,也可以設定 order 屬性來指定順序。注意,order 屬性值越大,檢視解析器在鏈中的位置越靠後。

  在下面的例子中,檢視解析器鏈由兩個解析器組成:InternalResourceViewResolver 永遠都被自動放到解析器鏈的末端;XmlViewResolver 用於指定 Excel 檢視。InternalResourceViewResolver 不支援 Excel 檢視。

<bean id="jspViewResolver" 
      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>

<bean id="excelViewResolver" 
      class="org.springframework.web.servlet.view.XmlViewResolver">
    <property name="order" value="1"/>
    <property name="location" value="/WEB-INF/views.xml"/>
</bean>
<!-- in views.xml -->
<beans>
    <bean name="report" class="org.springframework.example.ReportExcelView"/>
</beans>

  如果一個檢視解析器沒有找到檢視,Spring 就會檢查上下文中的其他檢視解析器。如果有其他檢視解析器存在,繼續用它們尋找檢視,直到找到一個檢視位置。如果最終也找不到檢視,Spring 會丟擲一個 ServletException。

  檢視解析器約定指出,一個檢視可以返回 null 來指定找不到的檢視。不是所有的檢視解析器都這麼做,因為在一些情況下,檢視不能簡單地檢測檢視是否存在。例如,InternalResourceViewResolver 在內部使用 RequestDispatcher,排程(dispatching)是計算 JSP 是否存在的唯一方法,但是這個動作只能執行一次。這中情況在 FreeMarkerViewResolver 和其他檢視中也存在。可以在特定檢視解析器的 JavaDoc 中檢視它是否報告不存在的檢視。所以,把 InternalResourceViewResolver 放在鏈中的某個地方而不是最後,因為 InternalResourceViewResolver 總會返回一個檢視!

相關文章