最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Spring mvc DispatchServlet 實現(xiàn)機制

 更新時間:2017年09月30日 08:28:57   作者:jijs  
本篇文章主要介紹了詳解Spring mvc DispatchServlet 實現(xiàn)機制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在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)中所必須使用的全局變量。

  1. initMultipartResolver(context);初始化文件上傳的處理類
  2. initLocaleResolver(context);初始化國際化配置的處理類
  3. initThemeResolver(context);初始化主題資源的處理類
  4. initHandlerMappings(context);初始化處理請求的類,主要負責處理請求調(diào)用Controller的處理類。
  5. initHandlerAdapters(context);初始化HandlerAdapter的適配器
  6. initHandlerExceptionResolvers(context);初始化異常處理類。
  7. initRequestToViewNameTranslator(context);初始化視圖轉(zhuǎn)換器,用于直接將請求轉(zhuǎn)換為邏輯視圖名。
  8. initViewResolvers(context);初始化視圖解析器,定義了如何通過view 名稱來解析對應(yīng)View實例的行為
  9. initFlashMapManager(context);初始化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)文章

  • 分享5個Java接口性能提升的通用技巧

    分享5個Java接口性能提升的通用技巧

    作為后端開發(fā)人員,我們總是在編寫各種API。這些API在服務(wù)初期可能表現(xiàn)不錯,但隨著用戶數(shù)量的增長,一開始響應(yīng)很快的API越來越慢,這時候你就需要考慮如何優(yōu)化你的API性能了。在這篇文章中,我總結(jié)了一些行之有效的API性能優(yōu)化技巧,希望能給有需要的朋友一些幫助
    2023-01-01
  • 一文搞懂JMeter engine中HashTree的配置問題

    一文搞懂JMeter engine中HashTree的配置問題

    本文主要介紹了JMeter engine中HashTree的配置,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • java Random.nextInt()方法的具體使用

    java Random.nextInt()方法的具體使用

    這篇文章主要介紹了java Random.nextInt()方法的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • PowerJob?AbstractSqlProcessor方法工作流程源碼解讀

    PowerJob?AbstractSqlProcessor方法工作流程源碼解讀

    這篇文章主要為大家介紹了PowerJob?AbstractSqlProcessor方法工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • SpringMVC4.3?HttpMessageConverter接口實現(xiàn)源碼分析

    SpringMVC4.3?HttpMessageConverter接口實現(xiàn)源碼分析

    這篇文章主要為大家介紹了SpringMVC4.3?HttpMessageConverter接口實現(xiàn)源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • K均值聚類算法的Java版實現(xiàn)代碼示例

    K均值聚類算法的Java版實現(xiàn)代碼示例

    這篇文章主要介紹了K均值聚類算法的Java版實現(xiàn)代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 解決springboot自定義配置Boolean屬性不能生效的問題

    解決springboot自定義配置Boolean屬性不能生效的問題

    這篇文章主要介紹了解決springboot自定義配置Boolean屬性不能生效的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 基于Java實現(xiàn)考試管理系統(tǒng)

    基于Java實現(xiàn)考試管理系統(tǒng)

    這篇文章主要介紹了基于Java實現(xiàn)的考試管理系統(tǒng),項目運用到的技術(shù)有Springboot、Maven、Jpa、Vue等等,感興趣的小伙伴可以跟隨小編一起學習一下
    2021-12-12
  • 通Java接口上傳實現(xiàn)SMMS圖床

    通Java接口上傳實現(xiàn)SMMS圖床

    這篇文章主要介紹了通Java接口上傳實現(xiàn)SMMS圖床,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 詳解Java常用工具類—泛型

    詳解Java常用工具類—泛型

    這篇文章主要介紹了Java常用工具類—泛型,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03

最新評論

开封县| 峨山| 大港区| 饶河县| 沂南县| 安达市| 汉阴县| 资中县| 安丘市| 梁河县| 大新县| 北川| 若尔盖县| 宁远县| 吴江市| 五家渠市| 丰顺县| 安岳县| 福清市| 白沙| 鹤峰县| 夏河县| 静海县| 仁怀市| 分宜县| 南岸区| 上林县| 衡南县| 义乌市| 蒲江县| 娄烦县| 罗甸县| 白城市| 海淀区| 马龙县| 瑞金市| 文成县| 阆中市| 那坡县| 磴口县| 万宁市|