Spring MVC:DispatcherServlet
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);
}
initStrategies()方法會在DispatcherServlet對應的WebApplicationContext初始化後自動執行,此時DispatcherServlet上下文中的Bean已經初始化完畢。該方法的工作事先通過一定的發現機制查詢上下文中的組件Bean,如果找不到則裝配默認的組件實例。
Spring MVC定義了一套默認的組件實現類,也就是說即使不在Spring容器中顯式配置組件Bean,也會有一套可用的默認組件出現在DispatcherServlet中。Spring在spring.jar包的org/springframework/web/servlet類路徑定義了一個DispatcherServlet.properties配置文件,在其中指定了組件的默認實現類。
# Default implementation classes for DispatcherServlet‘s strategy interfaces. # Used as fallback when no matching beans are found in the DispatcherServlet context. # Not meant to be customized by application developers. org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping, org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter, org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter, org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver, org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver, org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
這裏還有一個比較重要的內容就是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。剩下的就是根據請求去獲得或者組裝需要的處理器就好了。
參考:
http://blog.csdn.net/zhuojiajin/article/details/46280007
Spring MVC:DispatcherServlet