当前位置: 首页 > backend >正文

Spring MVC 执行流程全解析:从请求到响应的七步走

Spring MVC 的工作流程,漏了这一个今天刚好面试提到了,没回答出来,记录一下。

🧭 Spring MVC 整体执行流程一览(从请求到响应)

✅ 1. 请求发出:浏览器发送 HTTP 请求

如用户访问:

http://localhost:8080/user/list

✅ 2. DispatcherServlet 接收请求(前端控制器)

  • 职责: Spring MVC 的入口点,负责整个请求的调度与分发。
  • web.xml 或 Spring Boot 的自动配置中,DispatcherServlet 会映射所有请求(如:/)。

✅ 3. HandlerMapping 查找处理器(Controller)

  • DispatcherServlet 通过 HandlerMapping 查找能处理当前 URL 的 Controller 及其方法。
  • 默认实现如:RequestMappingHandlerMapping

✅ 4. HandlerAdapter 调用目标方法

  • 查找到 Controller 方法后,由 HandlerAdapter 调用这个方法。
  • 常用的是 RequestMappingHandlerAdapter
  • 支持参数解析器、返回值处理器等扩展点。

✅ 5. Controller 处理请求

  • 具体业务逻辑执行,返回一个 ModelAndView 对象或其他响应体,其中包含模型数据和逻辑视图名。
    @Controller
    public class UserController {@GetMapping("/user/list")public String list(Model model) {model.addAttribute("users", userService.findAll());return "userList";  // 返回逻辑视图名}
    }
    

✅ 6. ViewResolver 视图解析器定位视图

  • 根据 Controller 返回的逻辑视图名(如 "userList"),由 ViewResolver 解析成实际视图路径(如:/WEB-INF/views/userList.jsp)。
  • Spring Boot 默认用的是 Thymeleaf 或 JSP。

✅ 7. 渲染视图 & 返回响应

  • 渲染视图并将结果写入 HTTP 响应,响应浏览器。

Spring MVC 虽然整体流程复杂,但是实际开发中很简单,大部分的组件不需要我们开发人员创建和管理,真正需要处理的只有 ControllerViewModel

在前后端分离的情况下,步骤 6、7会略有不同,后端通常只需要处理数据,并将 JSON 格式的数据返回给前端就可以了,而不是返回完整的视图页面。


说说 Handler ?为什么还需要 HandlerAdapter

Handler 一般就是指 Controller,Controller 是 Spring MVC 的核心组件,负责处理请求,返回响应。

Spring MVC 允许使用多种类型的处理器。不仅仅是标准的 @Controller 注解的类,还可以是实现了特定接口的其他类(如 HttpRequestHandler 或 SimpleControllerHandlerAdapter 等)。这些处理器可能有不同的方法签名和交互方式。

HandlerAdapter 的主要职责就是调用 Handler 的方法来处理请求,并且适配不同类型的处理器。HandlerAdapter 确保 DispatcherServlet 可以以统一的方式调用不同类型的处理器,无需关心具体的执行细节。

🔁 总流程图(Mermaid)

在这里插入图片描述


📚 场景举例:用户管理系统

步骤描述
用户访问 /user/list浏览器发出请求
DispatcherServlet 拦截前端控制器统一处理
HandlerMapping 匹配到 UserController.list()方法负责处理用户列表
返回逻辑视图 userList将用户数据加入 Model
ViewResolver 映射到 /WEB-INF/views/userList.jsp渲染用户列表页面
最终页面展示给用户请求-响应闭环完成

💡 面试延伸问题(必须掌握)

面试高频问题应答思路
DispatcherServlet 的职责是什么?核心调度器,协调请求流程
HandlerMapping 是如何工作的?根据 URL 匹配 Controller 方法
ViewResolver 支持哪些视图?JSP、Thymeleaf、FreeMarker 等
如何自定义参数解析器?实现 HandlerMethodArgumentResolver

🧠 源码阅读入口建议

模块源码入口类
DispatcherServletorg.springframework.web.servlet.DispatcherServlet
HandlerMappingRequestMappingHandlerMapping
HandlerAdapterRequestMappingHandlerAdapter
ViewResolverInternalResourceViewResolver

🧵 总结一句话:

Spring MVC 中,DispatcherServlet 是核心协调者,通过一系列策略接口(HandlerMapping、HandlerAdapter、ViewResolver 等)完成从请求分发到视图渲染的完整链路。

http://www.xdnf.cn/news/1012.html

相关文章:

  • 买卖股票的最佳时机(每日一题-简单)
  • SpringBoot中,声明式事务的使用
  • 文字、语音、图片、视频四个模态两两之间(共16种转换方向)的生成技术及理论基础的详细说明及表格总结
  • 【漫话机器学习系列】216.应对高方差(过拟合)的策略详解(Strategies When You Have High Variance)
  • 线上地图导航小程序源码介绍
  • uCOS3实时操作系统(任务切换和任务API函数)
  • MD5和sha1绕过方式总结
  • 第六章.java集合与泛型
  • 街景主观感知全流程(自建数据集+两两对比程序+Trueskill计算评分代码+训练模型+大规模预测)17
  • 冒泡排序详解
  • 使用若依二次开发商城系统-1
  • vue项目通过GetCapabilities获取wmts服务元数据信息并在openlayers进行叠加显示
  • 配置管理CM
  • 衡石chatbi如何通过 iframe 集成
  • 制作一款打飞机游戏14:资源优化
  • Nginx下搭建rtmp流媒体服务 并使用HLS或者OBS测试
  • 性能比拼: Nginx vs Caddy
  • NHANES指标推荐:PhenoAge
  • Ldap高效数据同步- Delta-Syncrepl复制模式配置实战手册(上)
  • 极验4滑块笔记:整理思路--填坑各种问题
  • 傲来云分享,负载均衡:提升网站性能与稳定性
  • 无人机飞控运行在stm32上的RTOS实时操作系统上,而不是linux这种非实时操作系统的必要性
  • 【前端】【面试】【业务场景】前端如何获取并生成设备唯一标识
  • 报错 | 配置 postcss 出现 报错:A `require()` style import is forbidden.
  • C++中的算术转换、其他隐式类型转换和显示转换详解
  • 开发指南:构建结合数字孪生、大语言模型与知识图谱的智能设备日志分析及生产异常预警系统
  • ByteTrack自定义数据集训练指南
  • 如何将SpringBoot前后端项目制作成windows运行的exe文件
  • 【python实用小脚本系列】用Python让鼠标“动起来”:光标自动移动、自动点击、自动图象识别的小技巧
  • 【教程】Digispark实现串口通信