01 MVC概述 在Web系統開發中一般按照視圖(View)、模型(Model)、控制(Controller)三層設計模式進行構建,視圖層負責模型數據的渲染,將數據用一定的形式展現給用戶;模型層負責監聽實體的變化並對實體進行解析和封裝;控制層負責提供前後端交互的請求邏輯處理入口,處理用戶請求,並建立 ...
01 MVC概述
在Web系統開發中一般按照視圖(View)、模型(Model)、控制(Controller)三層設計模式進行構建,視圖層負責模型數據的渲染,將數據用一定的形式展現給用戶;模型層負責監聽實體的變化並對實體進行解析和封裝;控制層負責提供前後端交互的請求邏輯處理入口,處理用戶請求,並建立適當的模型傳遞給視圖進行渲染。層級關係一般如下圖所示:
在Web開發的早期,JSP + Servlet + JavaBean的組合非常流行,那個時候JSP擔任著視圖層渲染工作,Servlet作為控制器負責用戶的請求和響應,而JavaBean則負責一些更加複雜的業務邏輯,例如跟資料庫打交道。
後來出現了一個新的MVC框架Struts2,它將action作為框架的控制器負責用戶請求響應,同時為前端頁面提供了標簽庫和有力的渲染工具-OGNL,用戶請求action返回數據到JSP後,在JSP中可以採用OGNL表達式對數據進行動態的渲染,它還增加了請求過濾器以及進行請求前後處理的攔截器,方便系統過濾、攔截一些不符合規則的請求並做出及時的響應操作,不得不說它的出現降低了系統的耦合性,讓MVC模式的分層更加明顯,也大大的簡化了開發者的代碼量。
02 SpringMVC簡介
由於Struts2框架帶來的便利,它和Spring在過去很長一段時間被結合在一起用來構建系統,但是隨著技術的發展,二者的結合出現了很多問題例如類臃腫、相容性以及Struts2漏洞等問題,而就在這時候,Spring家族誕生了一個新的MVC框架來與Spring實現無縫結合,它就是SpringMVC。
SpringMVC是採用Java開發,一種基於Web MVC設計模式,以請求驅動為類型的輕量級Web框架。由於使用了MVC架構模式的思想,將Web層進行了職責解耦,讓分層更加的明顯。
03 SpringMVC優勢
談到SpringMVC的優勢,首先想到的就是它依賴Spring的包才能運行,也就是說它其實是Spring的一個MVC子框架,這樣的話就可以跟Spring實現無縫的結合,從而繼承它的眾多特性,這一點比起Struct2框架就有了很大的先天優勢,另外還有其他的幾個優點如下:
1、實現方法級別的請求攔截
上面提及的Struts2採用的是類級別的請求攔截,即一個類對應一個請求上下文,而SpringMVC採用方法級別的攔截,一個方法對應一個請求URL,也就是一個請求上下文。所以從架構本身上SpringMVC容易實現Restful介面,而Struts2的架構實現起來要麻煩很多,因為Struts2 action的一個方法可以對應一個URL,但是它的類屬性卻被所有的方法共用,這也就無法用註解或其他方式標識其所屬的方法了。
2、SpringMVC提供強大的註解
SpringMVC引入了註解的功能,通過在類、方法上標記相應的註解,可以實現實體的映射、配置的載入等,使用起來非常便利,可以大大簡化配置和代碼量,比如說同樣是接收請求,Servlet作為控制器需要在doPost或者doGet中做一些處理後才能調用業務代碼,而SpringMVC通過幾個註解就可以實現,例如@requestMapping可以幫助定義當前類為一個Spring管理的bean,同時指定該類是一個控制器,可以用來接受請求,標識當前類是控制層的一個具體的實現;@Controller放在方法上面用來指定某個方法的路徑,當它放在類上的時候相當於命名空間需要組合方法上的requestMapping來訪問。
3、清晰的角色劃分
控制器(Controller)、驗證器(Validator)、命令對象(Command-obect)、表單對象(form-object)、模型對象(model-object)、Servlet分發器(DispatcherServlet)、處理器映射(handler-mapping)、視圖解析器(view-resolver)等等。每一個角色都可以由一個專門的對象來實現。
04 SpringMVC流程步驟
SpringMVC的具體執行流程步驟如下:
1.首先用戶在前臺頁面向某一個後臺指定的URL發起了請求,SpringMVC收到這個請求後會首先交給中央控制器(DispatcherServlet)
2.中央控制器請求HandlerMapping查找 Handler處理器 (可以根據xml配置、註解進行查找)
3.處理器映射器HandlerMapping向中央控制器返回Handler,HandlerMapping會把請求映射為HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象,多個HandlerInterceptor攔截器對象),通過這種策略模式,很容易添加新的映射策略
4.中央控制器調用處理器適配器去執行Handler
5.處理器適配器HandlerAdapter將會根據適配的結果去執行Handler
6.Handler執行完成給適配器返回ModelAndView
7.處理器適配器向中央控制器返回ModelAndView (ModelAndView其實是SpringMVC框架的一個底層對象,包括模型Model和視圖View)
8.中央控制器請求視圖解析器去進行視圖解析 (根據邏輯視圖名解析成真正的視圖(jsp),通過這種策略很容易更換其他視圖技術,只需要更改視圖解析器即可
9.視圖解析器向中央控制器返回View
10.中央控制器進行視圖渲染 (視圖渲染將模型數據(在ModelAndView對象中)填充到request域)
11.前端控制器向用戶響應結果