如今工做使用的是spring mvc ,以前有了解過spring mvc ,可是比較久了,並且當時沒有使用spring mvc作開發的,因此看了就完了,而實際開發中有比較少須要瞭解mvc的工做原理、流程,基本上配置能夠抄,再瞭解幾個註解就能夠進行開發了。如今有時間瞭解下mvc的工做原理,流程。html
主要參考文檔,http://docs.spring.io/spring/docs/3.2.17.RELEASE/spring-framework-reference/htmlsingle/ spring 的參考文檔。前端
spring mvc 的設計模式web
spring mvc 和其餘 web框架同樣都是前端控制器模式(front-controller),下圖是spring mvc 的請求處理流程圖。spring
能夠看出,請求進來後先由 front-controller處理選擇對應的映射handler,調用對應的handler、返回model數據,而後渲染輸出view。設計模式
dispatcherservlet安全
在spring mvc中,dispatcherservlet是核心類,同時也是front-controller。下面咱們瞭解dispatcherservlet類。mvc
一、dispatcherservlet 是一個標準servlet的實現,因此使用的方式,就是和普通的servlet同樣使用,在web.xml中配置,或者servlet3.0,在編碼配置,能夠繼承WebApplicationInitializer 或AbstractDispatcherServletInitializer
配置servlet。app
二、每個dispatcherservlet都有一個本身的webapplicationcontext對象。webapplicationcontext之間是不共享的,並且都繼承root application context ,並能夠覆蓋root context中定義的bean。框架
三、dispatcherservlet 就是front-controller。webapp
webapplicationcontext
每個WebApplicationContext中都有一些特殊的bean或者說咱們工做中關於spring mvc 的配置基本上都是WebApplicationContext的特定bean的配置。spring mvc 提供了默認的bean策略,在dispatcherservlet類目錄下的 Dispatcherservlet.properties文件中。使用<mvc:annotation-driven>能夠得到默認的實現。下面講一下這些特殊bean.
HandlerMapping 處理請求映射到具體的業務流程,以及攔截器。最受歡迎的實
現是支持註解實現,固然也有其餘的實現。
HandlerAdapter 輔助dispatcherservlet 處理調用具體的業務邏輯方法,它隔
離了調用的細節,例如處理註解、分解請求參數等。
HandlerExceptionResolver 處理異常與視圖的映射,複雜的異常處理代碼
ViewResolver 解析基於字符串的視圖名稱到具體的視圖。
LocaleResolver 國際化解決方案,根據本地的客戶端使用不一樣的展現
ThemeResolver 主題解決方案,支持個性化等。
MultipartResolver 解析多部分組成的請求,如上傳文件等。
FlashMapManager 用於將一個請求的屬性帶到其餘請求中,保存和查詢 輸入和
輸出 flashMap(閃存),一般用於重定向是攜帶參數問題的解決。
請求的處理流程(dispatcherservlet)
一、搜索webapplicationcontext 並綁定到請求中,當作request的一個屬性(attribute),使
得webapplicationcontext的controller以及其餘元素可使用。默認使用key
DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE綁定webapplicationcontext .
二、綁定區域解析bean(國際化)到請求中,確保在處理請求渲染的時候有解決處理方法,(可選
的)。
三、綁定主題解析bean ,一樣在渲染的時候使用,(可選)。
四、若是指定了文件解析bean(multi-part bean),請求會被檢查、解析。若是發現是multi-part 請求,請求被封裝爲MultipartHttpServletRequest爲處理準備。
五、搜索一個適當的處理者(handler),找處處理者,爲準備model或渲染,關聯執行鏈應的處
理者(前攔截器,後攔截器,控制器)。
六、若是業務邏輯執行完成並返回model,對應視圖被渲染,若是沒有model(多是被攔截器攔
截,安全等緣由),沒有視圖被渲染,由於請求已經完成了。
異常處理解析被聲明在webapplicationcontext 中,捕獲處理請求中拋出的異常,使用異常解
析器能夠定製處理異常行爲。
(以上有部份內容是按本身理解翻譯的,翻譯很差,請多多包涵)
概述到此結束