Spring MVC 9大組件概述

  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中傳遞參數。

相關文章
相關標籤/搜索