中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Spring mvc中實現DispatchServlet的原理是什么

發布時間:2020-12-08 15:48:05 來源:億速云 閱讀:335 作者:Leah 欄目:編程語言

在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 源碼解析

在Spring mvc中實現DispatchServlet的原理是什么

DispatcherServlet 的 init() 方法在 HttpServletBean() 中實現的

init()

在Spring mvc中實現DispatchServlet的原理是什么

  1. 解析DispatcherServlet 配置的參數,封裝成 ServletConfigPropertyValues對象。
  2. 將當前Servlet 類型的實例轉換成BeanWrapper類型的實例。以便使用Spring中提供的注入功能進行對應的屬性注入。這些屬性如contextAttribute、contextClass、nameSpace、contextConfigLocation 等,都可以在web.xml 文件中以初始化參數的方式配置在servlet 的聲明中。
  3. 調用 initServletBean() 初始化servletBean。

onRefresh() 方法

在初始化servletBean的時候,最終會調用 onRefresh() 方法,該方法主要是刷新Spring在web功能實現中所必須使用的全局變量。

在Spring mvc中實現DispatchServlet的原理是什么

  1. initMultipartResolver(context);初始化文件上傳的處理類
  2. initLocaleResolver(context);初始化國際化配置的處理類
  3. initThemeResolver(context);初始化主題資源的處理類
  4. initHandlerMappings(context);初始化處理請求的類,主要負責處理請求調用Controller的處理類。
  5. initHandlerAdapters(context);初始化HandlerAdapter的適配器
  6. initHandlerExceptionResolvers(context);初始化異常處理類。
  7. initRequestToViewNameTranslator(context);初始化視圖轉換器,用于直接將請求轉換為邏輯視圖名。
  8. initViewResolvers(context);初始化視圖解析器,定義了如何通過view 名稱來解析對應View實例的行為
  9. initFlashMapManager(context);初始化Flash Map,提供一個請求存儲屬性,可供其它請求使用。

DispatchServlet的請求處理邏輯

servlet 接受到請求后,會調用service() 方法,然后service根據HTTP響應的請求方法進行調用響應的邏輯處理。

在Spring mvc中實現DispatchServlet的原理是什么

從類結構中,可以看出SpringMVC 支持 GET、POST、PUT、DELETE、OPTIONS、TRACE方法

在Spring mvc中實現DispatchServlet的原理是什么

從代碼中,我們發現這幾個方法交給 processRequest() 來進行處理請求。

processRequest()->doService()->doDispatch()
通過跟蹤代碼,最終處理請求的核心代碼在doDispatch()方法中。

doDispatch() 方法

在Spring mvc中實現DispatchServlet的原理是什么

  1. 檢查該請求是否是文件上傳請求,如果是則把request轉換為 MultipartHttpServletRequest類型。
  2. 根據request信息查找對應的Handler,如果沒有找到對應的Handler,則通過response反饋錯誤信息。
  3. 通過當前的handler 查找對應的HandlerAdapter
  4. 判斷該HTTP請求是不是HEAD或GET請求,如果是則檢查HTTP請求頭部的LastModified屬性,來判斷該頁面是否需要重新加載。

在Spring mvc中實現DispatchServlet的原理是什么

  1. applyPreHandle() 執行該請求所匹配的攔截器,并調用所有匹配攔截器的preHandle()方法,進行處理
  2. 調用handle() 方法去根據請求路徑去調用用戶實現的Controller實現邏輯
  3. applyPostHandle()執行該請求所有匹配的攔截器,并調用所有匹配攔截器的postHandle()方法,進行處理
  4. processDispatchResult()處理頁面跳轉和調用攔截器的afterCompletion() 方法

processDispatchResult() 方法

在Spring mvc中實現DispatchServlet的原理是什么

  1. 處理異常信息
  2. 如果Controller成功返回了ModelAndView,則通過render()方法進行響應相應的頁面信息
  3. 執行完畢后,執行該請求所有匹配的攔截器,并調用所有匹配攔截器的afterCompletion()方法,進行處理

看完上述內容,你們掌握在Spring mvc中實現DispatchServlet的原理是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泰州市| 台江县| 聊城市| 赤峰市| 新泰市| 泗水县| 铜山县| 丽江市| 金阳县| 灯塔市| 察隅县| 牡丹江市| 富民县| 永川市| 巫溪县| 依安县| 洪湖市| 宁陵县| 深圳市| 吴川市| 定西市| 尖扎县| 扶风县| 拉萨市| 庄浪县| 高陵县| 莒南县| 如东县| 遵化市| 太白县| 信宜市| 盐城市| 台南市| 遵义市| 博爱县| 潞城市| 布尔津县| 剑阁县| 达拉特旗| 榆中县| 广德县|