Spring MVC 框架 的核心概念、組件關系及流程的詳細說明,并附表格總結

以下是 Spring MVC 框架 的核心概念、組件關系及流程的詳細說明,并附表格總結:


1. 核心理念

Spring MVC 是基于 MVC(Model-View-Controller)設計模式 的 Web 框架,其核心思想是 解耦

  • Model:數據模型,負責業務邏輯和數據處理。
  • View:視圖層,負責數據展示(如 HTML、JSON)。
  • Controller:控制器,負責接收請求、調用 Model、選擇 View。

2. 核心組件詳解

2.1 DispatcherServlet(前端控制器)
  • 作用
    Spring MVC 的核心,處理所有請求的入口點。
  • 功能
    • 接收 HTTP 請求。
    • 分發請求到合適的 Handler(處理器)。
    • 組合 Model 和 View,返回最終響應。
  • 配置
    web.xml 中配置為 Servlet,或通過 @SpringBootApplication 自動配置。
2.2 HandlerMapping(處理器映射器)
  • 作用
    根據請求 URL 找到對應的 Handler(處理器)
  • 功能
    • 將請求 URL 映射到具體的 Controller 方法。
    • 支持多種映射方式(如 @RequestMapping@GetMapping)。
  • 示例
    @Controller
    @RequestMapping("/user")
    public class UserController {@GetMapping("/list")public String list() { ... }
    }
    
2.3 HandlerAdapter(處理器適配器)
  • 作用
    調用 Handler(處理器)并獲取處理結果(ModelAndView)。
  • 功能
    • 將請求參數綁定到方法參數(如 @RequestParam@PathVariable)。
    • 調用 Controller 方法,處理業務邏輯。
    • 將返回值(如 StringModelAndView)轉換為 ModelAndView 對象。
  • 適用場景
    適配不同類型的處理器(如 @Controller@RestController)。
2.4 ViewResolver(視圖解析器)
  • 作用
    將邏輯視圖名(如 "user/list")轉換為具體的 View 對象。
  • 功能
    • 根據配置規則(如前綴、后綴)查找視圖資源。
    • 支持多種視圖技術(如 Thymeleaf、JSP、FreeMarker)。
  • 配置示例
    spring.mvc.view.prefix=/WEB-INF/views/
    spring.mvc.view.suffix=.jsp
    
2.5 Model(模型)
  • 作用
    存儲數據,供視圖渲染使用。
  • 功能
    • 通過 ModelModelAndView@ModelAttribute 注入數據。
    • 示例:
      @Controller
      public class UserController {@GetMapping("/user/{id}")public String getUser(@PathVariable Long id, Model model) {User user = userService.findById(id);model.addAttribute("user", user); // 存入 Modelreturn "user/detail";}
      }
      
2.6 View(視圖)
  • 作用
    將 Model 中的數據渲染為最終的響應(如 HTML 頁面、JSON 數據)。
  • 實現方式
    • Thymeleaf<div th:text="${user.name}"></div>
    • JSP<%= user.getName() %>
    • JSON:通過 @ResponseBody@RestController 直接返回對象。
2.7 Controller(控制器)
  • 作用
    處理 HTTP 請求,調用 Model 并選擇 View。
  • 功能
    • 通過 @Controller@RestController 標記。
    • 使用 @RequestMapping 系列注解定義請求映射。
    • 示例:
      @RestController
      public class UserController {@GetMapping("/api/user/{id}")public User getUser(@PathVariable Long id) {return userService.findById(id);}
      }
      
2.8 攔截器(HandlerInterceptor)
  • 作用
    在請求處理前后執行自定義邏輯(如權限校驗、日志記錄)。
  • 功能
    • 實現 HandlerInterceptor 接口。
    • 通過 WebMvcConfigurer 注冊攔截器。
    • 示例:
      public class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 權限校驗return true; // 繼續處理請求}
      }
      

3. 核心組件關系圖

用戶請求 → DispatcherServlet → HandlerMapping → Handler(Controller)↓HandlerAdapter → 處理請求 → Model + View名稱↓ViewResolver → 解析View → 渲染響應 → 返回客戶端

4. 請求處理流程

  1. 請求到達 DispatcherServlet
    客戶端發送 HTTP 請求到 DispatcherServlet
  2. 映射處理器
    HandlerMapping 根據 URL 找到對應的 Handler(如 UserControllerlist() 方法)。
  3. 調用處理器
    HandlerAdapter 調用 Handler 方法,獲取 ModelAndView(包含數據和邏輯視圖名)。
  4. 解析視圖
    ViewResolver 將邏輯視圖名(如 "user/list")轉換為具體的 View(如 /WEB-INF/views/user/list.jsp)。
  5. 渲染響應
    View 使用 Model 數據生成最終響應(HTML、JSON 等),返回給客戶端。

5. 表格總結

組件作用角色示例/配置
DispatcherServlet接收請求,分發到 Handler,組合 Model 和 View。中央調度器,核心組件。@SpringBootApplication 自動配置。
HandlerMapping映射請求 URL 到對應的 Handler(Controller)。請求路由的橋梁。@RequestMapping@GetMapping
HandlerAdapter調用 Handler 方法,處理參數綁定和返回值轉換。調用處理器的適配器。支持 @RequestParam@PathVariable
ViewResolver將邏輯視圖名轉換為具體的 View 對象。視圖解析器,支持多種模板引擎。spring.mvc.view.prefix=/views/spring.mvc.view.suffix=.jsp
Model存儲數據,供視圖渲染。數據容器。Model@ModelAttribute
View渲染最終的響應(HTML、JSON 等)。響應生成器。Thymeleaf、JSP、FreeMarker。
Controller處理請求,調用 Model,選擇 View。業務邏輯處理器。@Controller@RestController
HandlerInterceptor在請求處理前后執行攔截邏輯(如權限校驗)。請求攔截器。實現 HandlerInterceptor 接口,通過 WebMvcConfigurer 注冊。

6. 關鍵概念關系圖

用戶請求 → DispatcherServlet → HandlerMapping(找到 Controller) → HandlerAdapter(調用 Controller 方法)↓Model(存儲數據) → ViewResolver(解析視圖) → View(渲染響應)

7. 注意事項

  • 注解驅動:通過 @EnableWebMvc@SpringBootApplication 啟用注解支持。
  • 異步處理:通過 @AsyncDeferredResult 實現異步請求。
  • 異常處理:通過 @ControllerAdvice 統一處理全局異常。

通過以上組件和流程,Spring MVC 實現了請求的解耦和高效處理,是構建現代化 Web 應用的首選框架。

在這里插入圖片描述

一、Spring MVC 請求處理全流程詳解

1. 請求參數接收
  • 實現方式:通過方法參數注解(如 @RequestParam, @PathVariable, @RequestBody)直接綁定請求參數。

    @GetMapping("/user/{id}")
    public String getUser(@PathVariable String id, @RequestParam String name) {// 參數綁定到方法參數
    }
    
  • 核心類ServletInvocableHandlerMethod 負責參數解析,通過 HandlerMethodArgumentResolver 解析不同注解的參數。


2. 請求分發到控制器方法
  • 流程DispatcherServlet 通過 HandlerMapping 定位處理器(Controller方法)。
    • 關鍵類RequestMappingHandlerMapping 根據 @RequestMapping 注解匹配 URL 和 HTTP 方法。
    • 匹配邏輯:解析 @RequestMappingpathmethod 等屬性,生成 HandlerExecutionChain
    // 示例:匹配到 UserController 的 getUser 方法
    @Controller
    @RequestMapping("/user")
    public class UserController {@GetMapping("/{id}")public String getUser(@PathVariable String id) { ... }
    }
    

3. 視圖定位與渲染
  • 視圖解析ViewResolver 根據邏輯視圖名(如 user/list)解析為實際視圖(如 JSP 文件)。

    • 核心類InternalResourceViewResolver 將視圖名轉換為 /WEB-INF/views/user/list.jsp
    // 配置視圖解析器
    @Bean
    public ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;
    }
    
  • 視圖類型:JSP、Thymeleaf、FreeMarker 等,通過 View 接口實現。


二、流程可省略與可自定義部分

1. 可省略的流程
流程階段省略條件替代處理方式
視圖解析返回值添加 @ResponseBodyHttpMessageConverter 直接序列化返回
視圖渲染返回 JSON/XML 等數據格式無需渲染,直接寫入響應體
Session管理無會話需求(如 REST API)關閉 Session 支持(@Controller 不繼承 @SessionAttributes

2. 可自定義的流程
流程階段自定義方式實現類/注解
參數綁定自定義參數解析器HandlerMethodArgumentResolver
處理器映射自定義請求到方法的匹配規則HandlerMapping
視圖解析自定義視圖解析邏輯ViewResolver
異常處理自定義全局異常處理器@ControllerAdvice + @ExceptionHandler

三、DispatcherServlet.properties 定義的類及作用

1. 核心類列表
類名作用
RequestMappingHandlerMapping根據 @RequestMapping 注解匹配 Controller 方法
RequestMappingHandlerAdapter調用 Controller 方法并處理方法參數和返回值
BeanNameUrlHandlerMapping根據 Bean 名稱直接映射 URL(如 loginController 對應 /loginController
SimpleUrlHandlerMapping簡單的 URL 映射配置(通過 XML 配置 URL 和 Controller 關聯)
DefaultAnnotationHandlerMapping舊版注解處理器映射(Spring 3.0 后逐步被 RequestMappingHandlerMapping 替代)
InternalResourceViewResolver解析 JSP 視圖,將邏輯視圖名轉換為實際資源路徑
ContentNegotiatingViewResolver根據請求的 Accept 頭選擇合適視圖(如 JSON 或 HTML)
HandlerExceptionResolver全局異常處理,將異常轉換為視圖或 HTTP 狀態碼
2. 流程總結表格
流程階段是否可省略是否可自定義默認實現類
參數綁定ServletModelAttributeMethodProcessor
請求分發RequestMappingHandlerMapping
視圖解析InternalResourceViewResolver
視圖渲染JstlView(JSP)
異常處理DefaultHandlerExceptionResolver

四、關鍵代碼注釋示例

// 1. Controller 方法參數綁定示例
@GetMapping("/search")
public String search(@RequestParam String keyword, @RequestBody User user) { // @RequestParam 綁定查詢參數,@RequestBody 綁定 JSON 請求體
}// 2. 自定義視圖解析器(實現 ViewResolver 接口)
public class CustomViewResolver implements ViewResolver {@Overridepublic View resolveViewName(String viewName, Locale locale) {// 自定義邏輯:根據 viewName 返回自定義 View 實現return new CustomView();}
}// 3. @ResponseBody 省略視圖流程
@GetMapping("/api/user")
@ResponseBody
public User getUserAsJson() {// 直接返回對象,由 Jackson 轉換為 JSON,跳過視圖解析
}

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

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

相關文章

Android里藍牙使用流程以及問題詳解

一、基礎流程 請簡述 Android 藍牙開發的基本流程 1. 權限處理&#xff1a;動態申請藍牙和定位權限&#xff08;注意Android 12新權限&#xff09; 2. 初始化藍牙適配器&#xff1a;通過BluetoothManager獲取BluetoothAdapter 3. 設備發現&#xff1a;- 注冊BroadcastReceive…

OpenWrt 上安裝Tailscale

在 OpenWrt 上安裝 Tailscale 非常簡單&#xff0c;主要步驟如下&#xff1a; 1. 確保 OpenWrt 設備可聯網 首先&#xff0c;確保你的 OpenWrt 設備已經聯網&#xff0c;可以訪問外網&#xff0c;并且 SSH 進入你的路由器&#xff08;通常是 192.168.1.1&#xff09;&#xff…

藍橋杯刷題總結 + 應賽技巧

當各位小伙伴們看到這篇文章的時候想必藍橋杯也快開賽了&#xff0c;那么本篇文章博主就來總結一下一些藍橋杯的應賽技巧&#xff0c;那么依舊先來走個流程 那么接下來我們分成幾個板塊進行總結 首先是一些基本語法 編程語言的基本語法 首先是數組&#xff0c;在存數據的時候…

TCP重傳率高與傳輸延遲問題

目錄標題 排查步驟&#xff1a;TCP重傳率高與傳輸延遲問題v1.0通過 rate(node_netstat_Tcp_RetransSegs[3m]) 排查 TCP 重傳問題的步驟1. **指標含義與初步分析**2. **關聯指標排查**3. **定位具體問題源**4. **解決方案**5. **驗證與監控** v2.0一、基礎檢查二、網絡層分析三、…

【LeetCode 熱題100】73:矩陣置零(詳細解析)(Go語言版)

&#x1f680; 力扣熱題 73&#xff1a;矩陣置零&#xff08;詳解 多種解法&#xff09; &#x1f4cc; 題目描述 給定一個 m x n 的整數矩陣 matrix&#xff0c;如果一個元素為 0&#xff0c;則將其所在行和列的所有元素都設為 0。請你 原地 使用常量空間解決。 &#x1f3a…

組播網絡構建:IGMP、PIM 原理及應用實踐

IP組播基礎 組播基本架構 組播IP地址 一個組播IP地址并不是表示具體的某臺主機&#xff0c;而是一組主機的集合&#xff0c;主機聲明加入某組播組即標識自己需要接收目的地址為該組播地址的數據IP組播常見模型分為ASM模型和SSM模型ASM&#xff1a;成員接收任意源組播數據&…

Unity UGUI使用手冊

概述 UGUI(Unity Graphical User Interface) :Unity 圖像用戶界面 在游戲開發中&#xff0c;我們經常需要搭建一些圖形用戶界面。Unity內置的UGUI可以幫助開發者可視化地拼接界面&#xff0c;提高開發效率。UGUI提供不同樣式的UI組件&#xff0c;并且封裝了對應功能的API&am…

Python web程序在服務器上面部署詳細步驟

在服務器上部署Python web程序通常涉及以下步驟&#xff1a; 設置服務器環境: 選擇合適的服務器&#xff0c;如AWS EC2、DigitalOcean Droplet等。配置服務器操作系統&#xff0c;例如Ubuntu、CentOS等。安裝必要的軟件&#xff0c;如Python、pip、git等。 準備Python web程序…

條件生成對抗網絡(Conditional GAN, CGAN)原理及實現(pytorch版)

CGAN 原理及實現 一、CGAN 原理1.1 基本概念1.2 與傳統GAN的區別1.3 目標函數1.4 損失函數1.5 條件信息的融合方式1.6 與其他GAN變體的對比1.7 CGAN的應用1.8 改進與變體 二、CGAN 實現2.1 導包2.2 數據加載和處理2.3 構建生成器2.4 構建判別器2.5 訓練和保存模型2.6 繪制訓練損…

Go語言比較遞歸和循環執行效率

一、概念 1.遞歸 遞歸是指一個函數在其定義中直接或間接調用自身的編程方法 。簡單來說&#xff0c;就是函數自己調用自己。遞歸主要用于將復雜的問題分解為較小的、相同類型的子問題&#xff0c;通過不斷縮小問題的規模&#xff0c;直到遇到一個最簡單、最基礎的情況&#x…

keepalived高可用介紹

keepalived 是 Linux 一個輕量級的高可用解決方案&#xff0c;提供了心跳檢測和資源接管、檢測集群中的系統服務&#xff0c;在集群節點間轉移共享IP 地址的所有者等。 工作原理 keepalived 通過 VRRP&#xff08;virtual router redundancy protocol&#xff09;虛擬路由冗余…

數據分享:汽車測評數據

說明&#xff1a;如需數據可以直接到文章最后關注獲取。 1.數據背景 Car Evaluation汽車測評數據集是一個經典的機器學習數據集&#xff0c;最初由 Marko Bohanec 和 Blaz Zupan 創建&#xff0c;并在 1997 年發表于論文 "Classifier learning from examples: Common …

NLP簡介及其發展歷史

自然語言處理&#xff08;Natural Language Processing&#xff0c;簡稱NLP&#xff09;是人工智能和計算機科學領域中的一個重要分支&#xff0c;致力于實現人與計算機之間自然、高效的語言交流。本文將介紹NLP的基本概念以及其發展歷史。 一、什么是自然語言處理&#xff1f…

HOOPS Visualize:跨平臺、高性能的三維圖形渲染技術解析

在當今數字化時代&#xff0c;三維可視化技術已成為眾多行業的核心競爭力。HOOPS Visualize作為一款功能強大的三維圖形渲染引擎&#xff0c;憑借其卓越的渲染能力、跨平臺支持、豐富的交互功能、高度定制化以及快速部署等特性&#xff0c;為開發人員提供了構建高質量、高性能3…

藍橋杯速成刷題清單(上)

一、1.排序 - 藍橋云課 &#xff08;快速排序&#xff09;算法代碼&#xff1a; #include <bits/stdc.h> using namespace std; const int N 5e5 10; int a[N];int main() {int n;cin >> n;for (int i 0; i < n; i) {cin >> a[i];}sort(a, a n);for …

Java面試黃金寶典44

1. 查看進程的運行堆棧信息命令 gstack gstack 是 Linux 系統下用于查看指定進程運行時堆棧信息的工具。當程序出現崩潰、死鎖或者性能瓶頸等問題時,借助 gstack 可以查看進程中各個線程的調用棧,從而輔助開發人員定位問題。 定義 gstack 本質上是一個封裝了底層 ptrace 系統…

嵌入式硬件篇---TOF陀螺儀SPI液晶屏

文章目錄 前言1. TOF傳感器&#xff08;Time of Flight&#xff09;原理STM32使用方法硬件連接SDASCLVCC\GND 軟件配置初始化I2C外設庫函數驅動&#xff1a;讀取數據 2. 陀螺儀&#xff08;如MPU6050&#xff09;原理STM32使用方法硬件連接SDA/SCLINTVCC/GND 軟件配置初始化I2C…

【scikit-learn基礎】--『預處理』之 正則化

數據的預處理是數據分析&#xff0c;或者機器學習訓練前的重要步驟。 通過數據預處理&#xff0c;可以 提高數據質量&#xff0c;處理數據的缺失值、異常值和重復值等問題&#xff0c;增加數據的準確性和可靠性整合不同數據&#xff0c;數據的來源和結構可能多種多樣&#xff…

LeetCode Hot100 刷題筆記(2)—— 子串、普通數組、矩陣

目錄 前言 一、子串 1. 和為 K 的子數組 2. 滑動窗口最大值 3. 最小覆蓋子串 二、普通數組 4. 最大子數組和 5. 合并區間 6. 輪轉數組 7. 除自身以外數組的乘積 8. 缺失的第一個正數 三、矩陣 9. 矩陣置零 10. 螺旋矩陣 11. 旋轉圖像 12. 搜索二維矩陣 II 前言 一、子串&#…

【Git 常用操作指令指南】

一、初始化與配置 1. 設置全局賬戶信息 git config --global user.name "用戶名" # 設置全局用戶名 git config --global user.email "郵箱" # 設置全局郵箱 --global 表示全局生效&#xff0c;若需針對單個倉庫配置&#xff0c;可省略該參數 2.…