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

Spring?MVC DispatcherServlet處理請(qǐng)求過程示例詳解

 更新時(shí)間:2023年09月14日 10:46:47   作者:福  
這篇文章主要介紹了Spring?MVC?DispatcherServlet處理請(qǐng)求過程示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

前面講過了DispatcherServlet的初始化過程(源碼角度的DispatcherServlet的具體初始化過程還沒說,先放一放),今天說一下DispatcherServlet處理請(qǐng)求的過程。

處理過程

  • WebApplicationContext綁定在當(dāng)前request屬性上(屬性鍵值DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE)
  • localResolver綁定在request的屬性上(屬性鍵值LOCALE_RESOLVER_ATTRIBUTE)
  • themeResolver綁定在request屬性上(屬性鍵值HEME_RESOLVER_ATTRIBUTE)
  • servlet容器配置了multipart resolver,并且當(dāng)前請(qǐng)求包含multpart file,則包裝當(dāng)前request為MultipartHttpServletRequest。
  • 匹配當(dāng)前請(qǐng)求的handlerMappings,獲取到HandlerExecutionChain,匹配getHandlerAdapter
  • 調(diào)用HandlerExecutionChain的applyPreHandle方法:獲取攔截器,調(diào)用攔截器的preHandle方法
  • 調(diào)用HandlerAdapter的handle方法,這兒會(huì)匹配并執(zhí)行Conroller方法
  • 執(zhí)行HandlerExecutionChain的applyPostHandle方法:調(diào)用攔截器的postHandle方法
  • 執(zhí)行processDispatchResult方法,其中會(huì)調(diào)用攔截器的afterCompletion方法

以上過程都被try catch包圍起來了,所以才會(huì)有Spring MVC的異常處理機(jī)制:應(yīng)用層不管哪里(controller、service、dao層...)拋出的異常,都會(huì)在這里被捕獲到,注冊(cè)到WebApplicationContext容器中的HandlerExceptionResolver beans就有機(jī)會(huì)統(tǒng)一處理異常。

可以通過DispatcherServlet的初始化參數(shù)來定制化其行為,參數(shù)可以通過web.xml指定,包括:

  • contextClass:指定當(dāng)前DispatcherServlet綁定的容器類(ConfigurableWebApplicationContext的實(shí)現(xiàn)類),默認(rèn)為XmlWebApplicationContext 。
  • contextConfigLocation:上述contextClass指定的容器類的配置文件的位置,可以指定多個(gè)配置文件,逗號(hào)分割。
  • namespace:WebApplicationContext的namespace,默認(rèn)[servlet-name]-servlet。
  • throwExceptionIfNoHandlerFound:某一請(qǐng)求request沒有匹配到handle的話,是否拋出NoHandlerFoundException異常,NoHandlerFoundException隨后可以被HandlerExceptionResolver捕獲并處理。默認(rèn)情況下該參數(shù)設(shè)置為false,DispatherServlet不拋出異常、直接導(dǎo)航到404。注意:如果配置了默認(rèn)Servlet Handler(default servlet handling)的話,那么沒匹配到的request會(huì)導(dǎo)航到默認(rèn)handler處理,永遠(yuǎn)不會(huì)出現(xiàn)404。

攔截

HandlerMapping支持?jǐn)r截器,攔截器需實(shí)現(xiàn)SpringMVC的HandlerInterceptor接口(org.springframework.web.servlet),包含如下方法:

  • preHandle:HandlerMapping處理請(qǐng)求之前發(fā)生。
  • postHandle:HandlerMapping處理請(qǐng)求之后發(fā)生。
  • afterCompletion:整個(gè)請(qǐng)求處理完成之后。

preHandle返回true則請(qǐng)求繼續(xù)被處理,返回false則后續(xù)不會(huì)再處理請(qǐng)求。

postHandle對(duì)@ResponseBody和ResponseEntity方法幾乎沒有什么作用,因?yàn)閞esponse已經(jīng)在postHandle之前被HandlerAdapter處理完成了,因此不可能被postHandle修改了。比如你想通過postHandle在response header中增加一個(gè)頭信息是不可能的了。這種需求只能通過ResponseBodyAdvice、 Controller Advice 或者直接在RequestMappingHandlerAdapter中直接實(shí)現(xiàn)。

異常處理

HandleMapping、HandlerAdapter、Controller中發(fā)生的任何異常,都可以被DispatcherServlet捕獲、交給HandlerExceptionResolver bean去處理異常。

SpringMVC提供如下異常處理的實(shí)現(xiàn)類:

異常處理鏈我們可以配置多個(gè)HandlerExceptionResolver作為異常處理鏈(exception resolver chain)來處理異常,可以通過order屬性指定其處理順序,order值越大、在chain中排名越靠后。

HandlerExceptionResolver可以返回:

  • ModelAndView :錯(cuò)誤頁面。
  • 空ModelAndView:錯(cuò)誤已經(jīng)被處理,不需要導(dǎo)航到錯(cuò)誤頁面。
  • Null:當(dāng)前Resolver不處理,異常繼續(xù)向上拋給chain中后面的Resolver,直到最后如果沒有Resolver處理該異常的話,異常會(huì)拋出給Servlet容器(比如給到Tomcat,這種情況下Tomcat也不處理,可能就會(huì)直接拋出給前臺(tái))。

SpringMVC會(huì)自動(dòng)配置內(nèi)建的異常處理器,我們可以通過配置客戶化異常處理器。SpringMVC的異常處理相對(duì)比較重要,后面我們還會(huì)從源碼和應(yīng)用角度做一次分析。

容器錯(cuò)誤頁面

如果異常沒有被任何HandlerExceptionResolver處理,而且,如果response status被設(shè)置為4xx、5xx的話,servlet容器(比如tomcat)會(huì)導(dǎo)航到默認(rèn)的錯(cuò)誤處理頁面,假如容器配置了錯(cuò)誤處理頁面的話??梢酝ㄟ^web.xml配置:

<error-page>
    <location>/error</location>
</error-page>

以上配置需要DispatcherServlet進(jìn)一步處理:

@RestController
public class ErrorController {
    @RequestMapping(path = "/error")
    public Map<String, Object> handle(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<>();
        map.put("status", request.getAttribute("jakarta.servlet.error.status_code"));
        map.put("reason", request.getAttribute("jakarta.servlet.error.message"));
        return map;
    }
}

以上就是Spring MVC 六 - DispatcherServlet處理請(qǐng)求過程的詳細(xì)內(nèi)容,更多關(guān)于Spring MVC 六 - DispatcherServlet處理請(qǐng)求過程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解ArrayList的擴(kuò)容機(jī)制

    詳解ArrayList的擴(kuò)容機(jī)制

    ArrayList基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn),在添加和刪除的時(shí)候存在擴(kuò)容和縮容這樣重新規(guī)劃數(shù)組大小的機(jī)制。在ArrayList中,維護(hù)Object[] elementData數(shù)組來管理元素,但是ArrayList是動(dòng)態(tài)可變的,所以elementData數(shù)組長度并不代表ArrayList實(shí)際元素個(gè)數(shù),所以使用size顯示實(shí)際元素個(gè)數(shù)
    2021-06-06
  • spring boot中使用@Async實(shí)現(xiàn)異步調(diào)用任務(wù)

    spring boot中使用@Async實(shí)現(xiàn)異步調(diào)用任務(wù)

    本篇文章主要介紹了spring boot中使用@Async實(shí)現(xiàn)異步調(diào)用任務(wù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • SpringBoot啟動(dòng)時(shí)自動(dòng)執(zhí)行代碼的幾種實(shí)現(xiàn)方式

    SpringBoot啟動(dòng)時(shí)自動(dòng)執(zhí)行代碼的幾種實(shí)現(xiàn)方式

    這篇文章主要給大家介紹了關(guān)于SpringBoot啟動(dòng)時(shí)自動(dòng)執(zhí)行代碼的幾種實(shí)現(xiàn)方式,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • 在navicat中導(dǎo)入mysql數(shù)據(jù)庫詳細(xì)步驟(即.sql后綴的數(shù)據(jù)庫)

    在navicat中導(dǎo)入mysql數(shù)據(jù)庫詳細(xì)步驟(即.sql后綴的數(shù)據(jù)庫)

    Navicat是MySQL非常好用的可視化管理工具,功能非常強(qiáng)大,能滿足我們?nèi)粘?shù)據(jù)庫開發(fā)的所有需求,下面這篇文章主要給大家介紹了關(guān)于如何在navicat中導(dǎo)入mysql數(shù)據(jù)庫(即.sql后綴的數(shù)據(jù)庫)的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Java利用happen-before規(guī)則如何實(shí)現(xiàn)共享變量的同步操作詳解

    Java利用happen-before規(guī)則如何實(shí)現(xiàn)共享變量的同步操作詳解

    這篇文章主要給大家介紹了關(guān)于Java利用happen-before規(guī)則實(shí)現(xiàn)共享變量的同步操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • Spring中的Aware接口及應(yīng)用場(chǎng)景詳解

    Spring中的Aware接口及應(yīng)用場(chǎng)景詳解

    這篇文章主要介紹了Spring中的Aware接口及應(yīng)用場(chǎng)景,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringBoot使用MockMvc測(cè)試get和post接口的示例代碼

    SpringBoot使用MockMvc測(cè)試get和post接口的示例代碼

    Spring Boot MockMvc是一個(gè)用于單元測(cè)試的模塊,它是Spring框架的一部分,專注于簡化Web應(yīng)用程序的測(cè)試,MockMvc主要用來模擬一個(gè)完整的HTTP請(qǐng)求-響應(yīng)生命周期,本文給大家介紹了SpringBoot使用MockMvc測(cè)試get和post接口,需要的朋友可以參考下
    2024-06-06
  • Java實(shí)現(xiàn)單例模式之餓漢式、懶漢式、枚舉式

    Java實(shí)現(xiàn)單例模式之餓漢式、懶漢式、枚舉式

    本篇文章主要介紹了Java實(shí)現(xiàn)單例的3種普遍的模式,餓漢式、懶漢式、枚舉式。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-10-10
  • Java實(shí)現(xiàn)RedisUtils操作五大集合(增刪改查)

    Java實(shí)現(xiàn)RedisUtils操作五大集合(增刪改查)

    本文主要介紹了Java實(shí)現(xiàn)RedisUtils操作五大集合,文中通過示例代碼介紹的非常詳細(xì),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • JVM的7種垃圾回收器(小結(jié))

    JVM的7種垃圾回收器(小結(jié))

    這篇文章主要介紹了JVM的7種垃圾回收器(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評(píng)論