Spring mvc中DispatcherServlet詳解


簡介

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用於存儲一個請求的輸出,當進入另一個請求時作為該請求的輸入,通常用於重定向場景。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM