SpringMVC架構淺析

jopen 9年前發布 | 30K 次閱讀 SpringMVC Spring MVC Web框架

 

SpringMVC概述

Spring的web框架圍繞DispatcherServlet設計。 DispatcherServlet 的作用是將請求分發到不同的處理器。 Spring的web框架包括可配置的處理器(handler)映射、視圖(view)解析、本地化(local)解析、 主題(theme)解析以及對文件上傳的支持。Spring的Web框架中缺省的處理器是Controller接口,這是一個非常簡單的接口,僅包含ModelAndView handleRequest(request, response)方法。可以通過實現這個接口來創建自己的控制器(也可以稱之為處理器),但是更推薦繼承Spring提供的一系列控制器, 比如AbstractController、 AbstractCommandController 和SimpleFormController。注意,需要選擇正確的基類:如果沒有表單,就不需要一個FormController。 這是和Struts的一個主要區別。 

Spring Web MVC允許使用任何對象作為命令對象(或表單對象)- 不必實現某個特定于框架的接口或從某個基類繼承。 Spring的數據綁定相當靈活,例如,它認為類型不匹配這樣的錯誤應該是應用級的驗證錯誤,而不是系統錯誤。 所以你不需要為了保證表單內容的正確提交,而重復定義一個和業務對象有相同屬性的表單對象來處理簡單的無 類型字符串或者對字符串進行轉換。這也是和Struts相比的另一個重要區別,Struts是圍繞Action和ActionForm等基類構建的。

和WebWork相比,Spring將對象細分成更多不同的角色:控制器(Controller)、可選的命令對象(Command Object)或表單對象(Form Object), 以及傳遞到視圖的模型(Model)。模型不僅包含命令對象或表單對象,而且也可以包含任何引用數據。 相比之下,WebWork的Action將所有的這些角色都合并在一個單獨的對象里。 雖然WebWork的確允許在表單中使用現有的業務對象,但是必須把它們定義成相應的Action類的bean屬性。更重要的是,在進行視圖層(View)運算和表單賦值時,WebWork使用的是同一個處理請求的Action實例。因此,引用數據也需要被定義成Action的bean屬性。這樣一個對象就承擔了太多的角色(當然,對于這個觀點仍有爭議)。

Spring的視圖解析相當靈活。一個控制器甚至可以直接向response輸出一個視圖 (此時控制器返回ModelAndView的值必須是null)。在一般的情況下,一個ModelAndView 實例包含一個視圖名字和一個類型為Map的model, 一個model是一些以bean的名字為key,以bean對象(可以是命令或form,也可以是其他的JavaBean) 為value的鍵值對。對視圖名稱的解析處理也是高度可配置的,可以通過bean的名字、屬性文件或者自定義的ViewResolver實現來進行解析。實際上基于Map的model(也就是MVC中的M)是高度抽象的,適用于各種表現層技術。 也就是說,任何表現層都可以直接和Spring集成,無論是JSP、Velocity還是其它表現層技術。 Map model可以被轉換成合適的格式,比如JSP request attribute或者Velocity template model。 

Spring MVC框架的特點

  • 清晰的角色劃分:控制器(controller)、驗證器(validator)、 命令對象(command object)、表單對象(form object)、模型對象(model object)、 Servlet分發器(DispatcherServlet)、 處理器映射(handler mapping)、視圖解析器(view resolver)等等。 每一個角色都可以由一個專門的對象來實現。

  • 強大而直接的配置方式:將框架類和應用程序類都能作為JavaBean配置,支持跨多個context的引用,例如,在web控制器中對業務對象和驗證器(validator)的引用。

  • 可適配、非侵入:可以根據不同的應用場景,選擇合適的控制器子類 (simple型、command型、form型、wizard型、multi-action型或者自定義),而不是從單一控制器 (比如Action/ActionForm)繼承。

  • 可重用的業務代碼:可以使用現有的業務對象作為命令或表單對象,而不需要去擴展某個特定框架的基類。

  • 可定制的綁定(binding) 和驗證(validation):比如將類型不匹配作為應用級的驗證錯誤, 這可以保存錯誤的值。再比如本地化的日期和數字綁定等等。在其他某些框架中,你只能使用字符串表單對象, 需要手動解析它并轉換到業務對象。

  • 可定制的handler mapping和view resolution:Spring提供從最簡單的URL映射, 到復雜的、專用的定制策略。與某些web MVC框架強制開發人員使用單一特定技術相比,Spring顯得更加靈活。

  • 靈活的model轉換:在Springweb框架中,使用基于Map的 鍵/值對來達到輕易地與各種視圖技術的集成。

  • 可定制的本地化和主題(theme)解析:支持在JSP中可選擇地使用Spring標簽庫、支持JSTL、支持Velocity(不需要額外的中間層)等等。

  • 簡單而強大的JSP標簽庫(Spring Tag Library):支持包括諸如數據綁定和主題(theme) 之類的許多功能。它提供在標記方面的最大靈活性。

  • JSP表單標簽庫:在Spring2.0中引入的表單標簽庫,使得在JSP中編寫 表單更加容易。

  • Spring Bean的生命周期可以被限制在當前的HTTP Request或者HTTPSession。 準確的說,這并非Spring MVC框架本身特性,而應歸屬于Sping MVC使用的WebApplicationContext容器。

對SpringMVC的介紹參考自官方文檔: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html

Spring MVC工作原理

就我自己對Spring MVC的理解來談談其工作原理。

Spring MVC的工作是要依賴整個Spring的。

SpringMVC架構淺析 from docs

DispatcherServlet是調度的核心,處理器映射器,視圖解析器,業務處理器都要被前端控制器所調配,畫了一張簡單架構圖:

SpringMVC架構淺析

分步驟來解釋一下:

1.用戶在客戶端向DispatcherServlet發送請求。

2.DispatcherServlet接受到請求后調用處理器映射器映射對應的Controller。

3.處理器映射器返回映射到的Controller給DispatcherServlet。

4.DispatcherServlet通過得到的Controller來調用處理器。

5.Controller根據請求調用相應的業務邏輯Service。

6.Service調用數據訪問層。

7.Service抽取數據模型。

8.Service把數據模型返回給Controller。

9.Controller包裝數據返回給DispatcherServlet一個ModelAndView。

10.DispatcherServlet根據得到的ModelAndView調用視圖解析器。

11.視圖解析器返回一個指定格式的視圖。

12.DispatcherServlet把得到的視圖forward到JSP頁面。

13.JSP頁面響應用戶的請求并顯示到客戶端。

以上就是SpringMVC的大體架構和工作原理。

Spring框架的源碼中使用了非常多的經典設計模式和設計原則。是不可多得的代碼大餐。找個時間研究一下。

更多關于SpringMVC的介紹請參考官方文檔: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!