1. 程式人生 > >SpringMVC學習(三)詳解 Dispatcher

SpringMVC學習(三)詳解 Dispatcher

前端控制器 Dispatcherservlet 截獲請求後做了什麼工作呢?DispatcherServlet 又是如何分派請求的呢?

分析DispatcherServlet 原始碼如下:

protected void initStrategies(ApplicationContext context) {
    //初始化檔案上傳檔案解析器
        initMultipartResolver(context);
    //初始化本地化解析器
        initLocaleResolver(context);
    //初始化主題解析器
        initThemeResolver(context);
    //初始化處理器對映器
        initHandlerMappings(context);
    //初始化處理器介面卡
        initHandlerAdapters(context);
    //初始化異常處理解析器
        initHandlerExceptionResolvers(context);
    //初始化請求路徑轉換為ViewName 的檢視名稱解析器
        initRequestToViewNameTranslator(context);
  //初始化檢視解析器,通過ViewResolver解析邏輯檢視名到具體檢視實現
        initViewResolvers(context);
    //初始化flash影射管理器 主要管理flashmap,比如RedirectAttributes 的屬性會放到這個裡面,預設使用的是SessionFlashMapManager
        initFlashMapManager(context);
    }


initStrategies 方法WebApplicationContext 初始化後自動執行,自動掃描上下文的Bean,根據名稱或型別匹配機制查詢自定義的元件,如若沒有則會裝配一套Sopring預設元件。在org.springframework.web.servlet路徑下有一個DispatcherServlet.properties 配置檔案,該檔案指定了 DispatcherServlet 使用的預設元件。

如果想要使用自定義型別的元件,則只需要在Spring 配置檔案中配置自定義Bean 元件即可。SpringMVC 如果發現上下文中有使用者自定義的元件,就不會使用預設的元件了。

以下是DispatcherServlet裝配每種元件的細節:

本地化解析器。(只允許一個例項)

查詢名為localeResolver、型別為.LocaleResolver的Bean 作為該型別的元件。如果沒有找到,則使用預設的AcceptHeaderLocaleResolver作為該型別的元件。

主題解析器。(只允許一個例項)

查詢名為themeResolver、型別為ThemeResolver的Bean作為該型別的元件,如果沒有找到,則使用預設的FixedThemeResovler作為該型別元件。

處理器對映器。(允許多個例項)

當detectAllHandlerMappings 的屬性為true(預設為true),則查詢所有型別為HandlerMapping 的Bean,將它們作為該型別元件。當detectAllHandlerMappings 的屬性為false ,則查詢名為handlerMapping、型別為HandlerMapping 的Bean 作為該型別元件。如果通過以上兩種方式都未找到,則使用BeanNameUrlHandlerMapping實現建立該型別元件。

處理器介面卡。(允許多個例項)

當detectAllHandlerMappings 的屬性為true,則查詢所有型別為HandlerAdapter 的Bean,將它們作為該型別的元件。當detectAllHandlerMappings 的屬性為false,則查詢名為 handlerAdapter、型別為HandlerAdapter 的Bean。如果通過以上兩種方式都未找到,則使用DispatcherServlet.properties 配置檔案中指定的三個實現類分別建立一個介面卡,並將其新增到介面卡列表中。

處理器異常解析器。(允許多個例項)

當detectAllHandlerExceptionResovlers 的屬性為true(預設為true),則查詢所有型別為HandlerExceptionResovler 的Bean,將它們作為該型別的元件。當detectAllHandlerExceptionResolvers 的屬性為false,則查詢名為 handlerExceptionResolver、型別為HandlerExceptionResolver 的Bean。如果通過以上兩種方式都未找到,則使用DispatcherServlet.properties 配置檔案中定義的預設實現類(該檔案沒有預設的實現類,需要使用者自定義實現類,將其新增到DispatcherServlet.properties配置檔案中)。

檢視名稱解析器。(只允許一個例項)

查詢名為viewNameTranslator、型別為RequestToViewNameTranslator的Bean作為該型別元件,如果沒找到,則使用預設的實現類 DefaultRequestToViewNameTranslatro 作為該型別的元件。

檢視解析器(允許多個例項)

當detectAllViewResolvers 的屬性為true(預設為true),則查詢所有型別為ViewResolver 的Bean,將它們作為該型別的元件。當detectAllViewResovlers 的屬性為false ,則查詢名為 viewResovlers 、型別為ViewResolver 的Bean。如果通過以上兩種方式都未找到,則查詢 DispatcherServlet.properties 配置檔案中定義的預設實現類 InternalResourceViewResolver 作為該型別的元件。

檔案上傳解析器。(只允許一個例項)

查詢名為muliipartResolver、型別為MuliipartResolver 的Bean 作為該型別的元件,如果使用者沒有在上下文中顯式定義MuliipartResolver 型別的元件,則 DispatcherServlet將不會載入該型別的元件。

FlashMap對映管理器

查詢名為 FlashMapManager、型別為SessionFlashMapManager 的Bean 作為該型別的元件,用於管理FlashMap,即資料預設儲存在HttpSession 中。

DispatcherServlet裝配的各種元件有些只允許一個例項,有些則允許多個例項,需要注意這點。

如果同一型別的元件存在多個,那麼它們將通過Order屬性確定優先順序的順序,值越小的優先順序越高。