SpringMVC的处理流程

一张图搞懂 SpringMVC 完整请求流程:从浏览器到页面响应的全链路拆解

作为 Java 后端开发者,SpringMVC 的请求处理流程是日常开发的核心逻辑,但很多时候我们只知其然不知其所以然。今天,我就通过这张经典的 SpringMVC 处理流程图,带大家一步步拆解从用户发起请求到页面响应的完整过程,让你彻底搞懂每个组件的分工与协作。


🚀 第一步:用户发起请求(对应图中步骤 1)

当你在浏览器输入 URL、点击按钮或提交表单时,HTTP 请求(GET/POST 等)会被 SpringMVC 的前端控制器 DispatcherServlet 拦截。DispatcherServlet 是整个 SpringMVC 流程的 "入口",所有请求都先汇聚到这里,由它统一调度后续组件。

🗺️ 第二步:查找处理器(对应图中步骤 2-3)

  1. DispatcherServlet 收到请求后,会调用 HandlerMapping(处理器映射器)。
  2. HandlerMapping 会根据请求的 URL、请求方式、请求参数等信息,在 Spring 容器中查找对应的 Handler(也就是我们写的@Controller类中的请求处理方法)。
  3. 找到匹配的 Handler 后,HandlerMapping 会把 Handler 的信息(如 Controller 方法、拦截器等)返回给 DispatcherServlet。

⚙️ 第三步:执行处理器(对应图中步骤 4-6)

  1. DispatcherServlet 拿到 Handler 后,并不会直接执行它 ------ 因为不同的 Handler 可能有不同的实现方式(比如注解式、接口式),这时候需要 HandlerAdapter(处理器适配器) 来做统一适配。
  2. HandlerAdapter 会调用目标 Handler(即 Controller 的业务方法),执行具体的业务逻辑:比如接收请求参数、调用 Service 层处理业务、封装响应数据等。
  3. 业务方法执行完成后,会返回一个 ModelAndView 对象 (包含数据模型 Model 和视图名称 ViewName),并通过 HandlerAdapter 传递回 DispatcherServlet。

🔍 第四步:解析视图(对应图中步骤 7-9)

  1. DispatcherServlet 收到 ModelAndView 后,会调用 ViewResolver(视图解析器)。
  2. ViewResolver 会根据 ModelAndView 中的视图名称,解析成具体的 View 对象(比如 JSP 视图、Thymeleaf 视图、JSON 视图等)。举个例子:如果视图名称是"user/list",视图解析器可能会拼接前缀/WEB-INF/views/和后缀.jsp,最终定位到/WEB-INF/views/user/list.jsp。
  3. 解析完成后,ViewResolver 会把 View 对象返回给 DispatcherServlet。

🎨 第五步:渲染视图 & 响应用户(对应图中步骤 10-11)

  1. DispatcherServlet 调用 View 对象的渲染方法,把 Model 中的数据填充到视图模板中(比如 JSP 页面通过 EL 表达式${user.name}获取数据),生成最终的 HTML(或 JSON、XML 等)响应内容。
  2. 渲染完成后,DispatcherServlet 会把响应内容通过 HTTP 返回给浏览器,用户最终看到渲染后的页面或数据。

🧩 核心组件角色总结

为了让你更清晰地记住每个组件的作用,这里做个极简总结:

组件 作用
DispatcherServlet 前端控制器,整个流程的 "调度中心",协调所有组件工作
HandlerMapping 处理器映射器,根据请求找对应的 Controller 方法
HandlerAdapter 处理器适配器,统一适配并执行不同类型的 Handler
Handler(Controller) 业务处理器,实际处理请求的业务逻辑,返回 ModelAndView
ViewResolver 视图解析器,把视图名称解析成具体的 View 对象(如 JSP、Thymeleaf 视图)
View 视图,负责渲染数据生成最终响应(如 HTML 页面、JSON 数据)

💡 实战小 Tips

理解这个流程后,排查问题时可以精准定位:

  • 如果请求返回 404:优先检查HandlerMapping是否配置正确(比如@RequestMapping路径是否匹配)。
  • 如果页面没有渲染数据:检查ModelAndView是否正确传递了Model数据,或视图模板是否正确取值。
  • 如果视图解析失败:检查ViewResolver的前缀、后缀配置是否和实际视图文件路径匹配。

日常开发中,我们还可以通过扩展这些组件(比如自定义HandlerInterceptor拦截请求、自定义ViewResolver支持多视图类型),实现更灵活的功能。

相关推荐
captain3762 分钟前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你021423 分钟前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
步行cgn1 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
lgcgkCQ2 小时前
【AI 转型实战 1】SpringAI 入门:搭建基础大模型对话能力
java·ai·agent·rag·spring ai·mcp·langchain4j
Wang's Blog2 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友
学到老活到老2 小时前
第 24 集:配置文件写了 80,Spring Boot 为什么读到 90?
java·后端·spring
tongyiixiaohuang2 小时前
供应商主数据同步实战:从易快报到金蝶云星空的单一策略落地
java·网络·数据库
鱼宵3 小时前
取集合第一个元素,Java 为什么要写三种写法?
java·windows·python·java21
学长毕设3 小时前
基于SpringBoot的餐厅管理系统-附源码
java·spring boot·后端
刚入门的大一新生3 小时前
Linux-线程互斥
java·开发语言