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屬性確定優先順序的順序,值越小的優先順序越高。