要理解DispatcherServlet,首先看一下他的做用,先摘一段開濤的原話:
前端
DispatcherServlet是前端控制器設計模式的實現,提供Spring Web MVC的集中訪問點,並且負責職責的分派,並且與Spring IoC容器無縫集成,從而能夠得到Spring的全部好處。設計模式
何爲前端控制器設計模式呢?下面是一段摘自百度找到的文字:
app
前端控制器(front controller)主要提供一種能夠集中式管理請求的控制器,一個前端控制器能夠接受全部的客戶請求,將每一個請求遞交給相應的請求句柄,並適當地響應用戶。jsp
前端控制器也是表示層的設計模式,它的出現主要是因爲表示層一般須要控制和協調來自不一樣用戶的多個請求,而這種控制機制又根據不一樣的須要,可能會集中式控制或分散式控制。換句話說,就是應用系統須要對於表示層的請求提供一個集中式控制模塊,以提供各類系統服務,包括內容提取、視圖管理和瀏覽,若是系統中沒有這種集中式控制模塊或控制機制,每一個不一樣的系統服務都須要進行單獨的視圖處理,這樣代碼的重複性就會提升,導致系統開發代價提升。同時,若是沒有一個固定模塊管理視圖之間的瀏覽機制,導致其瀏覽功能下放於每一個不一樣的視圖中,最終必將使得系統的可維護性受到破壞。spa
你們不要在乎這些細節,大概知道這個設計模式的做用就是集中客戶請求,並負責職責的分派就行。重點在於,它與Spring IOC容器無縫集成,沒得說,同一家公司的東西,確定是無縫的。設計
如今來看下他的做用,摘自開濤的原文:orm
DispatcherServlet主要用做職責調度工做,自己主要用於控制流程,主要職責以下:對象
一、文件上傳解析,若是請求類型是multipart將經過MultipartResolver進行文件上傳解析;blog
二、經過HandlerMapping,將請求映射處處理器(返回一個HandlerExecutionChain,它包括一個處理器、多個HandlerInterceptor攔截器);接口
三、經過HandlerAdapter支持多種類型的處理器(HandlerExecutionChain中的處理器);
四、經過ViewResolver解析邏輯視圖名到具體視圖實現;
五、本地化解析;
六、渲染具體的視圖等;
七、若是執行過程當中遇到異常將交給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用於存儲一個請求的輸出,當進入另外一個請求時做爲該請求的輸入,一般用於重定向場景,後邊會細述。