簡介
DispatcherServlet是前端控制器設計模式的實現,提供SpringWebMVC的集中訪問點,而且負責職責的分派,而且與spring IOC容器無縫集成,從而可以獲得Spring的優勢。
(前端控制器設計模式參閱這篇:設計模式之前端控制器模式)
職責和作用
其主要職責是調度工作,本身用於控制流程,具體為:
1.文件上傳解析,如果請求類型是multipart將通過MultipartResolver進行文件上傳解析;
2.通過HandlerMapping,將請求映射到處理器(返回一個HandlerExecutionChain,它包括一個處理器、多個HandlerInterceptor攔截器);
3.通過handlerAdapter支持多種類型的處理器(handlerExceptionChain中的處理器);
4.通過ViewResolver解析邏輯視圖名到具體視圖實現;
5.本地化解析;
6.渲染具體的視圖等;
7.如果執行過程中遇到異常將交給handlerExceptionResolver來解析;
DispatcherServler在web.xml中的配置
<servlet> <servlet-name>heiheihei</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet<servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>heiheihei</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
load-on-startup:表示啟動容器時刻初始化該servlet的順序;web.xml中load-on-startup的作用
url-pattern:表示哪些請求交給SpringwebMVC處理,“/”是用來定義默認servlet映射的。也可以如"*.html"表示攔截所有以html為擴展名的請求。默認使用WebApplicationContext作為上下文,spring默認配置文件為"/web-inf/[servlet名字]-servlet.xml"。
DispatcherServlet也可以配置自己的初始化參數,覆蓋默認配置:
1.contextClass:實現WebApplicationContext接口的類,當前的servet用它來創建上下文。如果這個參數沒有指定,默認使用XmlWebApplicationContext。
2.contextConfigLocation:傳給上下文實例(由contextClass指定)的字符串,用來指定上下文的位置。這個字符串可以被分成多個字符串(使用逗號作為分隔符)來支持多個上下文(在多個上下文的情況下,如果同一個bean被定義兩次,后面一個優先)。
3.namespace:WebApplicationContext命名空間。默認值是[server-name]-servlet。
因此可以通過以下方式添加初始化參數:
<servlet> <servlet-name></servlet-name> <servlet-class></servlet-class> <load-on-startup></load-on-startup> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classPath:spring-servlet.xml</param-value> </init-param> </servlet>
注意:如果使用如上配置,springwebMVC框架將加載"classPath:spring-servlet.xml"來初始化上下文。
上下文關系
集成web環境的通用配置:
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-common-config.xml, classpath:spring-budget-config.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
如上配置是spring集成web環境的通用配置;一般用於加載除web層的bean,以便與其他任何web框架集成。【contextConfigLocation:表示用於加載bean的配置文件;contextClass:表示用於加載bean的applicationContext實現類,默認webApplicationContext】
contextLoaderListener初始化的上下文和dispatcherServlet初始化的上下文關系:

從圖中可知:
1.contextLoaderListener初始化的上下文加載的bean是對於整個應用程序共享的,不管是使用什么表現層技術,一般如DAO層,Service層bean;
2.dispatcherServlet初始化的上下文加載的bean是只對spring Web MVC有效的bean,如Controller、handlerMapping、HandlerAdapter等等,該初始化上下文應該只加載web相關組件。
DispatcherServlet初始化順序
繼承體系:HttpServlet<-HttpServletBean<-FrameworkServlet<-DispatcherServlet;
1.httpServletBean繼承HttpServlet,因此在web容器啟動時將調用其init()方法,該初始化方法的主要作用是
①將servlet初始化參數(init-param)設置到該組件上(如contextAttribute/contextClass/namespace/contextConfigLocation),通過BeanWrapper簡化設值過程,方便后續使用;
②提供給子類初始化擴展點,initServletBean(),該方法由FrameworkServlet覆蓋。
2.FrameworkServlet繼承HttpServletBean,通過initServletBean()進行web上下文初始化,該方法主要覆蓋兩件事:
①初始化web上下文;
②提供給子類初始化擴展點。
3.DispatcherServlet繼承FrameworkServlet,並實現onRefresh()方法提供一些前端控制器相關的配置;主要作用:
①初始化spring web mvc使用的web上下文,並且可能指定父容器;
②初始化dispatcherServlet使用的策略,如handlerMapping,handlerAdapter;
DispatcherServlet中使用的特殊的bean
dispatcherServlet默認使用WebApplicationContext作為上下文,其中包含諸多bean:
1.controller:處理器/頁面控制器,做的事MVC中的C的事情,但控制邏輯轉移到前端控制器,用於對請求進行處理;
2.HandlerMapping:請求帶處理器的映射,如果映射成功返回一個HandlerExecutionChain對象(包含一個handler處理器對象,多個handlerInterceptor攔截器);如BeanNameUrlHandlerMapping將url與bean名字映射,映射成功的bean就是此處的處理器;
3.handlerAdapter:HandlerAdapter將會把處理器包裝為適配器,從而支持多種類型的處理器,即適配器設計模式的應用,從而很容易支持很多類型的處理器;如SimpleControllerHandlerAdapter將對實現了Controller接口的Bean進行適配器,並且調用處理器的handlerRequest方法進行功能處理;
4.ViewResolver:viewResolver將把邏輯視圖名解析為具體的view,通過這種策略模式,很容易更換其他試圖技術,如InternalResourceViewResolver將邏輯視圖名映射為jsp視圖;
5.LocalResover:本地化解析,因為Spring支持國際化,因此LocalResover解析客戶端的Locale信息從而方便進行國際化;
6.ThemeResolver:主題解析,通過它來實習縣一個頁面多套風格,即常見的類似於軟件皮膚效果;
7.MultipartResolver:文件上傳解析,用於支持文件上傳;
8.HandlerExceptionResolver;處理器異常解析,如果將異常映射到相應的統一錯誤界面,從而顯示用戶友好的界面;
9.RequestToViewNameTranslator:當處理器沒有返回邏輯視圖名等相關信息時,自動將請求url映射為邏輯視圖名;
10.FlashMapManager:用於管理FlashMap的策略接口,FlashMap用於存儲一個請求的輸出,當進入另一個請求時作為該請求的輸入,通常用於重定向場景。
