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 方法,处理业务逻辑。
- 将返回值(如
String、ModelAndView)转换为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(模型)
- 作用:
存储数据,供视图渲染使用。 - 功能:
- 通过
Model、ModelAndView或@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直接返回对象。
- Thymeleaf:
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. 请求处理流程
- 请求到达 DispatcherServlet:
客户端发送 HTTP 请求到DispatcherServlet。 - 映射处理器:
HandlerMapping根据 URL 找到对应的Handler(如UserController的list()方法)。 - 调用处理器:
HandlerAdapter调用Handler方法,获取ModelAndView(包含数据和逻辑视图名)。 - 解析视图:
ViewResolver将逻辑视图名(如"user/list")转换为具体的View(如/WEB-INF/views/user/list.jsp)。 - 渲染响应:
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启用注解支持。 - 异步处理:通过
@Async或DeferredResult实现异步请求。 - 异常处理:通过
@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 方法。 - 匹配逻辑:解析
@RequestMapping的path、method等属性,生成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. 可省略的流程
| 流程阶段 | 省略条件 | 替代处理方式 |
|---|---|---|
| 视图解析 | 返回值添加 @ResponseBody | 由 HttpMessageConverter 直接序列化返回 |
| 视图渲染 | 返回 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,跳过视图解析
}
相关文章:
Spring MVC 框架 的核心概念、组件关系及流程的详细说明,并附表格总结
以下是 Spring MVC 框架 的核心概念、组件关系及流程的详细说明,并附表格总结: 1. 核心理念 Spring MVC 是基于 MVC(Model-View-Controller)设计模式 的 Web 框架,其核心思想是 解耦: Model:数…...
使用 redis 实现消息队列
方案1: 使用list做消息队列问题1: 如何保证消息不丢失问题 2: 重复消费/幂等 方案 2: zset实现消息队列方案 3: 发布/订阅(pub/sub)问题1: 如何保证消息不丢失问题 2: 重复消费/幂等 方案 4: Stream 实现消息队列问题1: 如何保证消息不丢失问题 2: 重复消费/幂等 方案1: 使用li…...
金融数据分析(Python)个人学习笔记(6):安装相关软件
python环境的安装请查看Python个人学习笔记(1):Python软件的介绍与安装 一、pip 在windows系统中检查是否安装了pip 打开命令提示符的快捷键:winR,然后输入cmd 在命令提示符中执行如下命令 python -m pip --version…...
Android Material Design 3 主题配色终极指南:XML 与 Compose 全解析
最小必要颜色配置 <!-- res/values/themes.xml --> <style name"Theme.MyApp" parent"Theme.Material3.DayNight"><!-- 基础三原色 --><item name"colorPrimary">color/purple_500</item><item name"col…...
PyTorch参数管理详解:从访问到初始化与共享
本文通过实例代码讲解如何在PyTorch中管理神经网络参数,包括参数访问、多种初始化方法、自定义初始化以及参数绑定技术。所有代码可直接运行,适合深度学习初学者进阶学习。 1. 定义网络与参数访问 1.1 定义单隐藏层多层感知机 import torch from torch…...
页面简单传参
#简单的情景:你需要在帖子主页传递参数给帖子详情页面,携带在主页获得的帖子ID。你有以下几种传递方法# #使用Vue3 TS# 1. 通过 URL 参数传递(Query 参数) 这是最简单、最常用的方法,ID 会显示在 URL 中的 ? 后面…...
nginx路径匹配的优先级
在 Nginx 配置中,当请求 /portal/agent/sse 时,会匹配 location ~* /sse$ 规则,而不是 location /portal。原因如下: 匹配规则解析 location ~* /sse$ ~* 表示 不区分大小写的正则匹配/sse$ 表示以 /sse 结尾的路径匹配结果&#…...
一周学会Pandas2 Python数据处理与分析-Pandas2一维数据结构-Series
锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Pandas提供Series和DataFrame作为数组数据的存储框架。 Series(系列、数列、序列)是一个带有…...
DApp实战篇:前端技术栈一览
前言 在前面一系列内容中,我们由浅入深地了解了DApp的组成,从本小节开始我将带领大家如何完成一个完整的DApp。 本小节则先从前端开始。 前端技术栈 在前端开发者速入:DApp中的前端要干些什么?文中我说过,即便是在…...
leetcode6.Z字形变换
题目说是z字形变化,但其实模拟更像n字形变化,找到字符下标规律就逐个拼接就能得到答案 class Solution {public String convert(String s, int numRows) {if(numRows1)return s;StringBuilder stringBuilder new StringBuilder();for (int i 0; i <…...
HarmonyOS应用开发者高级-编程题-001
题目一:跨设备分布式数据同步 需求描述 开发一个分布式待办事项应用,要求: 手机与平板登录同一华为账号时,自动同步任务列表任一设备修改任务状态(完成/删除),另一设备实时更新任务数据在设备离线时能本地存储,联网后自动同步实现方案 // 1. 定义分布式数据模型 imp…...
鸿蒙开发者高级认证编程题库
题目一:跨设备分布式数据同步 需求描述 开发一个分布式待办事项应用,要求: 手机与平板登录同一华为账号时,自动同步任务列表任一设备修改任务状态(完成/删除),另一设备实时更新任务数据在设备离线时能本地存储,联网后自动同步实现方案 // 1. 定义分布式数据模型 imp…...
Ubuntu(CentOS、Rockylinux等)快速进入深度学习pytorch环境
这里写自定义目录标题 安装进入系统(如Ubuntu22.04)安装anacondapip、conda换源pip换源conda换源 安装nvidia安装pytorch环境针对于wsl的优化 安装进入系统(如Ubuntu22.04) docker 、 wsl 、 双系统 、服务器系统 推荐 Ubuntu 20…...
[实战] 天线阵列波束成形原理详解与仿真实战(完整代码)
天线阵列波束成形原理详解与仿真实战 1. 引言 在无线通信、雷达和声学系统中,波束成形(Beamforming)是一种通过调整天线阵列中各个阵元的信号相位和幅度,将电磁波能量集中在特定方向的技术。其核心目标是通过空间滤波增强目标方…...
Android开发okhttp添加头部参数
Android开发okhttp添加头部参数或者是头文件 private static class RequestHeaderInterceptor implements Interceptor {Overridepublic Response intercept(Chain chain) throws IOException {Request original chain.request();//添加头部信息Request request original.new…...
Halcon图像采集
Halcon是一款强大的机器视觉软件,结合C#可以开发出功能完善的视觉应用程序。 基本设置 确保已经安装了Halcon和Halcon的.NET库(HalconDotNet)。 1. 添加引用 在C#项目中,需要添加对HalconDotNet.dll的引用: 右键点…...
自动提取pdf公式 ➕ 输出 LaTeX
# 创建打包脚本的主内容 script_content """ from doc2x.extract_formula import extract_formula_imgs from pix2text import Pix2Text from PIL import Image import osdef main():pdf_path "your_file.pdf" # 将你的PDF命名为 your_file.pdf 并…...
(十)安卓开发中的Activity之间的通信使用详解
在 Android 开发中,Activity 之间的通信是非常常见且核心的功能之一,常见的方式包括: 使用显式 Intent 传递数据使用隐式 Intent 实现跨组件调用使用 startActivityForResult(或新版 Activity Result API)回传数据传递…...
python 浅拷贝copy与深拷贝deepcopy 理解
一 浅拷贝与深拷贝 1. 浅拷贝 浅拷贝只复制了对象本身(即c中的引用)。 2. 深拷贝 深拷贝创建一个新的对象,同时也会创建所有子对象的副本,因此新对象与原对象之间完全独立。 二 代码理解 1. 案例一 a 10 b a b 20 print…...
基于neo4j存储知识树-mac
1、安装jdk21 for mac(jdk-21_macos-aarch64_bin.dmg) 2、安装neo4j for mac(neo4j-community-5.26.0-unix.tar.gz) 3、使用默认neo4j/neo4j登录http://localhost:7474 修改登录密码,可以使用生成按钮生成密码,连接数据库,默认设置为neo4j…...
Tiktok 关键字 视频及评论信息爬虫(1) [2025.04.07]
🙋♀️Tiktok APP的基于关键字检索的视频及评论信息爬虫共分为两期,希望对大家有所帮助。 第一期见下文。 第二期:基于视频URL的评论信息爬取 1. Node.js环境配置 首先配置 JavaScript 运行环境(如 Node.js)&#x…...
基于人工智能的高中教育评价体系重构研究
基于人工智能的高中教育评价体系重构研究 一、引言 1.1 研究背景 在科技飞速发展的当下,人工智能技术已广泛渗透至各个领域,教育领域亦不例外。人工智能凭借其强大的数据处理能力、智能分析能力和个性化服务能力,为教育评价体系的创新与发…...
【学习笔记】文件上传漏洞--二次渲染、.htaccess、变异免杀
目录 第十二关 远程包含地址转换 第十三关 突破上传删除 条件竞争 第十四关 二次渲染 第十五关 第十六关 第十七关 .htaccess 第十八关 后门免杀 第十九关 日志包含 第十二关 远程包含地址转换 延续第十一关,加一个文件头,上传成功,…...
C++ 基础进阶
C 基础进阶 内容概述: 函数重载:int add(int x, inty);,long long add(long long x, long long y);,double add(double x, double y);模板函数:template<typename T> 或 template<class T>结构体&#x…...
【OS】Process Management(3)
《计算机操作系统(第三版)》(汤小丹)学习笔记 文章目录 5、进程通信(Inter-Process Communication)5.1、进程通信的类型5.1.1、共享存储器系统(Shared Memory System)5.1.2、消息传递…...
单reactor实战
前言:reactor作为一种高性能的范式,值得我们学习 本次目标 实现一个基于的reactor 具备echo功能的服务器 核心组件 Reactor本身是靠一个事件驱动的框架,无疑引出一个类似于moduo的"EventLoop "以及boost.asio中的context而言,不断…...
初阶C++笔记第一篇:C++基础语法
虽然以下大多数知识点都在C语言中学过,但还是有一些知识点和C语言不同,比如:代码格式、头文件、关键字、输入输出、字符串类型等... 1. 初识C 1.1 第一个C程序 编写C分为4个步骤: 创建项目创建文件编写代码运行程序 C的第一条…...
java基础 流(Stream)
Stream Stream 的核心概念核心特点 Stream 的操作分类中间操作(Intermediate Operations)终止操作(Terminal Operations) Stream 的流分类顺序流(Sequential Stream)并行流(Parallel Stream&…...
【AI】prompt engineering
prompt engineering ## prompt engineering ## prompt engineering ## prompt engineering 一、定义 Prompt 工程(Prompt Engineering)是指在使用语言模型(如 ChatGPT、文心一言等)等人工智能工具时,设计和优化输入提…...
无需libpacp库,BPF指令高效捕获指定数据包
【环境】无libpacp库的Linux服务器 【要求】高效率读取数据包,并过滤指定端口和ip 目前遇到两个问题 一是手写BPF,难以兼容,有些无法正常过滤二是性能消耗问题,尽可能控制到1% 大方向:过滤数据包要在内核层处理&…...
