在Web系統開發中通常按照視圖(View)、模型(Model)、控制(Controller)三層設計模式進行構建,視圖層負責模型數據的渲染,將數據用必定的形式展示給用戶;模型層負責監聽實體的變化並對實體進行解析和封裝;控制層負責提供先後端交互的請求邏輯處理入口,處理用戶請求,並創建適當的模型傳遞給視圖進行渲染。層級關係通常以下圖所示: 前端
後來出現了一個新的MVC框架Struts2,它將action做爲框架的控制器負責用戶請求響應,同時爲前端頁面提供了標籤庫和有力的渲染工具-OGNL,用戶請求action返回數據到JSP後,在JSP中能夠採用OGNL表達式對數據進行動態的渲染,它還增長了請求過濾器以及進行請求先後處理的攔截器,方便系統過濾、攔截一些不符合規則的請求並作出及時的響應操做,不得不說它的出現下降了系統的耦合性,讓MVC模式的分層更加明顯,也大大的簡化了開發者的代碼量。數據庫
因爲Struts2框架帶來的便利,它和Spring在過去很長一段時間被結合在一塊兒用來構建系統,可是隨着技術的發展,兩者的結合出現了不少問題例如類臃腫、兼容性以及Struts2漏洞等問題,而就在這時候,Spring家族誕生了一個新的MVC框架來與Spring實現無縫結合,它就是SpringMVC。後端
SpringMVC是採用Java開發,一種基於Web MVC設計模式,以請求驅動爲類型的輕量級Web框架。因爲使用了MVC架構模式的思想,將Web層進行了職責解耦,讓分層更加的明顯。設計模式
談到SpringMVC的優點,首先想到的就是它依賴Spring的包才能運行,也就是說它實際上是Spring的一個MVC子框架,這樣的話就能夠跟Spring實現無縫的結合,從而繼承它的衆多特性,這一點比起Struct2框架就有了很大的先天優點,另外還有其餘的幾個優勢以下:架構
一、實現方法級別的請求攔截 上面說起的Struts2採用的是類級別的請求攔截,即一個類對應一個請求上下文,而SpringMVC採用方法級別的攔截,一個方法對應一個請求URL,也就是一個請求上下文。因此從架構自己上SpringMVC容易實現Restful接口,而Struts2的架構實現起來要麻煩不少,由於Struts2 action的一個方法能夠對應一個URL,可是它的類屬性卻被全部的方法共享,這也就沒法用註解或其餘方式標識其所屬的方法了。app
二、SpringMVC提供強大的註解 SpringMVC引入了註解的功能,經過在類、方法上標記相應的註解,能夠實現實體的映射、配置的加載等,使用起來很是便利,能夠大大簡化配置和代碼量,好比說一樣是接收請求,Servlet做爲控制器須要在doPost或者doGet中作一些處理後才能調用業務代碼,而SpringMVC經過幾個註解就能夠實現,例如@Controller能夠幫助定義當前類爲一個Spring管理的bean,同時指定該類是一個控制器,能夠用來接受請求,標識當前類是控制層的一個具體的實現;@requestMapping放在方法上面用來指定某個方法的路徑,當它放在類上的時候至關於命名空間須要組合方法上的requestMapping來訪問。框架
三、清晰的角色劃分 控制器(Controller)、驗證器(Validator)、命令對象(Command-obect)、表單對象(form-object)、模型對象(model-object)、Servlet分發器(DispatcherServlet)、處理器映射(handler-mapping)、視圖解析器(view-resolver)等等。每個角色均可以由一個專門的對象來實現。jsp
1.首先用戶在前臺頁面向某一個後臺指定的URL發起了請求,SpringMVC收到這個請求後會首先交給中央控制器(DispatcherServlet)工具
2.中央控制器請求HandlerMapping查找 Handler處理器 (能夠根據xml配置、註解進行查找)spa
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.前端控制器向用戶響應結果