Spring MVC 中请求处理流程及核心组件解析

news2025/5/17 7:41:47

在 Spring MVC 中,请求从客户端发送到服务器后,需要经过一系列组件的处理才能最终到达具体的 Controller 方法。这个过程涉及多个核心组件和复杂的映射机制,下面详细解析其工作流程:

1. 核心组件与请求流程

Spring MVC 的请求处理流程主要涉及以下核心组件:

DispatcherServlet:前端控制器,接收所有 HTTP 请求,是整个请求处理的入口。

HandlerMapping:请求映射处理器,负责将请求 URL 映射到对应的 Handler(即 Controller 方法)。

HandlerAdapter:处理器适配器,将不同类型的 Handler 统一为可执行的接口。

Controller:具体的业务控制器,处理请求并返回 ModelAndView。

ViewResolver:视图解析器,将逻辑视图名解析为具体的 View 对象。

View:视图对象,负责将模型数据渲染到客户端。

请求处理流程

客户端请求 → DispatcherServlet → HandlerMapping → HandlerAdapter →

Controller → ModelAndView → ViewResolver → View → 响应客户端

2. HandlerMapping 的请求映射机制

HandlerMapping 是实现 URL 到 Controller 方法映射的核心组件,Spring MVC 提供了多种实现:

RequestMappingHandlerMapping:处理 @RequestMapping 注解的映射(最常用)。

BeanNameUrlHandlerMapping:根据 Bean 名称映射请求(如 /hellohelloController Bean)。

SimpleUrlHandlerMapping:通过配置文件手动指定 URL 与 Handler 的映射关系。

基于注解的映射流程

当使用 @RequestMapping 或其派生注解(如 @GetMapping)时:

启动时扫描:Spring MVC 在启动时会扫描所有带有 @Controller@RestController 注解的 Bean。

解析方法映射:提取这些 Bean 中所有标注了 @RequestMapping 的方法,构建映射关系。

生成 HandlerMethod 对象:将每个映射方法封装为 HandlerMethod 对象,包含控制器实例、方法反射信息和请求匹配条件(如 URL、请求方法、请求参数等)。

注册到映射器:将 HandlerMethod 对象注册到 RequestMappingHandlerMapping 的内部映射表中。

3. DispatcherServlet 的请求分发

当接收到请求时,DispatcherServlet 会按以下步骤处理:

获取 HandlerExecutionChain

HandlerExecutionChain handler = getHandler(request);

DispatcherServlet 调用 HandlerMappinggetHandler(request) 方法,根据请求 URL 查找匹配的 Handler。

HandlerMapping 返回一个 HandlerExecutionChain 对象,包含 Handler(即 Controller 方法)和相关的拦截器(Interceptor)。

获取 HandlerAdapter

HandlerAdapter ha = getHandlerAdapter(handler.getHandler());

DispatcherServlet 根据 Handler 的类型,从已注册的 HandlerAdapter 中选择合适的适配器。

例如,RequestMappingHandlerAdapter 用于处理基于注解的 Controller 方法。

执行 Handler

ModelAndView mv = ha.handle(request, response, handler.getHandler());

HandlerAdapter 调用 Controller 方法,并传递请求参数,获取返回的 ModelAndView

4. 参数解析与返回值处理

参数解析

HandlerAdapter 通过 HandlerMethodArgumentResolver 解析请求参数:

内置解析器:Spring MVC 提供多种解析器,例如:

RequestParamMethodArgumentResolver:解析 @RequestParam 注解的参数。

PathVariableMethodArgumentResolver:解析路径变量(如 /users/{id})。

RequestBodyArgumentResolver:解析请求体(如 JSON、XML),需配合 @RequestBody 注解。

自定义解析器:可实现 HandlerMethodArgumentResolver 接口自定义参数解析逻辑。

返回值处理

HandlerAdapter 通过 HandlerMethodReturnValueHandler 处理返回值:

内置处理器:例如:

ViewNameMethodReturnValueHandler:处理返回视图名的方法。

ModelAndViewMethodReturnValueHandler:处理返回 ModelAndView 的方法。

ResponseBodyEmitterReturnValueHandler:处理异步返回值(如 ResponseEntity)。

@ResponseBody 注解:若方法标注了 @ResponseBody,则通过 HttpMessageConverter 将返回值序列化为响应体(如 JSON)。

5. 示例:从请求到 Controller 的完整流程

假设存在以下 Controller:

@RestController

@RequestMapping("/api/users")

public class UserController {

   @Autowired

   private UserService userService;

   @GetMapping("/{id}")

   public UserDTO getUser(@PathVariable Long id) {

       return userService.getUserById(id);

   }

}

请求流程

客户端发送请求 GET /api/users/123

DispatcherServlet 接收请求,调用 RequestMappingHandlerMapping

HandlerMapping 根据 URL /api/users/123 和请求方法 GET,匹配到 UserController.getUser() 方法。

DispatcherServlet 获取 HandlerAdapter(即 RequestMappingHandlerAdapter)。

HandlerAdapter 解析路径变量 id=123,并调用 UserController.getUser(123)

Controller 方法返回 UserDTO 对象。

由于 @RestController 隐含 @ResponseBody,HandlerAdapter 通过 HttpMessageConverterUserDTO 序列化为 JSON。

DispatcherServlet 将 JSON 响应返回给客户端。

6. 拦截器与异常处理

拦截器(Interceptor)

在请求到达 Controller 前后,可通过拦截器执行额外逻辑:

实现 HandlerInterceptor 接口

public class LoggingInterceptor implements HandlerInterceptor {

   @Override

   public boolean preHandle(HttpServletRequest request,

                           HttpServletResponse response,

                           Object handler) {

       // 请求处理前执行(如日志记录、权限校验)

       return true; // 继续执行后续流程

   }

  

   @Override

   public void postHandle(HttpServletRequest request,

                         HttpServletResponse response,

                         Object handler,

                         ModelAndView modelAndView) {

       // 请求处理后、视图渲染前执行

   }

  

   @Override

   public void afterCompletion(HttpServletRequest request,

                               HttpServletResponse response,

                               Object handler,

                               Exception ex) {

       // 完成请求处理(如资源清理)

   }

}

注册拦截器

@Configuration

public class WebConfig implements WebMvcConfigurer {

   @Override

   public void addInterceptors(InterceptorRegistry registry) {

       registry.addInterceptor(new LoggingInterceptor())

               .addPathPatterns("/api/**"); // 拦截所有 API 请求

   }

}
异常处理

通过 @ControllerAdvice@ExceptionHandler 统一处理异常:

@ControllerAdvice

public class GlobalExceptionHandler {

   @ExceptionHandler(NotFoundException.class)

   public ResponseEntity<String> handleNotFoundException(NotFoundException ex) {

       return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());

   }

}

总结

Spring MVC 通过 HandlerMapping 实现 URL 到 Controller 方法的映射,通过 HandlerAdapter 统一调用不同类型的 Handler,并借助 参数解析器返回值处理器 完成请求参数和响应数据的转换。整个过程由 DispatcherServlet 协调,配合拦截器和异常处理机制,形成了一个完整的请求处理体系。理解这些机制,有助于更高效地开发和调试 Spring MVC 应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2377464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCIe Switch 问题点

系列文章目录 文章目录 系列文章目录完善PCIe Retimer Overview Document OutlineSwitch 维度BroadComMicroChipAsmedia 祥硕Cyan其他 完善 Functional block diagram&#xff0c;功能框图Key Features and Benefits&#xff0c;主要功能和优点Fabric 链路Multi-root PCIe Re…

开源轻量级地图解决方案leaflet

Leaflet 地图&#xff1a;开源轻量级地图解决方案 Leaflet 是一个开源的 JavaScript 库&#xff0c;用于在网页中嵌入交互式地图。它以轻量级、灵活性和易用性著称&#xff0c;适用于需要快速集成地图功能的项目。以下是关于 Leaflet 的详细介绍和使用指南。 1. Leaflet 的核心…

Flutter目录结构介绍、入口、Widget、Center组件、Text组件、MaterialApp组件、Scaffold组件

目录 1. 创建Flutter项目 1.1使用Android Studio创建Flutter项目 1.2 使用命令行创建Flutter项目 2. Flutter项目介绍 2.1所有代码都在lib目录下编写 2.1 pubspec.yaml 依赖库/图片的引用 ​编辑 3. 运行项目 4. 编写mian.dart文件 4.1 使用MaterialApp 和 Scaffold两个组件…

如何实现金蝶云星空到MySQL的数据高效集成

金蝶云星空数据集成到MySQL的技术案例分享 在企业信息化建设中&#xff0c;数据的高效流动和准确处理是关键。本文将聚焦于一个具体的系统对接集成案例&#xff1a;金蝶云星空的数据集成到MySQL&#xff0c;方案名称为“xsck-2金蝶销售出库-->mysql”。通过这一案例&#x…

院校机试刷题第四天:1911反转公约数、1702十六进制不进位加法

一、1911反转公约数 1.题目描述 2.解题思路 两个关键点&#xff1a;1.如何把数字反转&#xff0c;2.如何求最大公约数。 反转&#xff1a;用字符串形式存储&#xff0c;定义一个新的字符串倒序存储反转之后的字符串&#xff0c;将字符串按位转换位数字。 求最大公约数&…

Redis解析

Redis解析 一、单线程模型 redis在io层面是多线程的&#xff0c;在数据处理层面是单线程的。 多线程一般用于&#xff1a; 关闭连接删除/淘汰内存网络IO 1.1 io多路复用 redis使用nio&#xff08;select、poll、epoll&#xff09;的方式处理socket 主线程负责接收建立连接…

2025年Ai写PPT工具推荐,这5款Ai工具可以一键生成专业PPT

上个月给客户做产品宣讲时&#xff0c;我对着空白 PPT 页面熬到凌晨一点&#xff0c;光是调整文字排版就改了十几版&#xff0c;最后还是被吐槽 "内容零散没重点"。后来同事分享了几款 ai 写 PPT 工具&#xff0c;试完发现简直打开了新世界的大门 —— 不用手动写大纲…

css:倒影倾斜效果

这是需要实现的效果&#xff0c;平时用的比较多的是添加阴影&#xff0c;是box-shadow&#xff0c;而添加倒影是box-reflect&#xff0c;需要注意的是box-reflect需要添加浏览器前缀&#xff0c;比如我用的谷歌浏览器&#xff0c;要加-webkit-才能生效。 -webkit-box-reflect:…

语音识别——通过PyAudio录入音频

PyAudio 是一个用于处理音频的 Python 库&#xff0c;它提供了录制和播放音频的功能。通过 PyAudio&#xff0c;可以轻松地从麦克风或其他音频输入设备录制音频&#xff0c;并将其保存为文件或进行进一步处理。 安装 PyAudio 在使用 PyAudio 之前&#xff0c;需要先安装它。可…

五月月报丨MaxKB在教育行业的应用进展与典型场景

在2025年的3月和4月的“用户应用月度报告”中&#xff0c;MaxKB开源项目组相继总结了MaxKB开源项目在政府、公共事业、教育、医疗以及企事业单位的应用情况。毫无疑问&#xff0c;在DeepSeek等国产大模型被各行各业的用户广泛接受之后&#xff0c;AI应用建设并运营的步伐也在显…

【流程控制结构】

流程控制结构 流程控制结构1、顺序结构2、选择结构if基本选择结构if else语法多重if语法嵌套if语法switch选择结构 3、循环结构循环结构while循环结构程序调试for循环跳转语句区别 流程控制结构 1、顺序结构 流程图 优先级 2、选择结构 if基本选择结构 单if 语法 if&…

PowerBI基础

一、前言 在当今数据驱动的时代&#xff0c;如何高效地整理、分析并呈现数据&#xff0c;已成为企业和个人提升决策质量的关键能力。Power BI 作为微软推出的强大商业智能工具&#xff0c;正帮助全球用户将海量数据转化为直观、动态的可视化洞察。数据的世界充满可能性&#xf…

一文了解多模态大模型LLaVA与LLaMA的概念

目录 一、引言 二、LLaVA与LLaMA的定义 2.1 LLaMA 2.2 LLaVA 2.3 LLaVA-NeXT 的技术突破 三、产生的背景 3.1 LLaMA的背景 3.2 LLaVA的背景 四、与其他竞品的对比 4.1 LLaMA的竞品 4.2 LLaVA的竞品 五、应用场景 5.1 LLaMA的应用场景 5.2 LLaVA的应用场景 六…

原生小程序+springboot+vue+协同过滤算法的音乐推荐系统(源码+论文+讲解+安装+部署+调试)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统背景 在数字音乐产业迅猛发展的当下&#xff0c;Spotify、QQ 音乐、网易云音乐等音乐平台的曲…

【MySQL】项目实践

个人主页&#xff1a;Guiat 归属专栏&#xff1a;MySQL 文章目录 1. 项目实践概述1.1 项目实践的重要性1.2 项目中MySQL的典型应用场景 2. 数据库设计流程2.1 需求分析与规划2.2 设计过程示例2.3 数据库设计工具 3. 电子商务平台实践案例3.1 系统架构3.2 数据库Schema设计3.3 数…

回调函数应用示例

回调函数是一种通过函数指针&#xff08;或引用&#xff09;调用的函数&#xff0c;它在特定事件或条件发生时被另一个函数调用。回调函数的核心思想是将函数作为参数传递&#xff0c;以便在适当的时候执行自定义逻辑&#xff0c;常用于异步编程、事件驱动架构等场景。 业务场景…

upload-labs通关笔记-第4关 文件上传之.htacess绕过

目录 一、.htacess 二、代码审计 三、php ts版本安装 1、下载ts版本php 2、放入到phpstudy指定文件夹中 3、修改php配置文件 4、修改php.ini文件 5、修改httpd.conf文件 &#xff08;1&#xff09;定位文件 &#xff08;2&#xff09;修改文件 6、重启小皮 7、切换…

DeepSearch代表工作

介绍下今年以来深度搜索相关的一些论文~ 文章目录 Search-o1简述方法实验Search-R1简介方法带搜索引擎的强化学习多轮搜索调用的生成训练模板奖励建模实验R1-Searcher简介方法数据选择两阶段的强化学习训练算法ReSearch: Learning to Reason with Search for LLMs via Reinforc…

记录一次服务器卡顿

一、服务器卡顿现象 服务用了一段时间后&#xff0c;突然很卡&#xff0c;发现在服务器上新建excel也很卡&#xff0c;发现服务器中病毒了&#xff0c;然后重新安装了操作系统。重新安装服务环境时&#xff0c;发现同时安装pdf、tomcat时都很慢&#xff0c;只能一个安装好了&am…

leetcode2749. 得到整数零需要执行的最少操作数-medium

1 题目&#xff1a;得到整数零需要执行的最少操作数 官方标定难度&#xff1a;中 给你两个整数&#xff1a;num1 和 num2 。 在一步操作中&#xff0c;你需要从范围 [0, 60] 中选出一个整数 i &#xff0c;并从 num1 减去 2i num2 。 请你计算&#xff0c;要想使 num1 等于…