1. 程式人生 > >Spring MVC:DispatcherServlet

Spring MVC:DispatcherServlet

evel customize -c quest header multipart for comm 允許

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