SpringMVC的九大組件


搭配這張轉載的圖使用更佳(SpringMVC工作原理圖)

1.HandlerMapping(處理器映射器)

  作用 : 尋找Handler(注解/配置文件/接口)

  首先解釋一下handler,handler代表實際可以處理請求的方法或者類,例如被注解@ResquestMapping所標記的方法,就可以看作一個Handler

  作用 : HandlerMapping的主要作用是根據請求的資源uri來查找對應的handler

2. HandlerAdapter(處理器適配器)

  作用 : 處理找到的Handler

  在我們找到對應的Handler時,我們則要開始處理Handler,因為Handler的實現多種多樣,所以對於Handler不同的內部結構需要進行一定的處理

       容器在初始化的時候會自動幫我們注入 (也可以自己配置)RequestMappingHandlerAdapter 、HttpRequestHandlerAdapter 和 SimpleControllerHandlerAdapter 這三個配置器。
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 }
  1. supports方法:是判斷該適配器是否支持這個HandlerMethod,就是當得到一個handler時,該接口子類該方法做判斷(就是類似handler instanceof Controller的判斷方式),用來得到適配這個handler的適配器子類。
  2. handle方法:用來執行控制器處理函數,獲取ModelAndView 。就是根據該適配器調用規則執行handler方法
  3. getLastModified方法:處理響應請求,控制客戶端的GET請求(如post請求不受影響)是否被真實響應還是直接響應為不修改(304),servlet的service方法根據getLastModified的返回值
  • HttpRequestHandlerAdapter可以執行 HttpRequestHandler 類型的 handler
  • SimpleControllerHandlerAdapter可以執行 Servlet 類型的 handler
  • RequestMappingHandlerAdapter可以執行 Controller 類型的 handler
  

3. HandlerExceptionResolver(異常處理器)

   作用 : 當我們在尋找和處理Handler時難免會出現一些問題(異常),這個時候就需要一個專門來處理異常的角色

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。

 
  
  

 

  
  



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM