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