SpringMVC 工作原理

SpringMVC 工作原理

SpringMVC 是 Spring 框架中用于構建 Web 應用的核心模塊,其工作流程圍繞 “前端控制器(DispatcherServlet)” 展開,通過組件間的協作完成請求處理與響應。理解其工作原理是掌握 SpringMVC 開發的關鍵,以下將通過 核心組件解析詳細工作流程(含步驟拆解與流程圖解) 兩部分進行說明。

SpringMVC 核心組件

在了解流程前,需先明確參與請求處理的核心組件及其職責,各組件通過 Spring 容器管理,由 DispatcherServlet 調度。

組件名稱核心職責
DispatcherServlet前端控制器(核心),統一接收所有請求,協調其他組件完成處理,避免組件耦合。
HandlerMapping處理器映射器,根據請求 URL 找到對應的 Handler(處理器,如 Controller 方法),返回 Handler 及攔截器鏈。
HandlerAdapter處理器適配器,適配不同類型的 Handler(如注解式 Controller、XML 配置的 Controller),調用 Handler 的業務方法。
Handler(處理器)業務邏輯處理器,即開發者編寫的 Controller 類(或方法),負責處理具體業務邏輯。
ModelAndView處理器返回的結果對象,包含 Model(數據模型,如請求處理后的業務數據)View(視圖名稱,如 JSP 路徑)
ViewResolver視圖解析器,根據 ModelAndView 中的視圖名稱,解析為實際的 View 視圖對象(如 JSP 文件、HTML 頁面)。
View(視圖)渲染視圖,將 Model 中的數據填充到視圖模板(如 JSP),生成最終的 HTML 響應給客戶端。
Interceptor攔截器,可在請求處理的 預處理(前)、后處理(后)、完成處理(最終) 階段插入自定義邏輯(如登錄校驗、日志記錄)。

SpringMVC 完整工作流程(10 步拆解)

SpringMVC 的工作流程本質是 “DispatcherServlet 主導的組件協作流程”,從客戶端發送請求到接收響應,共分為 10 個核心步驟,流程如下:

1. 流程步驟拆解
  1. 客戶端發送 HTTP 請求
    用戶通過瀏覽器、Postman 等工具發送請求(如 http://localhost:8080/springmvc/user/list),請求被 Web 服務器(如 Tomcat)接收。
  2. 請求被 DispatcherServlet 攔截
    Web 服務器根據 web.xml(或 SpringBoot 自動配置)中配置的 DispatcherServlet 映射規則(如 / 攔截所有請求,排除靜態資源),將請求轉發給 DispatcherServlet(前端控制器)。
  3. DispatcherServlet 調用 HandlerMapping
    DispatcherServlet 不直接處理請求,而是調用 HandlerMapping(處理器映射器),根據請求 URL、請求方法(GET/POST)等信息,查找對應的 Handler(如 Controller 中的 listUser() 方法),同時返回該 Handler 對應的 攔截器鏈(Interceptor Chain)
  4. DispatcherServlet 獲取 HandlerAdapter
    DispatcherServlet 根據 Handler 的類型(如注解式 @Controller、實現 Controller 接口的類),調用對應的 HandlerAdapter(處理器適配器),確保后續能統一調用 Handler 的業務方法。
  5. 執行攔截器的預處理方法(preHandle)
    若存在攔截器,DispatcherServlet 會先執行攔截器鏈中所有攔截器的 preHandle() 方法。
    • 若任意一個攔截器的 preHandle() 返回 false,則請求終止,直接返回響應(可用于登錄校驗失敗的場景);
    • 若全部返回 true,則繼續執行后續流程。
  6. HandlerAdapter 調用 Handler 業務方法
    HandlerAdapter 調用 Handler(Controller 方法)的業務邏輯,處理請求(如查詢數據庫、處理參數),最終返回 ModelAndView 對象(包含業務數據 Model 和視圖名稱 ViewName,如 ModelAndView("user/list", "users", userList))。
  7. 執行攔截器的后處理方法(postHandle)
    Handler 執行完成后,DispatcherServlet 會倒序執行攔截器鏈中所有攔截器的 postHandle() 方法(此時 ModelAndView 已生成,可在此處修改視圖或數據)。
  8. DispatcherServlet 調用 ViewResolver 解析視圖
    DispatcherServlet 將 Handler 返回的 ModelAndView 傳遞給 ViewResolver(視圖解析器),ViewResolver 根據視圖名稱(如 user/list)和配置的視圖前綴(如 /WEB-INF/views/)、后綴(如 .jsp),解析為實際的 View 視圖對象(如 /WEB-INF/views/user/list.jsp)。
  9. View 渲染視圖并返回響應
    View 視圖對象結合 Model 中的數據(如 users 列表),渲染生成 HTML 頁面(將數據填充到 JSP 模板的標簽中),并將渲染后的響應結果返回給 DispatcherServlet。
  10. 執行攔截器的完成處理方法(afterCompletion)
    響應返回前,DispatcherServlet 會倒序執行攔截器鏈中所有攔截器的 afterCompletion() 方法(無論請求是否成功,均會執行,可用于資源釋放,如關閉流)。最終,DispatcherServlet 將響應結果返回給客戶端(瀏覽器),流程結束。
2. 工作流程流程圖(文字示意)
客戶端(瀏覽器)  ↓ 1. 發送HTTP請求  
Web服務器(Tomcat)  ↓ 2. 轉發給DispatcherServlet(根據映射規則)  
DispatcherServlet(前端控制器)  ↓ 3. 調用HandlerMapping  
HandlerMapping(處理器映射器)  ↓ 返回:Handler + 攔截器鏈  
DispatcherServlet  ↓ 4. 匹配HandlerAdapter  
HandlerAdapter(處理器適配器)  ↓ 5. 執行攔截器preHandle()(全部true則繼續)  ↓ 6. 調用Handler(Controller方法)→ 返回ModelAndView  ↓ 7. 執行攔截器postHandle()(倒序)  
DispatcherServlet  ↓ 8. 調用ViewResolver解析視圖  
ViewResolver(視圖解析器)  ↓ 返回:實際View對象(如JSP)  ↓ 9. View渲染(Model數據填充到View)→ 生成HTML  ↓ 10. 執行攔截器afterCompletion()(倒序)  
DispatcherServlet  ↓ 返回響應  
客戶端(瀏覽器)

關鍵總結

  1. DispatcherServlet 是 “中樞”:所有請求都經過它,負責協調 HandlerMapping、HandlerAdapter、ViewResolver 等組件,降低組件耦合。
  2. 組件職責單一:每個組件只做一件事(如 HandlerMapping 只負責找 Handler,ViewResolver 只負責解析視圖),符合 “單一職責原則”。
  3. 攔截器作用于流程節點:通過 preHandlepostHandleafterCompletion 可在請求處理的關鍵節點插入自定義邏輯,增強靈活性。
  4. ModelAndView 是 “數據 + 視圖” 載體:Handler 不直接渲染視圖,而是返回 ModelAndView,由 ViewResolver 和 View 完成渲染,實現 “業務邏輯與視圖分離”。

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

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

相關文章

HoRain云--Python機器學習神器:Sklearn全解析

🎬 HoRain云小助手:個人主頁 🔥 個人專欄: 《Linux 系列教程》《c語言教程》 ??生活的理想,就是為了理想的生活! ?? 推薦 前些天發現了一個超棒的服務器購買網站,性價比超高,大內存超劃算!…

瘋狂星期四文案網第64天運營日記

網站運營第64天,點擊觀站: 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 今日訪問量 今日搜索引擎收錄情況

設計一個 AB 測試平臺

1. 需求明確化 功能需求實驗管理 創建、編輯、刪除、復制實驗設置實驗參數(變體、權重、目標指標、時長等)實驗狀態管理(草稿、運行中、已結束)用戶分流與分配 支持多種分流策略(隨機分配、分層分配、定向分配&#xf…

HiCMAE 論文復現:基于 RAVDESS 數據集的音視頻情感識別

HiCMAE 論文復現:基于 RAVDESS 數據集的音視頻情感識別 1. 項目背景與論文概述 1.1 多模態情感識別背景 多模態情感識別是人工智能領域的重要研究方向,旨在通過結合多種感知模態(如音頻、視頻、文本等)來更準確地識別人類情感狀態。與傳統單模態方法相比,多模態方法能夠…

HarmonyOS 數據處理性能優化:算法 + 異步 + 分布式實戰

摘要 不管是寫 App,還是做 IoT 設備開發,數據處理都是繞不開的主題。你可能要處理幾百條傳感器數據,也可能要應對幾十萬條用戶行為日志。如果算法不夠高效,應用就會卡頓甚至直接崩潰。尤其是在 HarmonyOS(鴻蒙系統&…

華為麒麟操作系統運維常見知識點

1.開放root賬號密碼登錄。(1)修改/etc/ssh/sshd_config文件中,PermitRootLogin 屬性值為yes。PermitRootLogin yes(2)使用passwd命令設置root密碼。sudo su 切換到root賬戶下,使用passwd 設置密碼。(3)重啟sshd服務。systemctl restart sshd2.避免使用ch…

嵌入式面試|MCU+RTOS技術棧——面試八股文整理3:STM32

目錄 1.單片機啟動流程 2.看門狗 3.最小系統 4.ROM、RAM、Flash 5.EPROM、EEPROM 6.Bootloader與OTA 7.NAND FLASH 和NOR FLASH 相同點 區別 適用場景 8.CPU、MPU、MCU、SOC、SOPC 9.交叉編譯 10.寄存器 寄存器的作用 寄存器與內存的區別 11.Cortex-M3寄存器組…

用 Wisdom SSH 輕松實現服務器自動化任務調度

用Wisdom SSH輕松實現服務器自動化任務調度 在服務器管理工作中,自動化任務調度至關重要,它能讓系統在特定時間自動執行預設任務,極大提升運維效率。Wisdom SSH作為一款具備AI助手的強大工具,為自動化任務調度帶來便捷解決方案。 …

遠場學習_FDTD_dipole(1)

項目4.4 Reflection calculation using a dipole source在此頁面中,我們采用了一種不同于標準平面波源方法的替代模擬設置,使用偶極子源來計算多層堆疊結構的反射。在此情況下,我們使用空氣 - 玻璃界面。這種技術很有吸引力,因為它…

機器學習入門,用Lima在macOS免費搭建Docker環境,徹底解決鏡像與收費難題!

國內用戶必看】用Lima在macOS免費搭建Docker環境,徹底解決鏡像與收費難題! 為了在不同操作系統有一致操作體驗,我選擇使用docker技術安裝ollama,這樣子還有一個好處,即使玩壞了,刪除重建即可,所…

Java 生成簽名證書

在Java中生成簽名證書通常涉及到使用Java密鑰和證書管理工具(Java Key and Certificate Management API,即Java Keytool)。這個過程通常包括創建密鑰庫(KeyStore),生成密鑰對(Key Pair&#xff…

語法分析:編譯器中的“語法警察”

在編程的世界里,每一種編程語言都有自己的語法規則。就像中文有標點符號和語序規則一樣,編程語言也有自己嚴格的語法規則。語法分析器就像一個嚴格的"語法警察",它的職責是檢查源代碼是否符合語言規范,同時為后續的處理…

容器的定義及工作原理

定義 你可以把 容器 想象成一個 “打包好的軟件快遞箱”。 里面有什么? 這個箱子里不僅裝著你的軟件(比如一個網站程序),還把軟件運行所需要的所有東西都打包進去了,比如它需要哪個版本的Python、需要哪些系統文件、配…

云服務掃盲筆記(2) —— SLS 接入與設置自動化

前篇我們學習了SLS的核心用途及概念,本篇以將一個linux服務器的json格式日志接入阿里云SLS為例,繼續學習SLS接入中的關鍵設置及注意事項,以及如何將其實現簡單自動化快速操作。 一、 SLS 日志接入流程 [1] 準備工作(確定日志路徑…

LwIP入門實戰 — 6 LwIP 網絡數據包

目錄 6.1 pbuf結構體 6.2 pbuf 的類型 6.2.1 PBUF_RAM 類型的pbuf 6.2.2 PBUF_POOL 類型的pbuf 6.2.3 PBUF_ROM 和 PBUF_REF 類型pbuf 6.3 pbuf 6.3.1 pbuf_alloc() 6.3.2 pbuf_free() 6.4 其它pbuf 操作函數 6.5 網卡中使用的 pbuf 6.5.1 low_level_output() 6.5.…

【已解決】Linux中程序腳本可以手動執行成功,但加在rc.local中不能開機自啟

之前開發遇到的一個問題:在Linux中,明明程序腳本可以手動執行成功,但加到開機自啟動里,卻會失敗,屬實讓人摸不著頭腦。 問題排查: 有以下幾種可能: 自啟動腳本,執行權限不足或者腳本…

切塊、清洗、烹飪:RAG知識庫構建的三步曲

嘿,各位AI技術愛好者們,你是不是經常遇到這樣的情況:辛辛苦苦訓練的AI助手,面對專業問題時卻"一問三不知"或者"胡言亂語"?明明你已經喂了它一堆PDF和Word文檔,為啥它就是不會用&#x…

ubuntu 安裝 docker 詳細步驟

登錄,ubuntu版本 22.04 wqbboy192.168.1.2s password: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/…

AndroidWorld+mobileRL

1、Android地址 https://github.com/google-research/android_world/tree/main?tabreadme-ov-file#installation 這里有排行榜,提交方式為手工提交到共享表格 https://docs.google.com/spreadsheets/d/1cchzP9dlTZ3WXQTfYNhh3avxoLipqHN75v1Tb86uhHo/edit?gid0#g…

《練手:ipv4地址計算和Telnet 遠程設備管理配置實驗文檔》

實驗一:IPv4 地址網段判斷原理及實例 判斷兩個 IPv4 地址是否處于同一網段,核心依據是:將兩個 IP 地址分別與子網掩碼進行AND 運算后,得到的網絡地址是否相同。若相同,則屬于同一網段;反之則不屬于。 實驗拓…