javascript
Spring mvc DispatchServlet 实现机制
在Spring中, ContextLoaderListener只是輔助類,在web 容器啟動的時候查找并創(chuàng)建WebApplicationContext對象,通過該對象進行加載spring的配置文件。而真正的邏輯實現(xiàn)其實是在DispatcherServlet中進行的,DispatcherServlet是實現(xiàn)servlet接口的實現(xiàn)類。
DispatcherServlet 在 web.xml 中的配置如下:
<servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup> </servlet> <servlet-mapping><servlet-name>spring</servlet-name><url-pattern>/</url-pattern><!-- 如果寫斜杠的話那就表示請求是否加后綴都可以 --> </servlet-mapping>DispatcherServlet 源碼解析
DispatcherServlet 的 init() 方法在 HttpServletBean() 中實現(xiàn)的
init()
1. 解析DispatcherServlet 配置的參數(shù),封裝成 ServletConfigPropertyValues對象。
2. 將當前Servlet 類型的實例轉(zhuǎn)換成BeanWrapper類型的實例。以便使用Spring中提供的注入功能進行對應(yīng)的屬性注入。這些屬性如contextAttribute、contextClass、nameSpace、contextConfigLocation 等,都可以在web.xml 文件中以初始化參數(shù)的方式配置在servlet 的聲明中。
3. 調(diào)用 initServletBean() 初始化servletBean。
onRefresh() 方法
在初始化servletBean的時候,最終會調(diào)用 onRefresh() 方法,該方法主要是刷新Spring在web功能實現(xiàn)中所必須使用的全局變量。
初始化文件上傳的處理類
初始化國際化配置的處理類
初始化主題資源的處理類
初始化處理請求的類,主要負責處理請求調(diào)用Controller的處理類。
初始化HandlerAdapter的適配器
初始化異常處理類。
初始化視圖轉(zhuǎn)換器,用于直接將請求轉(zhuǎn)換為邏輯視圖名。
初始化視圖解析器,定義了如何通過view 名稱來解析對應(yīng)View實例的行為
初始化Flash Map,提供一個請求存儲屬性,可供其它請求使用。
DispatchServlet的請求處理邏輯
servlet 接受到請求后,會調(diào)用service() 方法,然后service根據(jù)HTTP響應(yīng)的請求方法進行調(diào)用響應(yīng)的邏輯處理。
從類結(jié)構(gòu)中,可以看出SpringMVC 支持 GET、POST、PUT、DELETE、OPTIONS、TRACE方法
從代碼中,我們發(fā)現(xiàn)這幾個方法交給 processRequest() 來進行處理請求。
processRequest()->doService()->doDispatch()
通過跟蹤代碼,最終處理請求的核心代碼在doDispatch()方法中。
doDispatch() 方法
1. 檢查該請求是否是文件上傳請求,如果是則把request轉(zhuǎn)換為 MultipartHttpServletRequest類型。
2. 根據(jù)request信息查找對應(yīng)的Handler,如果沒有找到對應(yīng)的Handler,則通過response反饋錯誤信息。
3. 通過當前的handler 查找對應(yīng)的HandlerAdapter
4. 判斷該HTTP請求是不是HEAD或GET請求,如果是則檢查HTTP請求頭部的LastModified屬性,來判斷該頁面是否需要重新加載。
1. applyPreHandle() 執(zhí)行該請求所匹配的攔截器,并調(diào)用所有匹配攔截器的preHandle()方法,進行處理
2. 調(diào)用handle() 方法去根據(jù)請求路徑去調(diào)用用戶實現(xiàn)的Controller實現(xiàn)邏輯
3. applyPostHandle()執(zhí)行該請求所有匹配的攔截器,并調(diào)用所有匹配攔截器的postHandle()方法,進行處理
4. processDispatchResult()處理頁面跳轉(zhuǎn)和調(diào)用攔截器的afterCompletion() 方法
processDispatchResult() 方法
1. 處理異常信息
2. 如果Controller成功返回了ModelAndView,則通過render()方法進行響應(yīng)相應(yīng)的頁面信息
3. 執(zhí)行完畢后,執(zhí)行該請求所有匹配的攔截器,并調(diào)用所有匹配攔截器的afterCompletion()方法,進行處理
想了解更多精彩內(nèi)容請關(guān)注我的公眾號
本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書
GIT地址:http://git.oschina.net/brucekankan/
點擊這里快速進入GIT
總結(jié)
以上是生活随笔為你收集整理的Spring mvc DispatchServlet 实现机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring bean 标签加载、解析过
- 下一篇: Spring mvc HandlerM