Spring MVC 處理請求的流程

Spring MVC 處理請求的流程

      • 流程步驟詳解
        • 第1步:發起請求 (HTTP Request)
        • 第2步:映射處理器 (Handler Mapping)
        • 第3步:獲取適配器 (Handler Adapter)
        • 第4步:執行攔截器前置處理 (Interceptors - preHandle)
        • 第5步:真正調用處理器 (Handler Execution)
        • 第6步:執行攔截器后置處理 (Interceptors - postHandle)
        • 第7步:處理分發結果 (Process Dispatch Result)
        • 第8步:執行攔截器完成處理 (Interceptors - afterCompletion)
        • 第9步:返回響應 (HTTP Response)
      • 核心組件總結

Spring MVC 處理請求的流程是其最核心的機制,理解它對于掌握整個框架至關重要。這個過程圍繞一個核心——前端控制器模式(Front Controller Pattern),即 DispatcherServlet。

整個流程清晰且模塊化,下圖展示了從請求發起到響應返回的完整生命周期,以及其中涉及的核心組件交互:

ClientDispatcherServlet(前端控制器)HandlerMappingHandlerAdapterController (@Controller)ViewResolverView (JSP/Thymeleaf...)HTTP Request1. 接收請求查詢Handler2. 映射查找根據URL找到目標Controller和方法返回HandlerExecutionChain(包含Handler和Interceptors)3. 適配調用獲取HandlerAdapter返回Adapter按順序執行preHandle()loop[4. 執行攔截器 (preHandle)]5. 處理請求(參數解析、方法調用、返回值處理)調用Controller方法返回方法執行結果(ModelAndView/String等)逆序執行postHandle()loop[6. 執行攔截器 (postHandle)]7. 處理視圖/響應通過HttpMessageConverter直接寫回響應解析視圖名返回View對象調用render()渲染視圖返回渲染后的HTMLalt[返回@ResponseBody][返回視圖名]最終觸發afterCompletion()loop[8. 執行攔截器 (afterCompletion)]9. 返回響應HTTP ResponseClientDispatcherServlet(前端控制器)HandlerMappingHandlerAdapterController (@Controller)ViewResolverView (JSP/Thymeleaf...)

流程步驟詳解

現在,我們結合上圖,對每一個步驟進行詳細解讀:

第1步:發起請求 (HTTP Request)

請求離開瀏覽器,到達 DispatcherServlet。根據 web.xml 或 Servlet 3.0+ 的配置,所有匹配特定模式(如 /)的請求都會由它處理。

第2步:映射處理器 (Handler Mapping)

DispatcherServlet 咨詢一個或多個 HandlerMapping Bean:“這個請求應該由哪個‘處理器’(Handler)來處理?”。HandlerMapping 根據請求的 URL 進行查找。

  • 常見實現
    • RequestMappingHandlerMapping:用于映射 @RequestMapping 注解的方法(最常用)。
    • BeanNameUrlHandlerMapping:根據 Bean 的名字進行映射。
  • 返回結果:不僅返回找到的目標處理器方法,還會返回一個 HandlerExecutionChain 對象,該對象包含了找到的 Handler 以及所有適用于該請求的 HandlerInterceptor(攔截器)。
第3步:獲取適配器 (Handler Adapter)

DispatcherServlet 拿著找到的 Handler,問一堆 HandlerAdapter:“你們誰支持(support)這個 Handler 的類型?”

  • 為什么需要它?:Handler 的類型五花八門(如 @ControllerHttpRequestHandlerServlet)。DispatcherServlet 需要一個統一的接口來調用它們。HandlerAdapter適配器模式的典型應用,它屏蔽了不同處理器的調用細節。
  • 常見實現RequestMappingHandlerAdapter(用于適配 @RequestMapping 注解的方法)。
第4步:執行攔截器前置處理 (Interceptors - preHandle)

在真正調用業務邏輯之前,DispatcherServlet 會調用 HandlerExecutionChain 中所有攔截器的 preHandle() 方法。

  • 應用:進行權限檢查、日志記錄、 locale 解析等。
第5步:真正調用處理器 (Handler Execution)

現在,DispatcherServlet 讓獲取到的 HandlerAdapter 去真正地執行 Handler。
這個執行過程非常復雜,包括:

  1. 參數解析:根據方法簽名,使用各種 HandlerMethodArgumentResolver 來解析方法的參數(如 @RequestParam, @RequestBody, @PathVariable)。
  2. 調用方法:通過反射調用控制器方法。
  3. 返回值處理:使用方法返回值,使用各種 HandlerMethodReturnValueHandler 處理返回值(如 @ResponseBody, ModelAndView)。
第6步:執行攔截器后置處理 (Interceptors - postHandle)

控制器方法執行完畢后,DispatcherServlet逆序調用所有攔截器的 postHandle() 方法。

  • 應用:有機會修改即將發送到視圖的 ModelAndView 對象。
第7步:處理分發結果 (Process Dispatch Result)

這是視圖渲染和響應的核心環節。DispatcherServlet 根據控制器方法的返回結果,進行不同的處理:

  • 情況A:方法有 @ResponseBody 或返回 ResponseEntity
    • 流程RequestResponseBodyMethodProcessor 會使用配置的 HttpMessageConverter(如 MappingJackson2HttpMessageConverter)將返回值(如一個 Java 對象)直接序列化(如轉為 JSON),并寫入 HttpServletResponse 的輸出流。此過程不涉及視圖解析。
  • 情況B:方法返回視圖名(如 String)或 ModelAndView
    • 視圖解析DispatcherServlet 調用 ViewResolver 來根據邏輯視圖名(如 "success")解析為一個具體的 View 對象(如 InternalResourceView 對應 JSP,ThymeleafView 對應 Thymeleaf)。
    • 視圖渲染DispatcherServlet 將模型數據傳遞給 View 對象,并調用其 render() 方法。該方法會生成最終的 HTML 內容(如合并 JSP 模板和模型數據),并將其寫入 HttpServletResponse 的輸出流。
第8步:執行攔截器完成處理 (Interceptors - afterCompletion)

無論請求處理成功還是出現異常,DispatcherServlet 都會最終觸發所有攔截器的 afterCompletion() 方法。

  • 應用:進行資源清理、記錄請求完成時間等。
第9步:返回響應 (HTTP Response)

最終,完整的響應通過 Servlet 容器(如 Tomcat)返回給客戶端。


核心組件總結

組件職責類比
DispatcherServlet前端控制器,協調所有組件,是整個流程的總指揮。餐廳的前臺經理
HandlerMapping請求映射,根據 URL 找到對應的處理器。餐廳的引座員
HandlerAdapter處理器適配,用統一的接口調用各種不同類型的處理器。餐廳的服務員,連接經理和后廚
Handler處理器(通常是我們寫的 @Controller)。餐廳的廚師
ViewResolver視圖解析器,將邏輯視圖名解析為具體視圖對象。餐廳的出菜員
View視圖,負責將模型數據渲染成最終的響應內容(HTML/JSON等)。最終呈現的菜肴
HandlerInterceptor攔截器,在請求處理的不同階段進行橫切處理。餐廳的質檢員

這個流程充分體現了 Spring MVC 的高度可配置性和可擴展性。其中的每一個步驟幾乎都可以通過配置自定義組件或實現特定接口來進行干預和擴展。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921454.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921454.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921454.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

敏捷scrum管理實戰經驗總結

1.敏捷 敏捷的構成 敏捷由實踐來源、應用場景、組織文化、領導力、團隊、需求、管理、技術、質量、度量、交付、過程改進、大型項目組合管理以及受監管行業中的敏捷等構成 敏捷開發的特點 短發布周期小批量的方式、開展從需求到實現的開發工作高層級的預先規劃結合詳細的即時規…

南科大適應、協同與規劃的完美融合!P3:邁向多功能的具身智能體

作者:Shengli Zhou1^{1}1, Xiangchen Wang1^{1}1, Jinrui Zhang1^{1}1, Ruozai Tian2^{2}2, Rongtao Xu2,3^{2,3}2,3, Feng Zheng1,2^{1,2}1,2單位:1^{1}1南方科技大學,2^{2}2時空智能,3^{3}3穆罕默德本扎耶德人工智能大學論文標題…

自動化流水線

import React, { useState, useEffect } from ‘react’; import { ChevronRight, CheckCircle, Circle, AlertCircle, Clock, Play, Pause, Settings, Code, Server, Shield, Database, Globe, Zap, FileText, Users, GitBranch, Package, Monitor, ChevronDown } from ‘luci…

【高等數學】第十一章 曲線積分與曲面積分——第三節 格林公式及其應用

上一節:【高等數學】第十一章 曲線積分與曲面積分——第二節 對坐標的曲線積分 總目錄:【高等數學】 目錄 文章目錄1. 格林公式2. 平面上曲線積分與路徑無關的條件3. 二元函數的全微分求積4. 曲線積分的基本定理1. 格林公式 單連通與復連通區域 設 DDD …

Boost電路:平均狀態空間建模

電路特征介紹如圖所示是一個非理想情況下的boost電路,其中L1L_{1}L1?和RL1R_{L1}RL1?是分別是電感和串聯電阻;C1C_{1}C1?和RC1R_{C1}RC1?是輸出電容和串聯電阻;Q1Q_{1}Q1?是MOS管,其導通電阻是RonR_{on}Ron?;D1D…

免費網站模板/網站模板建站的優勢/如何下載網站模板搭建網站?

在網站建設領域,“網站模板” 是降低技術門檻、提升建站效率的核心工具,尤其適合非專業開發者或追求低成本、快上線的需求場景。下面從定義、核心優勢兩方面展開詳細解析,幫助你全面理解其價值。 一、什么是網站模板? 網站模板&am…

【MATLAB例程】平面上的組合導航例程,使用EKF融合IMU和GNSS數據,8維狀態量和2維觀測量,附代碼下載鏈接

文章目錄程序詳解概述系統架構核心數學模型性能評估算法特點運行結果MATLAB源代碼程序詳解 概述 本代碼實現基于擴展卡爾曼濾波器(EKF)的二維組合導航系統,融合IMU(慣性測量單元)和GNSS(全球導航衛星系統…

react生命周期,詳細版本

React 組件的生命周期分為三個階段:掛載(Mounting)、更新(Updating) 和 卸載(Unmounting)。以下是類組件生命周期的詳細說明(基于 React 16.3+ 版本): 一、掛載階段(Mounting) 組件實例被創建并插入 DOM 時的流程: constructor(props) ○ 用途:初始化狀態(this…

騰訊最新開源HunyuanVideo-Foley本地部署教程:端到端TV2A框架,REPA策略+MMDiT架構,重新定義視頻音效新SOTA!

一、模型介紹HunyuanVideo-Foley 是騰訊混元團隊在2025年8月底開源的一款端到端視頻音效生成模型。它旨在解決AI生成視頻“有畫無聲”的痛點,通過輸入視頻和文本描述,就能自動生成電影級別的同步音效,顯著提升視頻的沉浸感。它是專為視頻內容…

計算機原理(二)

計算機原理系列 歡迎大家關注「海拉魯知識大陸」 多交流不迷路 計算機原理(一) 繼續上一篇計算機原理(一)深入了解程序執行部分,進一步說說程序在馮諾依曼模型上如何執行。如果沒有了解的童鞋可以查看我上一篇文章。…

【設計模式】 工廠方法模式

系列文章目錄 文章目錄系列文章目錄需要了解工廠制造細節嗎?簡單工廠模式實現工廠方法模式的實現簡單方法? 工廠方法?總結需要了解工廠制造細節嗎? 我們在前面的文章中為大家介紹了簡單工廠模式,我們知道 簡單工廠模式…

詳解 Java 中的 CopyOnWriteArrayList

目錄 【1】CopyOnWriteArrayList 簡介 【2】核心原理 1.底層數據結構 2.寫時復制機制 【3】CopyOnWriteArrayList常用方法及實例 1.添加元素方法 add () 2.獲取元素方法 get () 3.刪除元素方法remove() 【4】優缺點分析 【5】適用場景 【6】總結 【1】CopyOnWriteAr…

新手SEO優化快速起步教程

本教程專為SEO新手設計,幫助您快速上手優化工作。我們將一步步帶您了解基礎概念,包括高效挖掘關鍵詞的方法、內容優化的核心技巧,以及網站基礎設置的關鍵步驟。后續還會講解提升排名的實用策略、如何監控效果并進行調整,確保您能系…

Minecraft圖片搜索技巧

以下是更多專注 Minecraft 內容的高質量社區平臺,涵蓋建筑展示、模組/材質分享、實機截圖、藝術創作等方向,按類型分類整理:---一、國際知名綜合社區平臺 特點 鏈接 CurseForge 模組/材質/數據包第一倉庫,作者更新快,支…

數學建模-非線性規劃(NLP)

1-理論知識介紹應用2-基于matlab實現非線性規劃1)例1% 清除工作臺和命令行 clear;clc; x0[0 0 0]; A [-1 1 -1]; b 0; [x,value] fmincon(f1,x0,A,b,[],[],[],[],nonlfun1) function f f1(x)f x(1)^2x(2)^2x(3)^28; end function [c,ceq] nonlfun1(x)c [x(1)…

人工智能學習:什么是seq2seq模型

一、seq2seq模型 Seq2Seq(Sequence-to-Sequence)模型是一種用于處理序列轉換問題的深度學習模型,廣泛應用于機器翻譯、文本摘要、對話系統、語音識別等領域。Seq2Seq模型的核心思想是通過一個編碼器(Encoder)將輸入序列編碼為一個固定長度的上下文向量(Context Vector),…

生態 | 華院計算與深至科技達成戰略合作,攜手推動AI+醫學影像算法升級迭代

8月25日,華院計算技術(上海)股份有限公司(以下簡稱“華院計算”)與上海深至信息科技有限公司(以下簡稱“深至科技”)正式簽署戰略合作協議。雙方將秉持“優勢互補、資源共享、戰略協同、共同發展…

詳解MySQL環境變量配置及其在備份中的應用

正確配置MySQL環境變量是保障數據庫穩定運行和高效管理的基礎。這些變量涵蓋了從內存分配、連接設置到日志行為等方方面面,直接決定了數據庫的性能表現和功能特性。對于數據庫管理員而言,熟練掌握環境變量的配置,是進行性能調優和故障排查的必…

scikit-learn零基礎配置(含python、anaconda)

一、Anaconda環境搭建 1、關于Anaconda Anaconda 是一個非常 popular 的 Python 發行版,它不僅包含了 Python 語言本身,還預裝了眾多常用的科學計算庫,如 NumPy、Pandas、Matplotlib 等,能夠極大地方便用戶的開發和數據分析工作。…

RAG提示詞(日本語版)

RAG提示詞(日本語版) System Message # 知能型質問応答アシスタント(RAGシステムプロンプト)## 役割定義 あなたは「知能型質問応答アシスタント」として、提供されたコンテキスト情報に基づいてユーザーの質問に回答する専門的な…