從WebMVC到SpringMVC

WebMVC簡介
1.1 Web開發中的請求–響應模型
在這裏插入圖片描述
如圖所示,一個完整的Web請求——響應由以下基本步驟組成:

  1. Web瀏覽器發起web請求,如訪問www.baidu.com;
  2. Web服務器(如Tomcat)接收、處理Web請求後,產生響應;
  3. Web瀏覽器對接收的內容進行處理,將結果展現給客戶。

因此,在BS架構中,請求都是由瀏覽器客戶端主動發起,Web服務器接收、處理併產生響應。一般來說,Web服務器不能主動通知Web客戶端更新內容。(WebSocket、Comet等雖說也可做到)

1.2 標準MVC模型概述
MVC模型:是一種架構型的模式,本身不引入新功能,只是幫助我們將開發的結構組織的更加合理,使展示與模型分離、流程控制邏輯、業務邏輯調用與展示邏輯分離。如下圖所示:
在這裏插入圖片描述
先簡單瞭解下MVC(ModelViewController)三元組的基本概念:
Model(模型):數據模型,提供要展示的數據,因此包含數據和行爲,可以認爲是領域模型或JavaBean組件(包含數據和行爲),不過現在一般都分離開來:Value Object(數據) 和 服務層(行爲)。也就是模型提供了模型數據查詢和模型數據的狀態更新等功能,包括數據和業務。

View(視圖):負責進行模型的展示,一般就是我們見到的用戶界面,客戶想看到的東西。

Controller(控制器):接收用戶請求,委託給模型進行處理(狀態改變),處理完畢後把返回的模型數據返回給視圖,由視圖負責展示。也就是說控制器做了個調度員的工作。

在標準的MVC中模型能主動推數據給視圖進行更新(觀察者設計模式,在模型上註冊視圖,當模型更新時自動更新視圖),但在Web開發中模型是無法主動推給視圖(無法主動更新用戶界面),因爲在Web開發是請求響應模型。

Web MVC概述

MVC(模型–視圖–控制器)概念和標準MVC概念一樣,但Web MVC由於模型更新時不能自動更新視圖,所以Web MVC標準架構如下:
在這裏插入圖片描述
服務到工作者
在這裏插入圖片描述
前端控制器(Front Controller):負責爲表現層提供統一訪問點,從而出現重複的控制邏輯(由前端控制器統一回調相應的功能方法;並且可以爲多個請求提供共用的邏輯(如準備上下文等等),將選擇具體視圖和具體的功能處理(如login裏邊封裝請求參數到模型,並調用業務邏輯對象)分離。

應用控制器(Application Controller):前端控制器分離選擇具體視圖和具體的功能處理之後,需要有人來管理,應用控制器就是用來選擇具體視圖技術(視圖的管理)和具體的功能處理(頁面控制器/命令對象/動作管理),一種策略設計模式的應用,可以很容易的切換視圖/頁面控制器,相互不產生影響。

頁面控制器/動作/處理器(Page Controller|Command):功能處理代碼,收集參數、封裝參數到模型,轉調業務對象處理模型,返回邏輯視圖名交給前端控制器(和具體的視圖技術解耦),由前端控制器委託給應用控制器選擇具體的視圖來展示,可以是命令設計模式的實現。頁面控制器也被稱爲處理器或動作。

上下文(Context):我們就可以將相關數據放置在上下文,從而與協議無關(如Servlet API)的訪問/設置模型數據,一般通過ThreadLocal模式實現。

SpringMVC的架構實現
在這裏插入圖片描述

  1. 讓我們能非常簡單的設計出乾淨的Web 層和薄薄的Web 層;
  2. 進行更簡潔的Web 層的開發;
  3. 天生與Spring框架集成(如IoC容器、AOP等);
  4. 提供強大的約定大於配置的契約式編程支持;
  5. 能簡單的進行Web 層的單元測試;
  6. 支持靈活的URL到頁面控制器的映射;
  7. 非常容易與其他視圖技術集成,如Velocity、FreeMarker 等等,因爲模型數據不放在特定的API 裏,而是放在一個Model裏(Map 數據結構實 現,因此很容易被其他框架使用);
  8. 非常靈活的數據驗證、格式化和數據綁定機制,能使用任何對象進行
    數據綁定,不必實現特定框架的API;
  9. 提供一套強大的JSP標籤庫,簡化JSP開發;
  10. 支持靈活的本地化、主題等解析;
  11. 更加簡單的異常處理;
  12. 對靜態資源的支持;
  13. 支持Restful風格;

Spring Web MVC處理請求的流程
在這裏插入圖片描述

  1. 首先用戶發送請求—>前端控制器,前端控制器根據請求信息(如URL)來決定選擇哪一個頁面控制器進行處理並把請求委託給它;
  2. 頁面控制器接收到請求後,進行功能處理,首先需要收集和綁定請求參數到一個對象,這個對象在Spring Web MVC中叫命令對象,並進行驗證,然後將命令對象委託給業務對象進行處理;處理完畢後返回一個ModelAndView(模型數據和邏輯視圖名);
  3. 前端控制器收回控制權,然後根據返回的邏輯視圖名,選擇相應的視圖進行渲染,並把模型數據傳入以便視圖渲染;
  4. 前端控制器再次收回控制權,將響應返回給用戶,至此整個結束。

Spring Web MVC核心架構圖

在這裏插入圖片描述

  1. 首先用戶發送請求——>DispatcherServlet,前端控制器收到請求後自己不進行處理,而是委託給其他的解析器進行處理,作爲統一訪問點,進行全局的流程控制;
  2. DispatcherServlet——>HandlerMapping, HandlerMapping 將會把請求映射爲HandlerExecutionChain 對象(包含一個Handler 處理器(頁面控制器)對象、多個HandlerInterceptor 攔截器)對象,通過這種策略模式,很容易添加新的映射策略;
  3. DispatcherServlet——>HandlerAdapter,HandlerAdapter 將會把處理器包裝爲適配器,從而支持多種類型的處理器,即適配器設計模式的應用,從而很容易支持很多類型的處理器;
  4. HandlerAdapter——>處理器功能處理方法的調用,HandlerAdapter 將會根據適配的結果調用真正的處理器的功能處理方法,完成功能處理;並返回一個ModelAndView 對象(包含模型數據、邏輯視圖名);
  5. ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver 將把邏輯視圖名解析爲具體的View,通過這種策略模式,很容易更換其他視圖
    技術;
  6. View——>渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構,因此很容易支持其他視圖技術;
  7. 返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束。

需要程序員關注的核心步驟如下:

  1. DispatcherServlet在web.xml 中的部署描述,從而攔截請求到Spring
    Web MVC;
  2. HandlerMapping的配置,從而將請求映射到處理器;
  3. HandlerAdapter 的配置,從而支持多種類型的處理器;
  4. ViewResolver 的配置,從而將邏輯視圖名解析爲具體視圖技術;
  5. 處理器(頁面控制器)的配置,從而進行功能處理;
發佈了150 篇原創文章 · 獲贊 140 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章