SpringMVC的执行流程

SpringMVC 的请求处理流程是一个基于 DispatcherServlet(前端控制器)的完整闭环,从用户发送请求到最终响应的核心步骤如下:

  1. 用户发送请求用户通过浏览器或客户端向服务器发送 HTTP 请求(如 GET/POST 等),请求被 Web 服务器(如 Tomcat)接收。

  2. 请求到达前端控制器(DispatcherServlet) Web 服务器根据配置(如 web.xml 中的映射规则),将请求转发给 SpringMVC 的核心组件 DispatcherServlet,它是整个流程的入口,负责协调后续所有组件。

  3. 调用处理器映射器(HandlerMapping) DispatcherServlet 调用 HandlerMapping (处理器映射器),根据请求的 URL、请求方法等信息,查找对应的 Handler (处理器,通常是 Controller 中的方法)。常见的 HandlerMapping 实现有:RequestMappingHandlerMapping(基于 @RequestMapping 注解匹配)。

  4. 返回处理器执行链(HandlerExecutionChain) HandlerMapping 返回一个 HandlerExecutionChain 对象,包含两部分:

    • 匹配到的 Handler(具体的 Controller 方法);
    • 该 Handler 对应的拦截器(Interceptor)列表(若有)。
  5. 调用处理器适配器(HandlerAdapter) DispatcherServlet 根据 Handler 的类型,选择合适的 HandlerAdapter (处理器适配器),由适配器负责调用 Handler(解耦 DispatcherServlet 与 Handler 的直接交互)。常见的 HandlerAdapter 实现有:RequestMappingHandlerAdapter(适配基于注解的 Controller 方法)。

  6. 执行拦截器的 preHandle 方法 在调用 Handler 之前,执行 HandlerExecutionChain 中所有拦截器的 preHandle 方法:

    • 若所有拦截器的 preHandle 都返回 true,继续流程;
    • 若任一拦截器返回 false,流程终止,直接通过拦截器的 afterCompletion 方法结束。
  7. 调用 Handler(业务处理) HandlerAdapter 调用具体的 Handler(即 Controller 中的目标方法),执行核心业务逻辑,处理请求参数(如通过 @RequestParam、@RequestBody 等注解绑定参数),并返回一个 ModelAndView 对象(包含模型数据和视图名称)。

  8. 执行拦截器的 postHandle 方法 Handler 执行完成后,返回 ModelAndView 之前,执行所有拦截器的 postHandle 方法(可对 ModelAndView 进行修改)。

  9. 处理视图(ViewResolver 与 View) DispatcherServlet 调用 ViewResolver (视图解析器),根据 ModelAndView 中的视图名称,解析出具体的 View(视图对象,如 JSP、Thymeleaf 等)。

  10. 渲染视图View 对象结合 Model 中的数据(模型数据),进行视图渲染(将数据填充到视图模板中),生成最终的响应内容(如 HTML、JSON 等)。

  11. 执行拦截器的 afterCompletion 方法 视图渲染完成后,执行所有拦截器的 afterCompletion 方法(通常用于资源清理,如关闭流等)。

  12. 响应客户端DispatcherServlet 将渲染后的响应结果通过 Web 服务器返回给用户,完成整个请求 - 响应流程。

核心组件总结:

  • DispatcherServlet:前端控制器,协调所有流程;
  • HandlerMapping:映射请求到 Handler;
  • HandlerAdapter:适配并调用 Handler;
  • Handler:业务处理器(Controller 方法);
  • ViewResolver:解析视图名称为 View 对象;
  • Interceptor:拦截请求,增强处理流程。
相关推荐
Wang's Blog4 分钟前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户212968352616810 分钟前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm
helmsail22 分钟前
05 管理活动与选品
java
天远数科34 分钟前
Java数据工程:利用天远人车核验加强版优化智慧高速ETC发行合规体验
java·人工智能
.Bryce.35 分钟前
在智能体中使用A2A工具:让大模型自己决定“该找谁帮忙“
android·java·服务器·redis·后端·agent·a2a
xiaoqiMikko38 分钟前
fastjson 1.2.84 的补丁关掉了一个缓存:addAccept 包前缀白名单下,反序列化慢了 13~28 倍
java·后端·性能优化
XIAEE1 小时前
转生到儿童编程异世界:我用 Vue 和 Scratch 建了一座 DREAM 学院
java·spring
XIAEE1 小时前
初次使用 Node + Koa + MongoDB 搭建服务器:从零到第一个 API
java·spring
m0_587383001 小时前
无人自助拼豆系统核心功能开发与部署落地全流程实战指南
java·经验分享·后端·struts·架构
雷一言说1 小时前
Spring AI 2.0:RAG 文档分块大小策略选择
java·spring