欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Spring mvc DispatchServlet 實(shí)現(xiàn)機(jī)制

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

在Spring中, ContextLoaderListener只是輔助類(lèi),在web 容器啟動(dòng)的時(shí)候查找并創(chuàng)建WebApplicationContext對(duì)象,通過(guò)該對(duì)象進(jìn)行加載spring的配置文件。而真正的邏輯實(shí)現(xiàn)其實(shí)是在DispatcherServlet中進(jìn)行的,DispatcherServlet是實(shí)現(xiàn)servlet接口的實(shí)現(xiàn)類(lèi)。

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><!-- 如果寫(xiě)斜杠的話那就表示請(qǐng)求是否加后綴都可以 -->
</servlet-mapping>

DispatcherServlet 源碼解析

DispatcherServlet 的 init() 方法在 HttpServletBean() 中實(shí)現(xiàn)的

init()

  1. 解析DispatcherServlet 配置的參數(shù),封裝成 ServletConfigPropertyValues對(duì)象。
  2. 將當(dāng)前Servlet 類(lèi)型的實(shí)例轉(zhuǎn)換成BeanWrapper類(lèi)型的實(shí)例。以便使用Spring中提供的注入功能進(jìn)行對(duì)應(yīng)的屬性注入。這些屬性如contextAttribute、contextClass、nameSpace、contextConfigLocation 等,都可以在web.xml 文件中以初始化參數(shù)的方式配置在servlet 的聲明中。
  3. 調(diào)用 initServletBean() 初始化servletBean。

onRefresh() 方法

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

  1. initMultipartResolver(context);初始化文件上傳的處理類(lèi)
  2. initLocaleResolver(context);初始化國(guó)際化配置的處理類(lèi)
  3. initThemeResolver(context);初始化主題資源的處理類(lèi)
  4. initHandlerMappings(context);初始化處理請(qǐng)求的類(lèi),主要負(fù)責(zé)處理請(qǐng)求調(diào)用Controller的處理類(lèi)。
  5. initHandlerAdapters(context);初始化HandlerAdapter的適配器
  6. initHandlerExceptionResolvers(context);初始化異常處理類(lèi)。
  7. initRequestToViewNameTranslator(context);初始化視圖轉(zhuǎn)換器,用于直接將請(qǐng)求轉(zhuǎn)換為邏輯視圖名。
  8. initViewResolvers(context);初始化視圖解析器,定義了如何通過(guò)view 名稱來(lái)解析對(duì)應(yīng)View實(shí)例的行為
  9. initFlashMapManager(context);初始化Flash Map,提供一個(gè)請(qǐng)求存儲(chǔ)屬性,可供其它請(qǐng)求使用。

DispatchServlet的請(qǐng)求處理邏輯

servlet 接受到請(qǐng)求后,會(huì)調(diào)用service() 方法,然后service根據(jù)HTTP響應(yīng)的請(qǐng)求方法進(jìn)行調(diào)用響應(yīng)的邏輯處理。

從類(lèi)結(jié)構(gòu)中,可以看出SpringMVC 支持 GET、POST、PUT、DELETE、OPTIONS、TRACE方法

從代碼中,我們發(fā)現(xiàn)這幾個(gè)方法交給 processRequest() 來(lái)進(jìn)行處理請(qǐng)求。

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

doDispatch() 方法

  1. 檢查該請(qǐng)求是否是文件上傳請(qǐng)求,如果是則把request轉(zhuǎn)換為 MultipartHttpServletRequest類(lèi)型。
  2. 根據(jù)request信息查找對(duì)應(yīng)的Handler,如果沒(méi)有找到對(duì)應(yīng)的Handler,則通過(guò)response反饋錯(cuò)誤信息。
  3. 通過(guò)當(dāng)前的handler 查找對(duì)應(yīng)的HandlerAdapter
  4. 判斷該HTTP請(qǐng)求是不是HEAD或GET請(qǐng)求,如果是則檢查HTTP請(qǐng)求頭部的LastModified屬性,來(lái)判斷該頁(yè)面是否需要重新加載。

  1. applyPreHandle() 執(zhí)行該請(qǐng)求所匹配的攔截器,并調(diào)用所有匹配攔截器的preHandle()方法,進(jìn)行處理
  2. 調(diào)用handle() 方法去根據(jù)請(qǐng)求路徑去調(diào)用用戶實(shí)現(xiàn)的Controller實(shí)現(xiàn)邏輯
  3. applyPostHandle()執(zhí)行該請(qǐng)求所有匹配的攔截器,并調(diào)用所有匹配攔截器的postHandle()方法,進(jìn)行處理
  4. processDispatchResult()處理頁(yè)面跳轉(zhuǎn)和調(diào)用攔截器的afterCompletion() 方法

processDispatchResult() 方法

  1. 處理異常信息
  2. 如果Controller成功返回了ModelAndView,則通過(guò)render()方法進(jìn)行響應(yīng)相應(yīng)的頁(yè)面信息
  3. 執(zhí)行完畢后,執(zhí)行該請(qǐng)求所有匹配的攔截器,并調(diào)用所有匹配攔截器的afterCompletion()方法,進(jìn)行處理

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java開(kāi)發(fā)之Lombok指南

    Java開(kāi)發(fā)之Lombok指南

    Lombok是一款Java開(kāi)發(fā)插件,使得Java開(kāi)發(fā)者可以通過(guò)其定義的一些注解來(lái)消除業(yè)務(wù)工程中冗長(zhǎng)和繁瑣的代碼,它能夠在編譯源代碼期間自動(dòng)幫我們生成這些方法,并沒(méi)有如反射那樣降低程序的性能。下面我們來(lái)詳細(xì)了解一下吧
    2019-06-06
  • 動(dòng)態(tài)修改spring?aop?切面信息提升自動(dòng)日志輸出框架效率

    動(dòng)態(tài)修改spring?aop?切面信息提升自動(dòng)日志輸出框架效率

    這篇文章主要為大家介紹了動(dòng)態(tài)修改spring?aop切面信息提升自動(dòng)日志輸出框架效率,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • springboot配置文件讀取pom文件信息方式

    springboot配置文件讀取pom文件信息方式

    這篇文章主要介紹了springboot配置文件讀取pom文件信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • spring 整合kafka監(jiān)聽(tīng)消費(fèi)的配置過(guò)程

    spring 整合kafka監(jiān)聽(tīng)消費(fèi)的配置過(guò)程

    這篇文章主要介紹了spring 整合kafka監(jiān)聽(tīng)消費(fèi)的配置過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之漢諾塔

    Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之漢諾塔

    漢諾塔是源于印度一個(gè)古老傳說(shuō)的益智玩具。大梵天創(chuàng)造世界時(shí)做了三根石柱,在一根柱子上從下往上按大小順序摞著64片黃金圓盤(pán)。大梵天命令婆羅門(mén)把圓盤(pán)從下面開(kāi)始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤(pán)上不能放大圓盤(pán),三根柱子之間一次只能移動(dòng)一個(gè)圓盤(pán)
    2022-02-02
  • java volatile關(guān)鍵字的含義詳細(xì)介紹

    java volatile關(guān)鍵字的含義詳細(xì)介紹

    這篇文章主要介紹了java volatile關(guān)鍵字的含義詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • springboot+log4j.yml配置日志文件的方法

    springboot+log4j.yml配置日志文件的方法

    這篇文章主要介紹了springboot+log4j.yml配置日志文件的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 一篇文章帶你了解mybatis的動(dòng)態(tài)SQL

    一篇文章帶你了解mybatis的動(dòng)態(tài)SQL

    這篇文章主要為大家介紹了mybatis的動(dòng)態(tài)SQL?,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • springboot如何查找配置文件路徑的順序和其優(yōu)先級(jí)別

    springboot如何查找配置文件路徑的順序和其優(yōu)先級(jí)別

    此文是在工作中遇到的關(guān)于springboot配置文件的問(wèn)題,在網(wǎng)上查閱資料和自己測(cè)試之后記錄的,以便日后查閱。希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 源碼解析Spring 數(shù)據(jù)庫(kù)異常抽理知識(shí)點(diǎn)總結(jié)

    源碼解析Spring 數(shù)據(jù)庫(kù)異常抽理知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家分享了關(guān)于源碼解析Spring 數(shù)據(jù)庫(kù)異常抽理知識(shí)點(diǎn)內(nèi)容,對(duì)此有需要的朋友們學(xué)習(xí)參考下。
    2019-05-05

最新評(píng)論