天天看點

SpringMVC之視圖和視圖解析器

SpringMVC之視圖和視圖解析器

一 SpringMVC如何解析視圖

1 流程圖

SpringMVC之視圖和視圖解析器

2 視圖和視圖解析器

(1)請求處理方法執行完成後,最終傳回一個 ModelAndView 對象。對于那些傳回 String,View 或 ModeMap 等類型的 處理方法,Spring MVC 也會在内部将它們裝配成一個 ModelAndView 對象,它包含了邏輯名和模型對象的視圖

(2)Spring MVC 借助視圖解析器(ViewResolver)得到最終的視圖對象(View),最終的視圖可以是 JSP ,也可能是 Excel、JFreeChart 等各種表現形式的視圖

(3)對于最終究竟采取何種視圖對象對模型資料進行渲染,處理器并不關心,處理器工作重點聚焦在生産模型資料的工作上,進而實作 MVC 的充分解耦

(4)視圖

① 視圖的作用是渲染模型資料,将模型裡的資料以某種形式呈現給客戶。

② 為了實作視圖模型和具體實作技術的解耦,Spring 在org.springframework.web.servlet 包中定義了一個高度抽象的 View 接口

SpringMVC之視圖和視圖解析器

③ 視圖對象由視圖解析器負責執行個體化。由于視圖是無狀态的,是以他們不會有線程安全的問題

④ 常用視圖實作類

SpringMVC之視圖和視圖解析器

(5)視圖解析器

① SpringMVC 為邏輯視圖名的解析提供了不同的政策,可以在 Spring WEB 上下文中配置一種或多種解析政策,并 指定他們之間的先後順序。每一種映射政策對應一個具體 的視圖解析器實作類。

② 視圖解析器的作用比較單一:将邏輯視圖解析為一個具體的視圖對象。

③ 所有的視圖解析器都必須實作ViewResolver 接口

④ 常用的視圖解析器實作類

SpringMVC之視圖和視圖解析器

說明:

程式員可以選擇一種視圖解析器或混用多種視圖解析器,每個視圖解析器都實作了 Ordered 接口并開放出一個 order 屬性,可以通過 order 屬性指定解析器的優先順序,order 越小優先級越高。 SpringMVC 會按視圖解析器順序的優先順序對邏輯視圖名進行解析,直到解析成功并傳回視圖對象,否則将抛出 ServletException 異常

(6)InternalResourceViewResolver

JSP 是最常見的視圖技術,可以使用InternalResourceViewResolver 作為視圖解析器

SpringMVC之視圖和視圖解析器

① 若項目中使用了 JSTL,則 SpringMVC 會自動把視圖由 InternalResourceView 轉為 JstlView

② 若使用 JSTL 的 fmt 标簽則需要在 SpringMVC 的配置檔案中配置國際化資源檔案

SpringMVC之視圖和視圖解析器

③ 若希望直接響應通過 SpringMVC 渲染的頁面,可以使用 mvc:view-controller 标簽實作

SpringMVC之視圖和視圖解析器

(7)Excel視圖

① 若希望使用 Excel 展示資料清單,僅需要擴充 SpringMVC 提供的 AbstractExcelView 或 AbstractJExcel View 即可。實作 buildExcelDocument() 方法,在方法中使用模型資料對象建構 Excel 文檔就可以 了。

② AbstractExcelView 基于 POI API,而 AbstractJExcelView 是基于 JExcelAPI 的。

③ 視圖對象需要配置 IOC 容器中的一個 Bean,使用 BeanNameViewResolver 作為視圖解析器即可

④ 若希望直接在浏覽器中直接下載下傳 Excel 文檔,則可以設定響應頭 Content-Disposition=attachment;filename=xxx.xls

(8)重定向

① 一般情況下,控制器方法傳回字元串類型的值會被當成邏輯視圖名處理

② 如果傳回的字元串中帶 forward: 或 redirect: 字首時,SpringMVC 會對他們進行特殊處理:将 forward: 和 redirect: 當成訓示符,其後的字元串作為 URL 來處理

例如:

redirect:success.jsp:會完成一個到 success.jsp 的重定向的操作forward:success.jsp:會完成一個到 success.jsp 的轉發操作

其内部處理如圖:

SpringMVC之視圖和視圖解析器

繼續閱讀