Spring Web MVC 是一種基於 Java 的實現了 Web MVC 設計模式的請求驅動類型的輕量級 Web 框架,即使用了 MVC 架構模式的思想,將 web 層進行職責解耦,基於請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,Spring Web MVC 也是要簡化我們日常 Web 開發的。
另外還有一種基於組件的、事件驅動的 Web 框架在此就不介紹了,如 Tapestry、JSF 等。
Spring Web MVC 也是服務到工作者模式的實現,但進行可優化。前端控制器是 DispatcherServlet;應用控制器其實拆為處理器映射器(Handler Mapping)進行處理器管理和視圖解析器(View Resolver)進行視圖管理;頁面控制器/動作/
處理器為 Controller 接口(僅包含 ModelAndView handleRequest(request, response) 方法)的實現(也可以是任何的 POJO 類);支持本地化(Locale)解析、主題(Theme)解析及文件上傳等;提供了非常靈活的數據驗證、格式化和數據綁定機制;提供了強大的約定大於配置(慣例優先原則)的契約式編程支持。
√讓我們能非常簡單的設計出干凈的 Web 層和薄薄的 Web 層;√進行更簡潔的 Web 層的開發;√天生與 Spring 框架集成(如 IoC 容器、AOP 等);
√提供強大的約定大於配置的契約式編程支持;√能簡單的進行 Web 層的單元測試;√支持靈活的 URL 到頁面控制器的映射;
√非常容易與其他視圖技術集成,如 Velocity、FreeMarker 等等,因為模型數據不放在特定的 API 里,而是放在一個 Model 里(Map 數據結構實現,因此很容易被其他框架使用);√非常靈活的數據驗證、格式化和數據綁定機制,能使用任何對象進行數據綁定,不必實現特定框架的 API;√提供一套強大的 JSP 標簽庫,簡化 JSP 開發;√支持靈活的本地化、主題等解析;√更加簡單的異常處理;√對靜態資源的支持;
Spring Web MVC 處理請求的流程

具體執行步驟如下:
1、 首先用戶發送請求————>前端控制器,前端控制器根據請求信息(如 URL)來決定選擇哪一個頁面控制器進行
處理並把請求委托給它,即以前的控制器的控制邏輯部分;圖 2-1 中的 1、2 步驟;2、 頁面控制器接收到請求后,進行功能處理,首先需要收集和綁定請求參數到一個對象,這個對象在 Spring Web MVC
中叫命令對象,並進行驗證,然后將命令對象委托給業務對象進行處理;處理完畢后返回一個 ModelAndView(模型數據和邏輯視圖名);圖 2-1 中的 3、4、5 步驟;
3、 前端控制器收回控制權,然后根據返回的邏輯視圖名,選擇相應的視圖進行渲染,並把模型數據傳入以便視圖渲染;
圖 2-1 中的步驟 6、7;4、 前端控制器再次收回控制權,將響應返回給用戶,圖 2-1 中的步驟 8;至此整個結束。
問題:
1、 請求如何給前端控制器?
2、 前端控制器如何根據請求信息選擇頁面控制器進行功能處理?
3、 如何支持多種頁面控制器呢?
4、 如何頁面控制器如何使用業務對象?
5、 頁面控制器如何返回模型數據?
6、 前端控制器如何根據頁面控制器返回的邏輯視圖名選擇具體的視圖進行渲染?
7、 不同的視圖技術如何使用相應的模型數據?
Spring Web MVC 核心架構圖







Spring Web MVC 優勢
1、清晰的角色划分:前端控制器(DispatcherServlet)、請求到處理器映射(HandlerMapping)、處理器適配器(HandlerAdapter)、視圖解析器(ViewResolver)、處理器或頁面控制器(Controller)、驗證器( Validator)、命令對象(Command 請求參數綁定到的對象就叫命令對象)、表單對象(Form Object 提供給表單展示和提交到的對象就叫表單對象)。
2、分工明確,而且擴展點相當靈活,可以很容易擴展,雖然幾乎不需要;
3、由於命令對象就是一個 POJO,無需繼承框架特定 API,可以使用命令對象直接作為業務對象;
4、和 Spring 其他框架無縫集成,是其它 Web 框架所不具備的;
5、可適配,通過 HandlerAdapter 可以支持任意的類作為處理器;
6、可定制性,HandlerMapping、ViewResolver 等能夠非常簡單的定制;
7、功能強大的數據驗證、格式化、綁定機制;8、利用 Spring 提供的 Mock 對象能夠非常簡單的進行 Web 層單元測試;
8、本地化、主題的解析的支持,使我們更容易進行國際化和主題的切換。
9、強大的 JSP 標簽庫,使 JSP 編寫更容易。
