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

Spring?MVC DispatcherServlet處理請求過程示例詳解

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

引言

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

處理過程

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

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

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

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

攔截

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

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

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

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

異常處理

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

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

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

HandlerExceptionResolver可以返回:

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

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

容器錯誤頁面

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

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

以上配置需要DispatcherServlet進一步處理:

@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處理請求過程的詳細內(nèi)容,更多關(guān)于Spring MVC 六 - DispatcherServlet處理請求過程的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實現(xiàn)讀取文件夾下(包括子目錄)所有文件的文件名

    Java實現(xiàn)讀取文件夾下(包括子目錄)所有文件的文件名

    這篇文章主要介紹了Java實現(xiàn)讀取文件夾下(包括子目錄)所有文件的文件名,本文把代碼組織成了一個模塊,可以很方便的使用,需要的朋友可以參考下
    2015-06-06
  • 聊聊Java并發(fā)中的Synchronized

    聊聊Java并發(fā)中的Synchronized

    這篇文章主要介紹了聊聊Java并發(fā)中的Synchronized,介紹了同步的基礎,原理,鎖的相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • java類加載相關(guān)知識總結(jié)

    java類加載相關(guān)知識總結(jié)

    今天帶大家復習Java基礎知識,文章對Java類加載做了詳細介紹,對正在學習java的小伙伴很有幫助,需要的朋友可以參考下
    2021-05-05
  • Java集合TreeSet用法詳解

    Java集合TreeSet用法詳解

    本文詳細講解了Java集合TreeSet用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • SpringBoot @Retryable注解方式

    SpringBoot @Retryable注解方式

    這篇文章主要介紹了SpringBoot @Retryable注解方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • resty upload無需依賴的文件上傳與下載

    resty upload無需依賴的文件上傳與下載

    這篇文章主要為大家介紹了resty upload中無需依賴的文件上傳與下載過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步,早日升職加薪
    2022-03-03
  • Java類加載機制實現(xiàn)步驟解析

    Java類加載機制實現(xiàn)步驟解析

    這篇文章主要介紹了Java類加載機制實現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot選擇自有bean優(yōu)先加載實現(xiàn)方法

    SpringBoot選擇自有bean優(yōu)先加載實現(xiàn)方法

    在一些需求中,可能存在某些場景,比如先加載自己的bean,然后自己的bean做一些DB操作,初始化配置問題,然后后面的bean基于這個配置文件,繼續(xù)做其他的業(yè)務邏輯。因此有了本文的這個題目
    2023-03-03
  • Spring如何正確注入集合類型

    Spring如何正確注入集合類型

    這篇文章主要介紹了Spring如何正確注入集合類型,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • idea創(chuàng)建springboot項目和springcloud項目的詳細教程

    idea創(chuàng)建springboot項目和springcloud項目的詳細教程

    這篇文章主要介紹了idea創(chuàng)建springboot項目和springcloud項目方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10

最新評論

滨海县| 财经| 玉树县| 山丹县| 丰都县| 稻城县| 临猗县| 绵阳市| 竹北市| 祁阳县| 邵阳市| 灵寿县| 于田县| 满洲里市| 土默特右旗| 南平市| 蛟河市| 芒康县| 图们市| 郴州市| 安多县| 丰原市| 内江市| 长春市| 贡觉县| 六安市| 蒙城县| 文山县| 广安市| 昌宁县| 银川市| 永福县| 清丰县| 卓资县| 大石桥市| 伊春市| 花莲县| 北宁市| SHOW| 宁河县| 天峨县|