天天看點

Spring MVC體系結構

在傳統的Web應用開發中,架構模式基本一緻:

資料實體:POJO

資料層:DAO

業務層:Service

控制層:Servlet

表示層(頁面層):JSP頁面或HTML頁面

這種架構模式就是MVC設計模式,它是軟體工程中的一種架構模式,強制性地使軟體系統的輸入、處理和輸出分開,把系統分為三個基本部分:模型(Model)、視圖(View)、控制器(Controller)

Spring MVC體系結構

Model:模型對象擁有最多的處理任務,是應用程式的主體部分,它負責資料邏輯(業務邏輯)的處理和實作資料庫的操作。在項目中除了控制層的控制器,幾乎每一個Bean元件都屬于模型,比如Service層、DAO層,以及POJO實體類等。

View:負責格式化資料并把它們呈現給使用者,包括資料展示、使用者互動、資料驗證、頁面設計等功能。說白了就是離使用者最近的、展示給人們看的,比如HTML或者JSP頁面。

Controller:負責接收并轉發請求,對請求處理之後拿到響應結果,指派要使用的視圖(類似于指定Servlet跳轉到不同的頁面進行展示),将響應結果傳回給用戶端。對應的元件一般是Servlet,很少用JSP頁面直接處理其他頁面過來的請求。

JSP+JavaBean

在一個項目中,如果業務流程比較簡單的時候,可以把控制器的功能交給視圖,項目架構中隻有視圖和模型,沒有控制器。

Spring MVC體系結構

Model1模式的基礎是JSP,它由JSP和JavaBean組成,JSP從HTTPRequest中擷取所需要的資料,并調用JavaBean進行業務邏輯的處理,然後通過HTTPResponse将結果傳回給前端浏覽器。可見,Model1一定程度上實作了MVC,隻不過将控制層和視圖層統一定位到JSP頁面,JavaBean依然充當模型元件。這種模式下JSP身兼多職,既要負責視圖層的資料展示,又要負責業務流程控制,結構較為混亂,也不是我們所希望的松耦合架構,是以在大型項目中或者當業務流程比較複雜的時候不建議這樣做。

JSP+Servlet+JavaBean

當業務流程比較複雜的時候,就需要把業務流程控制交給專門的控制器,JSP隻專注于視圖的渲染展現即可。這種模式就是JSP Model2,即JSP+Servlet+JavaBean,也就是典型的MVC設計模式。

Spring MVC體系結構

相比于Model1,Model2是将控制層單獨劃分出來,以Servlet的形式存在于項目架構中,負責業務流程的控制,接收請求,建立所需的JavaBean元件,并将處理後的資料傳回給視圖(JSP/HTML)進行結果渲染展示。這樣的結構比較清晰,效果明顯優化很多,并且結合Spring的IoC和AOP,也是一個松耦合的架構模式。是以,除非項目特别簡單,一般情況下推薦使用JSP Model2。

通過以上對MVC的了解,我們不妨分析一下MVC的處理過程:

首先視圖提供系統與使用者互動的界面,并發送使用者的輸入給控制器;

控制器接收到使用者的請求,根據判斷,決定調用哪個模型的哪個方法進行處理;

模型被控制器調用,根據控制器的指令進行相應的業務邏輯處理,并傳回處理結果(資料);

控制器根據傳回的結果,調用相應的視圖來渲染、格式化模型傳回的資料;

視圖響應給用戶端浏覽器。

以上即是MVC的處理流程以及各部分之間的關系,那麼任何一件事都會有利有弊,我們再分析一下MVC模式的優缺點。

優點:

可以多視圖共享多個模型,大大提高了代碼的複用性;

MVC的三個子產品互相獨立,松耦合架構;

控制器提高了應用程式的靈活性和可配置性;

有利于項目的管理和維護。

缺點:

原理較複雜,實作起來固然沒有JSP+JavaBean的方式來得快;

增加了系統結構和實作的複雜性;

視圖對模型資料的通路效率較低。

總之,我們可以通過MVC的設計模式,最終打造出一個松耦合+高複用+高适用性等的完美架構,這也是架構設計的目标之一。但是,對于MVC來說,它并不适用于小型的項目,花費大量的時間将MVC應用到項目中通常得不償失,誇張點說,可能搭建三層架構、建構MVC開發環境的時間,都可以實作整個項目功能了。是以,是否使用MVC模式,應該根據實際場景來決定。

Spring MVC體系結構

Spring MVC也是一個基于請求驅動的Web架構,并且也使用了前端控制器模式來進行設計,再根據請求映射規則分發給相應的頁面控制器(處理器)來進行處理,下面具體分析一下它的處理步驟:

首先使用者發送請求到前端控制器(DispatcherServlet),前端控制器根據請求資訊(比如URL)決定将請求分發給哪個頁面控制器(Controller)來處理。對應上圖中的步驟1、2。

頁面控制器接收到請求之後,進行業務處理,處理完畢之後傳回一個ModelAndView。對應上圖中的步驟3、4、5。

前端控制器将控制權收回,然後根據傳回的邏輯視圖名,通過視圖解析器選擇真正的視圖,将模型資料傳入供其渲染展示。對應上圖中的步驟6、7。

前端控制器再次收回控制權,将響應結果傳回給浏覽器用戶端,至此整個流程結束。對應上圖中的步驟8。

Spring MVC體系結構

用戶端發出HTTP請求,Web應用伺服器接收此請求。如比對DispatcherServlet的請求映射路徑,則Web容器将該請求轉交給DispatcherServlet處理;

DispatcherServlet拿到請求之後,根據請求的資訊(URL、請求參數、HTTP方法等)及HandlerMapping的配置找到處理請求的處理器(Handler);

當DispatcherServlet找到相應的Handler之後,通過HandlerAdapter對Handler進行封裝,再以統一的擴充卡接口調用Handler。HandlerAdapter可以了解為真正使用Handler來幹活的人。

在請求資訊真正到達調用Handler的處理方法之前的這段時間,Spring MVC還完成了很多工作,它會将請求資訊以一定的方式轉換并綁定到請求方法的入參,對于入參的對象會進行資料轉換、資料格式化以及資料校驗等。這些都做完以後,最後才真正調用Handler的處理方法進行相應的業務邏輯處理。

處理器完成業務處理之後,将一個ModelAndView對象傳回給DispatcherServlet,其中包含了邏輯視圖名和模型資料資訊。

DispatcherServlet通過ViewResolver将邏輯視圖名解析為真正的視圖對象View,可以是JSP、HTML、XML、PDF、JSON等等,Spring MVC均可靈活配置,在以後會介紹。

得到真正的視圖對象之後,DispatcherServlet會根據ModelAndView對象中的模型資料對View進行視圖渲染。

最終用戶端獲得響應消息。

角色劃厘清晰。Model、View、Controller各司其職,耦合度較低。

靈活的配置功能。Spring的核心是IoC和AOP,統一可以實作在MVC上,把各種類當作Bean元件配置在Spring容器中。

提供了大量的接口和實作類,友善各種場景的開發。

真正做到與View層的實作無關。

結合Spring的依賴注入,更好地應用了面向接口程式設計的思想。

可以與Spring天衣無縫的整合

Spring MVC體系結構

參考:

​​https://blog.51cto.com/aeolian/2853207​​​