1. 程式人生 > >Spring mvc中DispatcherServlet詳解

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