視圖解析
Spring MVC 定義了 ViewResolver
和 View
介面,讓您可以在瀏覽器中呈現模型,而無需將您綁定到特定的視圖技術。ViewResolver
提供了視圖名稱和實際視圖之間的對應。View
處理在移交給特定視圖技術之前準備資料。
下表提供了有關 ViewResolver
階層的更多詳細資訊
ViewResolver | 描述 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
處理
您可以透過宣告多個解析器 Bean 並在必要時設定 order
屬性以指定順序來鏈結視圖解析器。請記住,order 屬性越高,視圖解析器在鏈中的位置就越晚。
ViewResolver
的契約指定它可以傳回 null 以指示找不到視圖。但是,對於 JSP 和 InternalResourceViewResolver
,判斷 JSP 是否存在的唯一方法是透過 RequestDispatcher
執行分派。因此,您必須始終將 InternalResourceViewResolver
配置為視圖解析器整體順序中的最後一個。
重新導向
視圖名稱中的特殊 redirect:
字首可讓您執行重新導向。UrlBasedViewResolver
(及其子類別) 將其識別為需要重新導向的指令。視圖名稱的其餘部分是重新導向 URL。
網路效果與控制器傳回 RedirectView
相同,但現在控制器本身可以使用邏輯視圖名稱進行操作。邏輯視圖名稱 (例如 redirect:/myapp/some/resource
) 相對於目前的 Servlet Context 重新導向,而名稱 (例如 redirect:https://myhost.com/some/arbitrary/path
) 則重新導向到絕對 URL。
轉發
您也可以對最終由 UrlBasedViewResolver
及其子類別解析的視圖名稱使用特殊的 forward:
字首。這會建立一個 InternalResourceView
,它會執行 RequestDispatcher.forward()
。因此,此字首對於 InternalResourceViewResolver
和 InternalResourceView
(對於 JSP) 沒有用處,但如果您使用另一種視圖技術但仍想強制轉發資源以由 Servlet/JSP 引擎處理,則它可能會有所幫助。請注意,您也可以鏈結多個視圖解析器。
內容協商
ContentNegotiatingViewResolver
本身不解析視圖,而是委派給其他視圖解析器,並選擇與客户端請求的表示形式相似的視圖。表示形式可以從 Accept
標頭或查詢參數 (例如,"/path?format=pdf"
) 判斷。
ContentNegotiatingViewResolver
透過將請求媒體類型與每個 ViewResolvers
關聯的 View
支援的媒體類型 (也稱為 Content-Type
) 進行比較,來選擇適當的 View
來處理請求。列表中第一個具有相容 Content-Type
的 View
會將表示形式傳回給客户端。如果 ViewResolver
鏈無法提供相容的視圖,則會諮詢透過 DefaultViews
屬性指定的視圖列表。後一個選項適用於單例 Views
,無論邏輯視圖名稱為何,它們都可以呈現目前資源的適當表示形式。Accept
標頭可以包含萬用字元 (例如 text/*
),在這種情況下,Content-Type
為 text/xml
的 View
是相容的匹配項。