SpringMVC中的Servlet一共有三個層次,分別是HttpServletBean、FrameworkServlet和 DispatcherServlet。HttpServletBean直接繼承自java的HttpServlet,其做用是將Servlet中配置的參數設置到相應的屬性;FrameworkServlet初始化了WebApplicationContext,DispatcherServlet初始化了自身的9個組件。
本篇博客的內容就是對9個組件作個簡單概述。
在學習9個組件以前,咱們須要先了解Handler的概念,也就是處理器。它直接應對着MVC中的C也就是Controller層,它的具體表現形式有不少,能夠是類,也能夠是方法。在Controller層中@RequestMapping標註的全部方法均可以當作是一個Handler,只要能夠實際處理請求就能夠是Handler。
(1)HandlerMapping
是用來查找Handler的。在SpringMVC中會有不少請求,每一個請求都須要一個Handler處理,具體接收到一個請求以後使用哪一個Handler進行處理呢?這就是HandlerMapping須要作的事。css
1 public interface HandlerMapping 2 { 3 HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception; 4 }
咱們能夠看到HandlerMapping接口中只定義了一個方法,就是經過request找到HandlerExecutionChain,而HandlerExecutionChain包裝了一個Handler和一組Interceptors。html
(2) HandlerAdapter
從名字上看,它就是一個適配器。由於SpringMVC中的Handler能夠是任意的形式,只要能處理請求就ok,可是Servlet須要的處理方法的結構倒是固定的,都是以request和response爲參數的方法。如何讓固定的Servlet處理方法調用靈活的Handler來進行處理呢?這就是HandlerAdapter要作的事情。任意形式的Handler經過使用適配器,能夠「轉換」成固定形式,而後交給Servlet來處理。每種Handler都要有對應的HandlerAdapter才能處理請求。java
1 public interface HandlerAdapter { 2 3 /** 4 * 判斷是否支持傳入的handler 5 */ 6 boolean supports(Object handler); 7 8 /** 9 * 使用給定的handler處理請求 10 */ 11 ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; 12 13 /** 14 * 返回上次修改時間,能夠返回-1表示不支持 15 */ 16 long getLastModified(HttpServletRequest request, Object handler); 17 18 }
(3)HandlerExceptionResolver
其它組件都是用來幹活的。在幹活的過程當中不免會出現問題,出問題後怎麼辦呢?這就須要有一個專門的角色對異常狀況進行處理,在SpringMVC中就是HandlerExceptionResolver。具體來講,此組件的做用是根據異常設置ModelAndView,以後再交給render方法進行渲染。咱們來看下HandlerExceptionResolver的接口定義:app
1 public interface HandlerExceptionResolver { 2 3 ModelAndView resolveException( 4 HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex); 5 6 }
從上面的分析中咱們能夠知道HandlerExceptionResolver只能處理頁面渲染以前的異常,頁面渲染過程當中的異常,它是不能處理的,這時可讓容器跳轉到指定的錯誤頁面來處理異常。學習
(4)ViewResolver
ViewResolver用來將String類型的視圖名和Locale解析爲View類型的視圖。View是用來渲染頁面的,也就是將程序返回的參數填入模板裏,生成html(也多是其它類型)文件。這裏就有兩個關鍵問題:使用哪一個模板?用什麼技術(規則)填入參數?這實際上是ViewResolver主要要作的工做,ViewResolver須要找到渲染所用的模板和所用的技術(也就是視圖的類型)進行渲染,具體的渲染過程則交由不一樣的視圖本身完成。spa
1 public interface ViewResolver { 2 3 View resolveViewName(String viewName, Locale locale) throws Exception; 4 5 }
(5)RequestToViewNameTranslator
ViewName是根據ViewName查找View,但有的Handler處理完後並無設置View也沒有設置ViewName,這時就須要RequestToViewNameTranslator從request中找到默認的View了。如何從request中獲取ViewName就是RequestToViewNameTranslator要作的事情了。RequestToViewNameTranslator在Spring MVC容器裏只能夠配置一個,因此全部request到ViewName的轉換規則都要在一個Translator裏面所有實現。code
1 public interface RequestToViewNameTranslator { 2 3 String getViewName(HttpServletRequest request) throws Exception; 4 5 }
(6)LocaleResolver
解析視圖須要兩個參數:一是視圖名,另外一個是Locale。視圖名是處理器返回的,Locale是從哪裏來的?這就是LocaleResolver要作的事情。LocaleResolver用於從request解析出Locale,Locale就是zh-cn之類,表示一個區域,有了這個就能夠對不一樣區域的用戶顯示不一樣的結果。SpringMVC主要有兩個地方用到了Locale:一是ViewResolver視圖解析的時候;二是用到國際化資源或者主題的時候。htm
(7)ThemeResolver
用於解析主題。SpringMVC中一個主題對應一個properties文件,裏面存放着跟當前主題相關的全部資源、如圖片、css樣式等。SpringMVC的主題也支持國際化,同一個主題不一樣區域也能夠顯示不一樣的風格。SpringMVC中跟主題相關的類有 ThemeResolver、ThemeSource和Theme。主題是經過一系列資源來具體體現的,要獲得一個主題的資源,首先要獲得資源的名稱,這是ThemeResolver的工做。而後經過主題名稱找到對應的主題(能夠理解爲一個配置)文件,這是ThemeSource的工做。最後從主題中獲取資源就能夠了。blog
(8)MultipartResolver
用於處理上傳請求。處理方法是將普通的request包裝成MultipartHttpServletRequest,後者能夠直接調用getFile方法獲取File,若是上傳多個文件,還能夠調用getFileMap獲得FileName->File結構的Map。此組件中一共有三個方法,做用分別是判斷是否是上傳請求,將request包裝成MultipartHttpServletRequest、處理完後清理上傳過程當中產生的臨時資源。繼承
(9)FlashMapManager
用來管理FlashMap的,FlashMap主要用在redirect中傳遞參數。