Spring MVC 請求處理流程詳解

步驟1:用戶發起請求
  • 所有請求首先被?DispatcherServlet(前端控制器)攔截,它是整個流程的入口。

  • DispatcherServlet?繼承自?HttpServlet,通過?web.xml?或?WebApplicationInitializer?配置映射路徑(如?/)。

步驟2:請求映射(Handler Mapping)
  • HandlerMapping?根據請求的 URL、參數、Header 等信息,找到對應的?處理器(Handler)

    • 處理器?可以是?@Controller?注解的類中的方法,或實現?Controller?接口的類。

    • 關鍵接口RequestMappingHandlerMapping(處理?@RequestMapping?注解)。

  • 匹配規則

    @Controller
    public class UserController {@GetMapping("/users/{id}")public String getUser(@PathVariable Long id, Model model) {// 業務邏輯}
    }
步驟3:處理器適配(Handler Adapter)
  • HandlerAdapter?負責調用處理器方法,并處理參數綁定、返回值轉換。

    • 關鍵實現類RequestMappingHandlerAdapter(支持?@RequestMapping?方法)。

    • 適配過程

      1. 解析方法參數(如?@RequestParam@RequestBody)。

      2. 執行方法邏輯。

      3. 處理返回值(如?ModelAndView、JSON 數據)。

步驟4:執行攔截器(Interceptor)
  • HandlerInterceptor?在處理器執行前后插入邏輯:

    • preHandle:在處理器方法執行前調用(如權限校驗)。

    • postHandle:在處理器方法執行后、視圖渲染前調用。

    • afterCompletion:在請求完成后調用(資源清理)。

步驟5:業務邏輯處理
  • 控制器方法執行業務邏輯,可能涉及:

    • 調用 Service 層處理數據。

    • 操作 Model 對象向視圖傳遞數據。

      @GetMapping("/users")
      public String listUsers(Model model) {List<User> users = userService.findAll();model.addAttribute("users", users); // 數據傳遞到視圖return "user/list"; // 視圖名稱
      }

步驟6:視圖解析(View Resolver)
  • ViewResolver?將控制器返回的視圖名稱解析為具體的?View?對象。

    • 常見實現

      • InternalResourceViewResolver:解析 JSP 頁面(如?/WEB-INF/views/user/list.jsp)。

      • ThymeleafViewResolver:解析 Thymeleaf 模板。

    • 配置示例

      @Bean
      public ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;
      }
步驟7:視圖渲染(View Rendering)
  • View?對象將模型數據渲染到響應中(如生成 HTML、JSON)。

    • 渲染方式

      • JSP:使用 JSTL 或 EL 表達式填充數據。

      • REST API:通過?HttpMessageConverter?將返回值序列化為 JSON(如?@ResponseBody)。

步驟8:返回響應
  • 渲染后的響應通過?DispatcherServlet?返回給客戶端。

?


?關鍵組件與接口

組件職責
DispatcherServlet前端控制器,統一調度請求處理流程。
HandlerMapping映射請求到處理器(Controller 方法)。
HandlerAdapter調用處理器方法,處理參數綁定與返回值。
ViewResolver解析視圖名稱到具體視圖實現(如 JSP、Thymeleaf)。
HandlerInterceptor攔截請求,實現預處理和后處理邏輯(如日志、權限校驗)。
HttpMessageConverter處理請求/響應的數據轉換(如 JSON ? Java 對象)。

異常處理機制

  • @ExceptionHandler:在 Controller 內處理特定異常。

    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<String> handleUserNotFound(UserNotFoundException ex) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
  • HandlerExceptionResolver:全局異常解析器,自定義異常響應。

  • @ControllerAdvice:定義全局異常處理類。

    @ControllerAdvice
    public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ModelAndView handleAllExceptions(Exception ex) {ModelAndView mav = new ModelAndView("error");mav.addObject("message", ex.getMessage());return mav;}
    }


?RESTful 請求處理

  • @RestController:組合?@Controller?和?@ResponseBody,直接返回數據。

    @RestController
    @RequestMapping("/api/users")
    public class UserApiController {@GetMapping("/{id}")public User getUser(@PathVariable Long id) {return userService.findById(id);}
    }
  • 內容協商:根據請求的?Accept?Header 返回 JSON/XML 等格式(通過?HttpMessageConverter)。


源碼級流程解析(簡化版)
  1. DispatcherServlet.doDispatch()

    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {HandlerExecutionChain mappedHandler = getHandler(request); // 獲取處理器鏈HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());ModelAndView mv = ha.handle(request, response, mappedHandler.getHandler());processDispatchResult(request, response, mappedHandler, mv, dispatchException);
    }

? ? 2.參數解析:通過?HandlerMethodArgumentResolver?解析方法參數。

? ? 3.返回值處理:通過?HandlerMethodReturnValueHandler?處理返回值。


總結
  • 核心流程:DispatcherServlet → HandlerMapping → HandlerAdapter → Interceptor → ViewResolver。

  • 擴展點:攔截器、異常處理器、自定義參數解析器。

  • 設計思想:職責分離、組件化、高度可定制。


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

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

相關文章

Vue 高級技巧深度解析

Vue 高級技巧深度解析 mindmaproot(Vue2高級技巧)組件通信EventBusprovide/inject$attrs/$listeners性能優化虛擬DOM優化函數式組件按需加載狀態管理Vuex模塊化持久化存儲嚴格模式高級指令自定義指令動態組件異步組件渲染控制作用域插槽渲染函數JSX支持一、組件通信的進階之道 …

2024年React最新高頻面試題及核心考點解析,涵蓋基礎、進階和新特性,助你高效備戰

以下是2024年React最新高頻面試題及核心考點解析&#xff0c;涵蓋基礎、進階和新特性&#xff0c;助你高效備戰&#xff1a; 一、基礎篇 React虛擬DOM原理及Diff算法優化策略 ? 必考點&#xff1a;虛擬DOM樹對比&#xff08;同級比較、Key的作用、組件類型判斷&#xff09; ?…

Zookeeper單機三節點集群部署(docker-compose方式)

前提: 服務器需要有docker鏡像zookeeper:3.9.3 或能連網拉取鏡像 服務器上面新建文件夾: mkdir -p /data/zk-cluster/{data,zoo-cfg} 創建三個zookeeper配置文件zoo1.cfg、zoo2.cfg、zoo3.cfg,配置文件里面內容如下(三個文件內容一樣): tickTime=2000 initLimit=10 …

面試題之數據庫-mysql高階及業務場景設計

最近開始面試了&#xff0c;410面試了一家公司 針對自己薄弱的面試題庫&#xff0c;深入了解下&#xff0c;也應付下面試。在這里先祝愿大家在現有公司好好沉淀&#xff0c;定位好自己的目標&#xff0c;在自己的領域上發光發熱&#xff0c;在自己想要的領域上&#xff08;技術…

數字內容體驗案例解析與行業應用

數字內容案例深度解析 在零售行業頭部品牌的實踐中&#xff0c;數字內容體驗的革新直接推動了用戶行為模式的轉變。某國際美妝集團通過搭建智能內容中臺&#xff0c;將產品信息庫與消費者行為數據實時對接&#xff0c;實現不同渠道的動態內容生成。其電商平臺首頁的交互式AR試…

4.15 代碼隨想錄第四十四天打卡

99. 島嶼數量(深搜) (1)題目描述: (2)解題思路: #include <iostream> #include <vector> using namespace std;int dir[4][2] {0, 1, 1, 0, -1, 0, 0, -1}; // 四個方向 void dfs(const vector<vector<int>>& grid, vector<vector<bool&g…

【三維重建與生成】GenFusion:SVD統一重建和生成

標題:《GenFusion: Closing the Loop between Reconstruction and Generation via Videos》 來源&#xff1a;西湖大學&#xff1b;慕尼黑工業大學&#xff1b;上海科技大學&#xff1b;香港大學&#xff1b;圖賓根大學 項目主頁&#xff1a;https://genfusion.sibowu.com 文章…

Quipus,LightRag的Go版本的實現

1 項目簡介 奇譜系統當前版本以知識庫為核心&#xff0c;基于知識庫可以快構建自己的問答系統。知識庫的Rag模塊的構建算法是參考了LightRag的算法流程的Go版本優化實現&#xff0c;它可以幫助你快速、準確地構建自己的知識庫&#xff0c;搭建屬于自己的AI智能助手。與當前LLM…

mysql 8 支持直方圖

mysql 8 可以通過語句 ANALYZE TABLE table_name UPDATE HISTOGRAM ON column_name WITH 10 BUCKETS; 生產直方圖&#xff0c;解決索引數據傾斜的問題 在之前的mysql5.7的版本上是沒有的 參考&#xff1a; MySQL :: MySQL 8.0 Reference Manual :: 15.7.3.1 ANALYZE TABL…

力扣-hot100(最長連續序列 - Hash)

128. 最長連續序列 中等 給定一個未排序的整數數組 nums &#xff0c;找出數字連續的最長序列&#xff08;不要求序列元素在原數組中連續&#xff09;的長度。 請你設計并實現時間復雜度為 O(n) 的算法解決此問題。 示例 1&#xff1a; 輸入&#xff1a;nums [100,4,200,…

RCEP框架下eBay日本站選品戰略重構:五維解析關稅紅利機遇

2024年RCEP深化實施背景下&#xff0c;亞太跨境電商生態迎來結構性變革。作為協定核心成員的日本市場&#xff0c;其跨境電商平臺正經歷新一輪價值重構。本文將聚焦eBay日本站&#xff0c;從政策解讀到實操路徑&#xff0c;系統拆解跨境賣家的戰略機遇。 一、關稅遞減機制下的…

Unity開發框架:輸入事件管理類

開發程序的時候經常會出現更改操作方式的情況&#xff0c;這種時候就需要將操作模式以事件的方式注冊到管理輸入事件的類中&#xff0c;方便可以隨時切換和調用 using System; using System.Collections.Generic; using UnityEngine;/// <summary> /// 記錄鼠標事件的的…

【kind管理腳本-2】腳本使用說明文檔 —— 便捷使用 kind 創建、刪除、管理集群腳本

當然可以&#xff0c;以下是為你這份 Kind 管理腳本寫的一份使用說明文檔&#xff0c;可作為 README.md 或內部文檔使用&#xff1a; &#x1f680; Kind 管理腳本說明文檔 本腳本是一個便捷的工具&#xff0c;幫助你快速創建、管理和診斷基于 Kind (Kubernetes IN Docker) 的…

opencv常用邊緣檢測算子示例

opencv常用邊緣檢測算子示例 1. Canny算子2. Sobel算子3. Scharr算子4. Laplacian算子5. 對比 1. Canny算子 從不同視覺對象中提取有用的結構信息并大大減少要處理的數據量的一種技術&#xff0c;檢測算法可以分為以下5個步驟&#xff1a; 噪聲過濾&#xff08;高斯濾波&…

Token安全存儲的幾種方式

文章目錄 1. EncryptedSharedPreferences示例代碼 2. SQLCipher示例代碼 3.使用 Android Keystore加密后存儲示例代碼1. 生成密鑰對2. 使用 KeystoreManager 代碼說明安全性建議加密后的幾種存儲方式1. 加密后采用 SharedPreferences存儲2. 加密后采用SQLite數據庫存儲1. Token…

MySQL數據庫表的約束類型和使用

表完整約束性 約束條件 說明 PRIMARY KEY (PK) 標識該字段為該表的主鍵&#xff0c;是可以唯一的標識記錄&#xff0c;不可以為空 UNIQUENOT NULL (primary key) FOREIGN KEY (FK) 標識該字段為該表的外鍵&#xff0c;實現表與表之間的關聯 (foreign key) NULL …

Java 線程詳解 --線程概念、線程池、線程同步與安全機制

一、Java線程的概念 Java 線程的本質&#xff1a;每個線程對應一個操作系統線程&#xff0c;由操作系統調度。JVM 通過調用操作系統 API&#xff08;如 Linux 的 pthread&#xff09;創建線程。 關鍵點&#xff1a; ? 用戶態與內核態&#xff1a;線程調度依賴操作系統&#…

PCL 計算點云至平面距離(SIMD加速)

文章目錄 一、簡介二、實現代碼三、實現效果一、簡介 SIMD 是一種并行計算模型,其中“單指令”表示處理器在同一時刻執行相同的指令,而“多數據”則表示同一條指令操作多個數據元素(如數組中的多個元素或矩陣中的多個元素)。與傳統的串行計算不同,SIMD 能夠同時處理多個數…

Ubuntu 22.04 完美安裝 ABAQUS 教程:從零到上手,解決兼容問題

教程概述與安裝準備 本教程詳細介紹了在 Ubuntu 22.04 系統上安裝 ABAQUS 2023 及 ifort 2021 的步驟,并實現用戶子程序的鏈接。教程同樣適用于 ABAQUS 2021(需相應調整文件名和路徑)以及 Ubuntu 18.04 至 22.04 系統,盡管未在所有版本上測試。需要注意的是,Intel 的 One…

Spark-TTS(Text-to-Speech):基于大語言模型的語音合成革新者!!!

Spark-TTS&#xff1a;基于大語言模型的語音合成革新者 &#x1f680; &#xff08;全稱解析 核心特性 行業影響全解讀&#xff09; 一、概念定義與技術定位 1. 英文全稱 Spark-TTS: An Efficient LLM-Based Text-to-Speech Model ? 關鍵詞解析&#xff1a; ? LLM-Based…