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

Spring MVC核心組件與請(qǐng)求處理流程分析

 更新時(shí)間:2025年01月16日 11:46:16   作者:小·恐·龍  
該文章詳細(xì)介紹了SpringMVC的請(qǐng)求處理流程,從Filter鏈處理開始,經(jīng)過DispatcherServlet、HandlerMapping、HandlerAdapter、攔截器(前置處理、后置處理、完成處理)到視圖渲染,感興趣的朋友跟隨小編一起看看吧

Spring MVC請(qǐng)求處理完整流程詳解

一、流程文字描述

當(dāng)一個(gè)HTTP請(qǐng)求到達(dá)服務(wù)器后,會(huì)經(jīng)歷以下流程:

Filter鏈處理(入口)

  • 請(qǐng)求首先經(jīng)過Filter鏈
  • 每個(gè)Filter按照定義的順序執(zhí)行doFilter方法的前置處理
  • Filter通過調(diào)用chain.doFilter()將請(qǐng)求傳遞給下一個(gè)Filter

DispatcherServlet接收請(qǐng)求

  • 所有Filter處理完后,請(qǐng)求到達(dá)DispatcherServlet
  • DispatcherServlet作為前端控制器,統(tǒng)一處理所有請(qǐng)求

尋找Handler

  • DispatcherServlet調(diào)用getHandler方法
  • 遍歷所有HandlerMapping,找到與當(dāng)前URL匹配的Handler
  • 找到Handler后,把Handler和對(duì)應(yīng)的攔截器封裝成HandlerExecutionChain對(duì)象

獲取HandlerAdapter

  • 根據(jù)Handler的類型,遍歷所有HandlerAdapter
  • 找到支持該Handler類型的HandlerAdapter
  • HandlerAdapter用于調(diào)用Handler并處理參數(shù)、返回值等

攔截器前置處理

  • 按順序調(diào)用HandlerExecutionChain中所有攔截器的preHandle方法
  • 如果任一攔截器的preHandle返回false,則中斷請(qǐng)求處理
  • 中斷時(shí)會(huì)觸發(fā)已執(zhí)行的攔截器的afterCompletion方法

Handler處理請(qǐng)求

  • 通過HandlerAdapter調(diào)用Handler(Controller方法)
  • HandlerAdapter負(fù)責(zé)參數(shù)解析、類型轉(zhuǎn)換
  • Handler執(zhí)行業(yè)務(wù)邏輯,返回處理結(jié)果

攔截器后置處理

  • Handler執(zhí)行完成后,按逆序調(diào)用所有攔截器的postHandle方法
  • 此時(shí)視圖尚未渲染

視圖渲染

  • 根據(jù)Handler返回的結(jié)果進(jìn)行視圖渲染
  • 如果是@RestController,將返回值轉(zhuǎn)換為JSON/XML等格式
  • 如果是傳統(tǒng)@Controller,解析視圖名稱并渲染視圖

攔截器完成處理

  • 視圖渲染完成后,按逆序調(diào)用所有攔截器的afterCompletion方法
  • 無論過程中是否有異常,都會(huì)執(zhí)行afterCompletion

Filter鏈處理(出口)

  • 響應(yīng)會(huì)按照與處理請(qǐng)求相反的順序經(jīng)過Filter鏈
  • 每個(gè)Filter執(zhí)行doFilter方法的后置處理
  • 最終響應(yīng)返回給客戶端

二、關(guān)鍵組件詳解

2.1 HandlerMapping

// 核心數(shù)據(jù)結(jié)構(gòu)
public class RequestMappingHandlerMapping {
    // 保存URL與處理器方法的映射關(guān)系
    private final Map<RequestMappingInfo, HandlerMethod> mappingLookup;
}
// 映射示例
mappingLookup = {
    RequestMappingInfo{
        patterns=/users/{id},    // URL模式
        methods=GET,             // HTTP方法
        params=[],              // 請(qǐng)求參數(shù)
        headers=[]              // 請(qǐng)求頭
    } -> HandlerMethod{UserController.getUser()}
}

2.2 HandlerExecutionChain

public class HandlerExecutionChain {
    // Handler本身(如Controller的方法)
    private final Object handler;
    // 與Handler關(guān)聯(lián)的攔截器列表
    private List<HandlerInterceptor> interceptors;
}

2.3 HandlerAdapter

// 處理@RequestMapping注解的方法
public class RequestMappingHandlerAdapter implements HandlerAdapter {
    public ModelAndView handle(request, response, handler) {
        // 1. 解析請(qǐng)求參數(shù)
        Object[] args = resolveParameters(request, handler);
        // 2. 調(diào)用Controller方法
        Object returnValue = invokeMethod(handler, args);
        // 3. 處理返回值
        return processReturnValue(returnValue);
    }
}

2.4 視圖渲染

// 1. @RestController(JSON渲染)
@GetMapping("/api/user")
public User getUser() {
    return user;  // 自動(dòng)轉(zhuǎn)換為JSON
}
// 2. @Controller(HTML渲染)
@GetMapping("/user")
public String user(Model model) {
    model.addAttribute("user", user);
    return "userView";  // 解析為具體視圖
}

三、攔截器執(zhí)行流程

3.1 攔截器定義

public class LogInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(request, response, handler) {
        System.out.println("LogInterceptor - preHandle");
        return true;
    }
    @Override
    public void postHandle(request, response, handler, mv) {
        System.out.println("LogInterceptor - postHandle");
    }
    @Override
    public void afterCompletion(request, response, handler, ex) {
        System.out.println("LogInterceptor - afterCompletion");
    }
}

3.2 執(zhí)行順序示例

Filter1 - 請(qǐng)求處理
    Filter2 - 請(qǐng)求處理
        LogInterceptor - preHandle
            SecurityInterceptor - preHandle
                Controller方法執(zhí)行
            SecurityInterceptor - postHandle
        LogInterceptor - postHandle
        視圖渲染
            SecurityInterceptor - afterCompletion
        LogInterceptor - afterCompletion
    Filter2 - 響應(yīng)處理
Filter1 - 響應(yīng)處理

3.3 攔截器調(diào)用過程

// 1. preHandle調(diào)用(正序)
for (HandlerInterceptor interceptor : interceptors) {
    if (!interceptor.preHandle(request, response, handler)) {
        triggerAfterCompletion(request, response, handler, null);
        return false;
    }
}
// 2. postHandle調(diào)用(逆序)
for (int i = interceptors.length - 1; i >= 0; i--) {
    interceptors[i].postHandle(requestresponse, handler, mv);
}
// 3. afterCompletion調(diào)用(逆序)
for (int i = interceptors.length - 1; i >= 0; i--) {
    interceptors[i].afterCompletion(request, response, handler, ex);
}

到此這篇關(guān)于Spring MVC核心組件與請(qǐng)求處理流程的文章就介紹到這了,更多相關(guān)Spring MVC請(qǐng)求處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • sa-token整合springboot中的代碼示例展示

    sa-token整合springboot中的代碼示例展示

    sa-token?是一個(gè)輕量級(jí)的 Java 權(quán)限認(rèn)證框架,它可以很方便地集成到 Spring Boot 項(xiàng)目中,以提供簡潔的認(rèn)證和授權(quán)功能,這篇文章主要介紹了sa-token整合springboot中的代碼示例展示,需要的朋友可以參考下
    2024-04-04
  • WebSocket無法注入屬性的問題及解決方案

    WebSocket無法注入屬性的問題及解決方案

    這篇文章主要介紹了WebSocket無法注入屬性的問題及解決方法,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • 擴(kuò)展tk.mybatis的流式查詢功能實(shí)現(xiàn)

    擴(kuò)展tk.mybatis的流式查詢功能實(shí)現(xiàn)

    mybatis查詢默認(rèn)是一次獲取全部,如果數(shù)據(jù)過于龐大,就會(huì)導(dǎo)致OOM問題,本文就介紹了tk.mybatis 流式查詢,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-12-12
  • Spring解決循環(huán)依賴問題的四種方法匯總

    Spring解決循環(huán)依賴問題的四種方法匯總

    這篇文章主要介紹了Spring解決循環(huán)依賴問題的四種方法匯總,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • spring如何使用xml裝配bean

    spring如何使用xml裝配bean

    這篇文章主要介紹了spring如何使用xml裝配bean,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 詳解shrio的認(rèn)證(登錄)過程

    詳解shrio的認(rèn)證(登錄)過程

    這篇文章主要介紹了shrio的認(rèn)證(登錄)過程,幫助大家更好的理解和使用shrio框架,感興趣的朋友可以了解下
    2021-02-02
  • springmvc+ajax+formdata上傳圖片代碼實(shí)例

    springmvc+ajax+formdata上傳圖片代碼實(shí)例

    這篇文章主要介紹了springmvc+ajax+formdata上傳圖片代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Spring框架開發(fā)scope作用域分析總結(jié)

    Spring框架開發(fā)scope作用域分析總結(jié)

    這篇文章主要介紹了Spring框架開發(fā)中scope作用域的分析總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-09-09
  • 詳解SpringBoot如何自定義自己的Starter組件

    詳解SpringBoot如何自定義自己的Starter組件

    這篇文章主要為大家詳細(xì)介紹了在SpringBoot中如何自定義自己的Starter組件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Java實(shí)現(xiàn)的不同圖片居中剪裁生成同一尺寸縮略圖功能示例

    Java實(shí)現(xiàn)的不同圖片居中剪裁生成同一尺寸縮略圖功能示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的不同圖片居中剪裁生成同一尺寸縮略圖功能,涉及java針對(duì)圖片的讀取、屬性修改等相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09

最新評(píng)論

乌什县| 绥宁县| 萨嘎县| 通化县| 凤凰县| 天镇县| 宜章县| 邹城市| 景东| 厦门市| 恩平市| 陕西省| 屯留县| 准格尔旗| 丰城市| 嘉峪关市| 乐都县| 北宁市| 杭锦旗| 连云港市| 应城市| 大城县| 堆龙德庆县| 尼木县| 腾冲县| 师宗县| 清水县| 金门县| 南宫市| 东源县| 容城县| 苍梧县| 吉林省| 电白县| 历史| 原阳县| 玛沁县| 荆州市| 扶风县| 江西省| 宜良县|