簡介
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>
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用于存盤一個請求的輸出,當進入另一個請求時作為該請求的輸入,通常用于重定向場景。
uj5u.com熱心網友回復:
寫一遍理解的更好,SpringMVC原理之手寫:https://blog.csdn.net/songzehao/article/details/86759674
手寫Spring MVC框架的github原始碼地址:
https://github.com/oaHeZgnoS/repo2019
uj5u.com熱心網友回復:
樓主講得真好
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/14401.html
標籤:Java EE
