搭配這張轉載的圖使用更佳(SpringMVC工作原理圖)
1.HandlerMapping(處理器映射器)
作用 : 尋找Handler(注解/配置文件/接口)
首先解釋一下handler,handler代表實際可以處理請求的方法或者類,例如被注解@ResquestMapping所標記的方法,就可以看作一個Handler
作用 : HandlerMapping的主要作用是根據請求的資源uri來查找對應的handler
2. HandlerAdapter(處理器適配器)
作用 : 處理找到的Handler
在我們找到對應的Handler時,我們則要開始處理Handler,因為Handler的實現多種多樣,所以對於Handler不同的內部結構需要進行一定的處理
1 public abstract interface HandlerAdapter 2 { 3 public abstract boolean supports(Object paramObject); 4 5 public abstract ModelAndView handle(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse, Object paramObject) 6 throws Exception; 7 8 public abstract long getLastModified(HttpServletRequest paramHttpServletRequest, Object paramObject); 9 }
- supports方法:是判斷該適配器是否支持這個HandlerMethod,就是當得到一個handler時,該接口子類該方法做判斷(就是類似handler instanceof Controller的判斷方式),用來得到適配這個handler的適配器子類。
- handle方法:用來執行控制器處理函數,獲取ModelAndView 。就是根據該適配器調用規則執行handler方法
- getLastModified方法:處理響應請求,控制客戶端的GET請求(如post請求不受影響)是否被真實響應還是直接響應為不修改(304),servlet的service方法根據getLastModified的返回值
- HttpRequestHandlerAdapter可以執行
HttpRequestHandler
類型的handler
- SimpleControllerHandlerAdapter可以執行
Servlet
類型的handler
- RequestMappingHandlerAdapter可以執行
Controller
類型的handler
3. HandlerExceptionResolver(異常處理器)
4. ViewResolver(頁面渲染處理器)
作用 : 根據視圖名(String類型)和Locale(語言環境),獲得最終的View類型的視圖.
View是用來渲染頁面的,而ViewResolver所要做的就是找到渲染所用的模板和技術(頁面類型)
- ModelAndView : 包含視圖名稱或視圖對象以及一些模型屬性
public interface ViewResolver { View resolveViewName(String viewName, Locale locale) throws Exception; }
該接口只有一個方法,通過view name 解析出View。同樣Spring提供了豐富的ViewResolver實現用來解析不同的View
5. RequestToViewNameTranslator(視圖名稱翻譯器)
作用 : 當沒有ViewName時,從請求中解析獲取視圖名
有的Handler處理完后並沒有設置View也沒有設置ViewName時,需要從request獲取ViewName,而如何從request中獲取ViewName就是RequestToViewNameTranslator要做的事情了.
當 ModelAndView 對象不為null,但是它的 View 對象為null,則需要通過 RequestToViewNameTranslator 組件根據請求解析出一個默認的視圖名稱。
6. LocaleResolver(當前環境處理器)
作用 : 協助view的解析
View的解析需要兩個參數,一個是視圖名,另一個是Locale(語言環境).視圖名是處理器返回的,而Locale是由LocaleResolver從request中解析得到.
這就相當於配置數據庫的方言一樣,有了這個就可以對不同區域的用戶顯示不同的結果。
SpringMVC主要有兩個地方用到了Locale:
- 一是ViewResolver視圖解析的時候;
- 二是用到國際化資源或者主題的時候。
public interface LocaleResolver { /** * 從請求中,解析出要使用的語言。例如,請求頭的 "Accept-Language" */ Locale resolveLocale(HttpServletRequest request); /** * 設置請求所使用的語言 */ void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale); }
7.ThemeResolver(主題處理器)
作用 : 主題處理器用於解析主題,相當於解析系統的整體樣式和風格.
SpringMVC的主題也支持國際化,同一個主題不同區域也可以顯示不同的風格。
SpringMVC中跟主題相關的類有ThemeResolver、ThemeSource和Theme。主題是通過一系列資源來具體體現的,要得到一個主題的資源,首先要得到資源的名稱,這是ThemeResolver的工作。然后通過主題名稱找到對應的主題(可以理解為一個配置)文件,這是ThemeSource的工作。最后從主題中獲取資源就可以了。
8.MultipartResolver(文件處理器)
作用 : 用於處理上傳請求。處理方法是將普通的request包裝成MultipartHttpServletRequest,后者可以直接調用getFile方法獲取File,如果上傳多個文件,還可以調用getFileMap得到FileName->File結構的Map。此組件中一共有三個方法,作用分別是判斷是不是上傳請求,將request包裝成MultipartHttpServletRequest、處理完后清理上傳過程中產生的臨時資源。
MultipartResolver
會將 HttpServletRequest 封裝成 MultipartHttpServletRequest對象,便於獲取參數信息以及上傳的文件
public interface MultipartResolver { /** * 是否為 multipart 請求 */ boolean isMultipart(HttpServletRequest request); /** * 將 HttpServletRequest 請求封裝成 MultipartHttpServletRequest 對象 */ MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException; /** * 清理處理 multipart 產生的資源,例如臨時文件 */ void cleanupMultipart(MultipartHttpServletRequest request); }
9.FlashMapManager(參數傳遞管理器)
- FlashMap,FlashMapManager
- 解析如下:
后端有請求轉發和請求重定向兩種方式,請求轉發的時候Request是同一個,所以可以在轉發后拿到轉發前的所有信息;但是重定向后 Request是新的,如果需要在重定向前設置一些信息,重定向后獲取使用應該怎么辦法呢?
這就是 FlashMap存在的意義,FlashMap 借助 session 重定向前通過 FlashMapManager將信息放入FlashMap,重定向后 再借助 FlashMapManager 從 session中找到重定向后需要的 FalshMap。