視圖解析

Spring MVC 定義了 ViewResolverView 介面,讓您可以在瀏覽器中呈現模型,而無需將您綁定到特定的視圖技術。ViewResolver 提供了視圖名稱和實際視圖之間的對應。View 處理在移交給特定視圖技術之前準備資料。

下表提供了有關 ViewResolver 階層的更多詳細資訊

表 1. ViewResolver 實作
ViewResolver 描述

AbstractCachingViewResolver

AbstractCachingViewResolver 的子類別快取它們解析的視圖實例。快取可提高某些視圖技術的效能。您可以透過將 cache 屬性設定為 false 來關閉快取。此外,如果您必須在執行階段重新整理特定視圖 (例如,當 FreeMarker 範本被修改時),您可以使用 removeFromCache(String viewName, Locale loc) 方法。

UrlBasedViewResolver

ViewResolver 介面的簡單實作,可直接將邏輯視圖名稱解析為 URL,而無需明確的對應定義。如果您的邏輯名稱以直接的方式與您的視圖資源名稱相符,而無需任意對應,則此方法適用。

InternalResourceViewResolver

UrlBasedViewResolver 的便利子類別,支援 InternalResourceView (實際上是 Servlet 和 JSP) 以及子類別,例如 JstlView。您可以使用 setViewClass(..) 為此解析器產生的所有視圖指定視圖類別。請參閱 UrlBasedViewResolver javadoc 以取得詳細資訊。

FreeMarkerViewResolver

UrlBasedViewResolver 的便利子類別,支援 FreeMarkerView 和它們的自訂子類別。

ContentNegotiatingViewResolver

ViewResolver 介面的實作,根據請求檔名或 Accept 標頭解析視圖。請參閱 內容協商

BeanNameViewResolver

ViewResolver 介面的實作,將視圖名稱解譯為目前應用程式 Context 中的 Bean 名稱。這是一個非常彈性的變體,允許根據不同的視圖名稱混合和匹配不同的視圖類型。每個此類 View 都可以定義為 Bean,例如,在 XML 或配置類別中。

處理

您可以透過宣告多個解析器 Bean 並在必要時設定 order 屬性以指定順序來鏈結視圖解析器。請記住,order 屬性越高,視圖解析器在鏈中的位置就越晚。

ViewResolver 的契約指定它可以傳回 null 以指示找不到視圖。但是,對於 JSP 和 InternalResourceViewResolver,判斷 JSP 是否存在的唯一方法是透過 RequestDispatcher 執行分派。因此,您必須始終將 InternalResourceViewResolver 配置為視圖解析器整體順序中的最後一個。

配置視圖解析就像將 ViewResolver Bean 新增到您的 Spring 配置一樣簡單。MVC 配置視圖解析器 和新增無邏輯 視圖控制器 提供了專用的配置 API,這些視圖控制器對於在沒有控制器邏輯的情況下呈現 HTML 範本非常有用。

重新導向

視圖名稱中的特殊 redirect: 字首可讓您執行重新導向。UrlBasedViewResolver (及其子類別) 將其識別為需要重新導向的指令。視圖名稱的其餘部分是重新導向 URL。

網路效果與控制器傳回 RedirectView 相同,但現在控制器本身可以使用邏輯視圖名稱進行操作。邏輯視圖名稱 (例如 redirect:/myapp/some/resource) 相對於目前的 Servlet Context 重新導向,而名稱 (例如 redirect:https://myhost.com/some/arbitrary/path) 則重新導向到絕對 URL。

轉發

您也可以對最終由 UrlBasedViewResolver 及其子類別解析的視圖名稱使用特殊的 forward: 字首。這會建立一個 InternalResourceView,它會執行 RequestDispatcher.forward()。因此,此字首對於 InternalResourceViewResolverInternalResourceView (對於 JSP) 沒有用處,但如果您使用另一種視圖技術但仍想強制轉發資源以由 Servlet/JSP 引擎處理,則它可能會有所幫助。請注意,您也可以鏈結多個視圖解析器。

內容協商

ContentNegotiatingViewResolver 本身不解析視圖,而是委派給其他視圖解析器,並選擇與客户端請求的表示形式相似的視圖。表示形式可以從 Accept 標頭或查詢參數 (例如,"/path?format=pdf") 判斷。

ContentNegotiatingViewResolver 透過將請求媒體類型與每個 ViewResolvers 關聯的 View 支援的媒體類型 (也稱為 Content-Type) 進行比較,來選擇適當的 View 來處理請求。列表中第一個具有相容 Content-TypeView 會將表示形式傳回給客户端。如果 ViewResolver 鏈無法提供相容的視圖,則會諮詢透過 DefaultViews 屬性指定的視圖列表。後一個選項適用於單例 Views,無論邏輯視圖名稱為何,它們都可以呈現目前資源的適當表示形式。Accept 標頭可以包含萬用字元 (例如 text/*),在這種情況下,Content-Typetext/xmlView 是相容的匹配項。

請參閱 視圖解析器,位於 MVC 配置 下,以取得配置詳細資訊。