標籤:style blog http io color ar os 使用 sp
要理解DispatcherServlet,首先看一下他的作用,先摘一段開濤的原話:
DispatcherServlet是前端控制器設計模式的實現,提供Spring Web MVC的集中訪問點,而且負責職責的指派,而且與Spring IoC容器無縫整合,從而可以獲得Spring的所有好處。
何為前端控制器設計模式呢?下面是一段摘自百度找到的文字:
前端控制器(front controller)主要提供一種可以集中式管理請求的控制器,一個前端控制器可以接受所有的客戶請求,將每個請求遞交給相應的請求控制代碼,並適當地響應使用者。
前端控制器也是展示層的設計模式,它的出現主要是由於展示層通常需要控制和協調來自不同使用者的多個請求,而這種控制機制又根據不同的需要,可能會集中式控制或分散式控制。換句話說,就是應用系統需要對於展示層的請求提供一個集中式控制模組,以提供各種系統服務,包括內容提取、視圖管理和瀏覽,如果系統中沒有這種集中式控制模組或控制機制,每個不同的系統服務都需要進行單獨的視圖處理,這樣代碼的重複性就會提高,致使系統開發代價提高。同時,如果沒有一個固定模組管理檢視之間的瀏覽機制,致使其瀏覽功能下放於每個不同的視圖中,最終必將使得系統的可維護性受到破壞。
大家不要在意這些細節,大概知道這個設計模式的作用就是集中客戶請求,並負責職責的指派就行。重點在於,它與Spring IOC容器無縫整合,沒得說,同一家公司的東西,肯定是無縫的。
現在來看下他的作用,摘自開濤的原文:
DispatcherServlet主要用作職責調度工作,本身主要用於控制流程程,主要職責如下:
1、檔案上傳解析,如果請求類型是multipart將通過MultipartResolver進行檔案上傳解析;
2、通過HandlerMapping,將請求映射到處理器(返回一個HandlerExecutionChain,它包括一個處理器、多個HandlerInterceptor攔截器);
3、通過HandlerAdapter支援多種類型的處理器(HandlerExecutionChain中的處理器);
4、通過ViewResolver解析邏輯視圖名到具體視圖實現;
5、本地化解析;
6、渲染具體的視圖等;
7、如果執行過程中遇到異常將交給HandlerExceptionResolver來解析。
欲知後事如何,請看http://jinnianshilongnian.iteye.com/blog/1602617
分解。再加點料:
DispatcherServlet預設使用WebApplicationContext作為上下文,因此我們來看一下該上下文中有哪些特殊的Bean:
1、Controller:處理器/頁面控制器,做的是MVC中的C的事情,但控制邏輯轉移到前端控制器了,用於對請求進行處理;
2、HandlerMapping:請求到處理器的映射,如果映射成功返回一個HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象;如BeanNameUrlHandlerMapping將URL與Bean名字映射,映射成功的Bean就是此處的處理器;
3、HandlerAdapter:HandlerAdapter將會把處理器封裝為適配器,從而支援多種類型的處理器,即適配器設計模式的應用,從而很容易支援很多類型的處理器;如SimpleControllerHandlerAdapter將對實現了Controller介面的Bean進行適配,並且掉處理器的handleRequest方法進行功能處理;
4、ViewResolver:ViewResolver將把邏輯視圖名解析為具體的View,通過這種策略模式,很容易更換其他視圖技術;如InternalResourceViewResolver將邏輯視圖名映射為jsp視圖;
5、LocalResover:本地化解析,因為Spring支援國際化,因此LocalResover解析用戶端的Locale資訊從而方便進行國際化;
6、ThemeResovler:主題解析,通過它來實現一個頁面多套風格,即常見的類似於軟體皮膚效果;
7、MultipartResolver:檔案上傳解析,用於支援檔案上傳;
8、HandlerExceptionResolver:處理器異常解析,可以將異常映射到相應的統一錯誤介面,從而顯示方便使用的介面(而不是給使用者看到具體的錯誤資訊);
9、RequestToViewNameTranslator:當處理器沒有返回邏輯視圖名等相關資訊時,自動將請求URL映射為邏輯視圖名;
10、FlashMapManager:用於管理FlashMap的策略介面,FlashMap用於儲存一個請求的輸出,當進入另一個請求時作為該請求的輸入,通常用於重新導向情境,後邊會細述。
二 理解DispatcherServlet