天天看點

Spring 視圖和視圖解析器簡介

spring mvc(model view controller)是 spring 中一個重要的組成部分,而 spring 視圖和視圖解析器則是 spring mvc 中的組成部分。在介紹 spring 視圖和視圖解析器前,我們先了解下在 spring mvc 架構中,一個 web 請求所需經曆的六個階段:

請求會首先被 spring mvc 的前端請求分發器(dispatcher)攔截。該攔截器是一個 servlet, 需要在 web.xml 中配置,所有符合所配置的 url 樣式的通路請求,将都會被該攔截器攔截。spring 提供了預設的分發器 org.springframework.web.servlet.dispatcherservlet,您可以根據需要,決定是否需要定制自己的分發器。

在接收到通路請求後,分發器會根據開發人員在 spring 配置檔案或代碼中的注解(annotation),來查找合适的控制器。

分發器在查找到合适的控制器後,将請求轉交給該控制器處理。

通常,控制器會調用相應服務類來處理業務邏輯,在将請求處理後,控制器需傳回處理後的結果資料模型(model)以及下一個需要顯示的視圖名。

在控制器處理結束并傳回模型和視圖名之後,spring 會依次調用 spring 容器中所注冊的視圖解析器,來查找符合條件的視圖。

在獲得 spring 視圖後,spring 會根據該視圖的配置資訊,顯示該視圖。

圖 1.spring mvc 處理流程

Spring 視圖和視圖解析器簡介

通過以上 spring mvc 的介紹,我們可以發現,視圖和視圖解析器将出現在整個請求處理流程中的最後部分。那麼到底什麼是視圖和視圖解析器?簡而言之,視圖是指 spring mvc 中的 v(view),而視圖解析器的功能則是依據指定的規則來查找相應的視圖。

在開發中,視圖通常就是 jsp、velocity 等。spring 預設提供了多種視圖解析器,比如,我們可以使用最常用解析器 internalresourceviewresolver 來查找 jsp 視圖(與之相對應的視圖類為 internalresourceview)。通常,一個視圖解析器隻能查找一個或多個特定類型的視圖,在遇到 spring 不支援的視圖或者我們要自定義視圖查找規則的情況下,我們就可以通過擴充 spring 來自定義自己所需的視圖解析器。目前,視圖解析器都需要實作接口 org.springframework.web.servlet.viewresolver, 它包含方法 resolveviewname,該方法會通過視圖名查找并傳回 spring 視圖對象。表 1 列出了常用的 spring 視圖解析器。

表 1.spring 常用視圖解析器清單

視圖解析器

描述

xmlviewresolver

接口 viewresolver 的實作,從 xml 配置檔案中查找視圖實作(預設 xml 配置檔案為 /web-inf/views.xml)

resourcebundleviewresolver

接口 viewresolver 的實作,用于從 properties 檔案中查找視圖。

urlbasedviewresolver

接口 viewresolver 的實作,用于根據請求的 url 路徑傳回相應的視圖,該視圖需為抽象類 abstracturlbasedview 的實作,它還有些子類,如 internalresourceview 和 jstlview 等 .

internalresourceviewresolver

urlbasedviewresolver 的子類,通常用于查找 jsp(類 internalresourceview)和 jstl(類 jstlview,internalresourceview 的子類)等視圖。

velocityviewresolver /freemarkerviewresolver

urlbasedviewresolver 的子類分别用于支援 velocity(類 velocityview)和 freemark 視圖(類 freemarkerview)。

contentnegotiatingviewresolver

接口 viewresolver 的實作,用于根據請求檔案的字尾名或請求的 header 中的 accept 字段查找視圖。

在多數項目中,internalresourceviewresolver 是最常用的,該解析器可以傳回指定目錄下指定字尾的檔案,它支援 jsp 及 jstl 等視圖技術,但是用該視圖解析器時,需要注意設定好正确的優先級,因為該視圖解析器即使沒有找到正确的檔案,也會傳回一個視圖,而不是傳回 null,這樣優先級比該視圖解析器低的解析器,将不會被執行。

在 web 開發中,我們的前端顯示可以是 jsp、excel、velocity 等,在 spring 中,不同的前端顯示技術都有其對應的 java 視圖類,正如表 1 所提到的,internalresourceview 可以代表 jsp 視圖,freemarkerview 代表 freemarker 視圖。目前,spring 支援多種技術開發的視圖,包括 jsp、jstl、excel,velocity 等,在多數項目中,使用者并不需要自定義自己的視圖。