Spring學習總結(2.2)-Spring MVC:DispatcherServlet,quartz2.2.1spring
DispatcherServlet是SpringMVC的前端控制器,換句話說它是SpringMVC的入口。即所有的請求都要經過它才能流轉,所以稱它為中央控制器也是可以的。這篇部落格想要講的是,它作為中央控制器是如何流轉或者說分發請求的。
配置
<servlet> <servlet-name>action</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-mvc.xml,classpath:config/applicationContext-common.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
以上是DispatcherServlet的配置,和平常的Servlet配置沒什麼差別。從servlet-mapping的配置知道,它攔截了所有請求。當然,springMVC允許配置多個DispatcherServlet,只是每一個都會帶著自己的WebApplicationContext也就是對應的處理請求的bean的配置,裡面主要是Controller,HandlerMapping,ViewResolver。這裡這麼說可能還是不知道我說什麼,我們繼續往下看。
初始化 初始化的源碼如下:
protected void initStrategies(ApplicationContext context){ initMultipartResolver(context); initLocaleResolver(context); initThemeResolver(context); initHandlerMappings(context); initHandlerAdapters(context); initHandlerExceptionResolvers(context); initRequestToViewNameTranslator(context); initViewResolvers(context); initFlashMapManager(context); }
DispatcherServlet的初始化過程就是從容器裡取得了一系列的Bean持有,基本的內容如下:
①初始化上傳檔案解析器(直譯為多部分請求解析器)
②初始化本地化解析器
③初始化主題解析器
④初始化處理器映射器
⑤初始化處理器適配器
⑥初始化處理器異常解析器
⑦初始化請求到視圖名翻譯器
⑧初始化視圖解析器
initStrategies()方法會在DispatcherServlet對應的WebApplicationContext初始化後自動執行,此時DispatcherServlet上下文中的Bean已經初始化完畢。該方法的工作事先通過一定的發現機制查詢上下文中的組件Bean,如果找不到則裝配預設的組件執行個體。
Spring MVC定義了一套預設的組件實作類別,也就是說即使不在Spring容器中顯式配置組件Bean,也會有一套可用的預設組件出現在DispatcherServlet中。Spring在spring.jar包的org/springframework/web/servlet類路徑定義了一個DispatcherServlet.properties設定檔,在其中指定了組件的預設實作類別。
這裡還有一個比較重要的內容就是WebApplicationContext的層次關係。全域的WebApplicationContext與DispatcherServlet的WebApplicationContext之間是父子關係,子可以擷取到,覆寫父中定義的Bean,反之不行。也就是說,DispatcherServlet享有了Spring提供的服務。或者說它繼承了Spring的一切特性。
DispatcherServlet組件說明
這部分可以對應著SpringMVC的基本流程圖來看,其中①上傳檔案解析器 ②本地化解析器 ③主題解析器 圖裡沒有體現,除了上傳檔案解析器知道是上傳檔案使用的,剩下兩個目前也還沒有查它們什麼功能。這裡就結合圖說說相關的其他解析器的作用。
HandlerMapping 首先,我們知道真正處理請求的Bean,也就是Controller都是在WebApplicationContext容器裡面的。這個HandlerMapping的作用就是根據你的請求地址,去容器中擷取對應的Controller的。我們可以指定HandlerMapping,如果沒有指定就預設使用使用BeanNameUrlHandlerMapping實作類別。
HandlerAdapter HandlerAdapter將會把處理器封裝為適配器,從而支援多種類型的處理器,即適配器設計模式的應用,從而很容易支援很多類型的處理器;如SimpleControllerHandlerAdapter將對實現了Controller介面的Bean進行適配,並且掉處理器的handleRequest方法進行功能處理;
ViewResolver ViewResolver將把邏輯視圖名解析為具體的View,通過這種策略模式,很容易更換其他視圖技術;如InternalResourceViewResolver將邏輯視圖名映射為jsp視圖
小結:DispatcherServlet作為中央控制器,它通過持有了WebApplicationContext就持有了所有它工作所需要的Bean。剩下的就是根據請求去獲得或者組裝需要的處理器就好了。