相信你們經過前文的學習,已經對SpringMVC這個框架多少有些理解了。還記得上一篇文章中SpringMVC的處理流程嗎?
這個圖大體描述了SpringMVC的整個處理流程,這個流程圖仍是相對來講比較容易懂的,下面我會給出SpringMVC的框架結構圖,這個圖相對來講會更復雜,不過通過我細緻入微的講解,相信你們均可以深刻理解。html
SpringMVC框架結構
SpringMVC框架結構以下圖所示:
下面我會對SpringMVC框架結構做細緻入微的講解。前端
架構流程
- 用戶發送請求至前端控制器DispatcherServlet。
- DispatcherServlet收到請求調用HandlerMapping處理器映射器。
- 處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(若是有則生成)一併返回給DispatcherServlet。
- DispatcherServlet經過HandlerAdapter處理器適配器調用處理器。
- 執行處理器(Controller,也叫後端控制器)。
- Controller執行完成返回ModelAndView。
- HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
- DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
- ViewReslover解析後返回具體View。
- DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。
- DispatcherServlet響應用戶。
上面大體上對SpringMVC框架結構作了一個粗略的解釋,下面我則會作一個更加細緻入微的講解。程序員
- 瀏覽器發送請求,請求具體發到誰呢?先發到前端控制器,也就是說全部的請求都給發到前端控制器,前端控制器是全部請求的入口,但前端控制器不能處理業務請求,它只是一個請求的轉發。
- 誰來處理業務請求呢?Handler處理器來真正處理業務請求,那麼問題來了,前端控制器如何來找到這個Handler處理器呢?處理器映射器記錄的就是請求的url和處理的方法之間的映射關係,這個映射關係是怎麼創建起來的呢?就是經過@RequestMapping這個註解來創建起來的,這個映射關係就至關於一個Map(key-value這種形式),key就是請求的url,value就是處理的Handler。如今,前端控制器拿到這個請求以後,要找到對應的Handler,怎麼找呢?就要找處理器映射器,問它請求誰來處理?
- 處理器映射器會根據你請求的url來找對應的處理器,找不到就會報錯,若是找到以後,這時,它就會返回一個處理器執行鏈,這個處理器執行鏈裏面除了有Handler以外,還有攔截器(這兒咱們能夠開發本身的攔截器),而後返回給前端控制器。
- 前端控制器依然不能處理這個業務請求,它這時作的還有另一件事情,由於返回Handler,它也不知道這個Handler是什麼類型,由於在spring mvc中Handler除了能夠是註解形式的以外,其實還能夠是非註解形式的(非註解形式咱們通常不用),前端控制器並不知道這個Handler究竟是什麼類型的,那就沒辦法執行它,那總得找個東西執行,這時它就會把這個事交給另一個組件來處理,這個組件就叫處理器適配器,這個處理器適配器就是來適配不一樣類型的Handler。它就會根據你不一樣類型的Handler來選擇不一樣類型的適配器來執行它。
- 假如當前Handler是註解形式的,那麼它就會選擇註解形式的處理器適配器來執行這個Handler。Handler就執行了,也就是說咱們Controller類中的那個方法就執行了,方法執行以後,裏面的業務就處理了。
- 業務處理以後,最後返回一個ModelAndView。處理器適配器拿到這個結果是沒有用的,它的做用就是執行這個Handler,把這個Handler執行完以後,它的事就作完了。
- 作完以後,拿到這個返回結果,那麼它會原封不動地把這個返回結果扔給前端控制器,這時處理器適配器的事就作完了。
- 前端控制器拿到這個ModelAndView,它仍是沒有辦法處理,它仍是不能返回html,這時它要找到相應的jsp,由於ModelAndView即包含模型又包含視圖,這個視圖指定咱們要用誰來渲染這個數據。咱們要渲染數據,這時它就要找一個視圖解析器來解析這個視圖,因爲這個視圖也有不少種(咱們最多見的視圖是jsp,除了jsp,其實還有其餘的,好比說還能夠是報表,還能夠是pdf,還能夠是freemaker等),它會找不一樣的視圖解析器來處理。由於如今咱們最經常使用的視圖是jsp,因此它就找到jsp對應的視圖解析器。
- 找到這個視圖解析器,它來把這個視圖解析,解析完了以後它會返回一個View對象。
- 最後咱們再調用這個視圖解析器的渲染視圖這個過程,渲染視圖這個過程其實就是對於咱們的jsp來講,就是把這個數據渲染成html。
- 最終渲染成html以後,就響應給用戶。
經過以上的分析你們有沒有更好地理解SpringMVC的架構流程呢?我可能寫的比較繞口,但確是對我來講比較好理解一點,但願對你也是同樣。spring
組件說明
如下組件一般使用框架提供實現:後端
- DispatcherServlet:前端控制器
用戶請求到達前端控制器,它就至關於mvc模式中的c,DispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求,DispatcherServlet的存在下降了組件之間的耦合性。
- HandlerMapping:處理器映射器
HandlerMapping負責根據用戶請求找到Handler即處理器,springmvc提供了不一樣的映射器實現不一樣的映射方式,例如:配置文件方式,實現接口方式,註解方式等。
- Handler:處理器
Handler是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。因爲Handler涉及到具體的用戶業務請求,因此通常狀況須要程序員根據業務需求開發Handler。
- HandlAdapter:處理器適配器
經過HandlerAdapter對處理器進行執行,這是適配器模式的應用,經過擴展適配器能夠對更多類型的處理器進行執行。
- ViewResolver:視圖解析器
ViewResolver負責將處理結果生成View視圖,ViewResolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最後對View進行渲染將處理結果經過頁面展現給用戶。
- View:視圖
SpringMVC框架提供了不少的View視圖類型的支持,包括:jstlView、freemarkerView、pdfView等。咱們最經常使用的視圖就是jsp。通常狀況下須要經過頁面標籤或頁面模版技術將模型數據經過頁面展現給用戶,須要由程序員根據業務需求開發具體的頁面。
總結
在SpringMVC的各個組件中,處理器映射器、處理器適配器、視圖解析器稱爲springmvc的三大組件。其實真正須要程序員開發的就兩大塊:一個是Handler,一個是jsp,這樣的話,其實和Struts2就差很少了.瀏覽器