日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring mvc DispatchServlet 实现机制

發布時間:2024/9/30 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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功能實現中所必須使用的全局變量。

  • initMultipartResolver(context);
    初始化文件上傳的處理類
  • initLocaleResolver(context);
    初始化國際化配置的處理類
  • initThemeResolver(context);
    初始化主題資源的處理類
  • initHandlerMappings(context);
    初始化處理請求的類,主要負責處理請求調用Controller的處理類。
  • initHandlerAdapters(context);
    初始化HandlerAdapter的適配器
  • initHandlerExceptionResolvers(context);
    初始化異常處理類。
  • initRequestToViewNameTranslator(context);
    初始化視圖轉換器,用于直接將請求轉換為邏輯視圖名。
  • initViewResolvers(context);
    初始化視圖解析器,定義了如何通過view 名稱來解析對應View實例的行為
  • initFlashMapManager(context);
    初始化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 实现机制的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。