本文系统梳理了Spring MVC的核心概念与执行流程。Spring MVC是基于Servlet规范的Web框架,其核心是DispatcherServlet,它作为统一入口协调HandlerMapping、HandlerAdapter等组件完成请求处理。文章详细解释了从请求接收到响应的完整流转过程,并区分了传统页面渲染与前后端分离两种场景下的不同处理机制。
我一直感觉SpringMVC的执行过程有些抽象,有些概念有点绕,于是我想着先把很多概念了解清楚,最后再把流程给捋清楚,尝试之后对我的理解还是很有效的,这篇文章经过我的整理输出后由AI润色和修正了格式等内容
1. 什么是 Spring MVC
Spring MVC 是 Spring 体系中的 Web MVC 框架,用来帮助我们基于 Servlet 快速开发 Web 应用。
这里的 MVC 指的是:
Model:模型数据,或者说业务数据View:视图,负责展示页面Controller:控制器,负责接收请求、组织调用、返回结果
它的核心思想是把请求接入、参数处理、业务调用、结果响应这些职责拆开,让代码结构更清晰。
需要注意一点:Controller 负责的是请求入口和流程协调,真正的业务逻辑通常应该放在 Service 层,而不是全部堆在 Controller 里。
2. 什么是 Servlet
Servlet 本质上是 Java Web 的一套规范,用来定义服务器如何接收 HTTP 请求、如何处理请求、如何返回 HTTP 响应。
像 Tomcat、Jetty 这样的 Web 容器会实现这套规范,并负责:
- 加载 Servlet
- 管理 Servlet 生命周期
- 在请求到来时调用对应的 Servlet
可以把它理解成:Servlet 提供了 Java Web 最基础的请求处理能力,而 Spring MVC 是构建在这套能力之上的更高层封装。
3. Spring MVC 和 Servlet 是什么关系
Spring MVC 是建立在 Servlet 规范之上的。
它的核心入口是 DispatcherServlet。DispatcherServlet 本身就是一个 Servlet,所以它可以像普通 Servlet 一样被 Web 容器加载和调用。
也就是说:
- Web 容器负责把请求交给
DispatcherServlet DispatcherServlet负责在 Spring MVC 内部完成后续流程
后续这些流程包括:
- 路由分发
- 查找处理器
- 参数绑定
- 调用控制器方法
- 处理返回值
- 视图解析或响应体输出
4. Spring MVC 的几个核心组件
4.1 DispatcherServlet 是什么
DispatcherServlet 是 Spring MVC 的核心调度器,也是整个请求处理流程的统一入口。
浏览器发来的请求,通常会先到它这里,再由它决定后续交给谁处理。
它的职责可以概括为:
- 接收请求
- 分发请求
- 协调各个组件一起工作
- 最终生成响应
4.2 HandlerMapping 是什么
HandlerMapping 可以理解成“请求路径到处理器的映射表”。
当请求到来时,它会根据请求信息去找到对应的处理器。匹配条件通常包括:
- URL
- HTTP 请求方法
- 其他请求条件
在注解驱动开发里,Spring 启动时会解析诸如 @RequestMapping、@GetMapping、@PostMapping 这类映射信息,并建立对应关系。
4.3 Controller 和处理器是什么关系
在日常开发里,我们会写很多 @Controller 或 @RestController 类。
对于注解驱动的 Spring MVC 来说,真正执行请求处理逻辑的,通常是 Controller 中某一个具体的方法。这个方法通常就可以理解为当前请求对应的处理器。
也就是说:
Controller是处理请求的载体- 具体的处理器,通常是其中某个带映射注解的方法
所以 HandlerMapping 最终定位到的,通常不是整个类,而是类中的某个方法。
4.4 HandlerAdapter 是什么
HandlerAdapter 可以理解成“处理器执行适配器”。
DispatcherServlet 找到处理器之后,并不是自己直接用反射去调用,而是交给合适的 HandlerAdapter 来执行。
它主要负责:
- 参数解析与绑定
- 类型转换
- 调用目标方法
- 处理方法返回值
在基于注解的 Spring MVC 中,最常见的是 RequestMappingHandlerAdapter。
4.5 ViewResolver 是什么
ViewResolver 是视图解析器。
当控制器返回的是一个“视图名”时,Spring MVC 会通过 ViewResolver 把这个名字解析成真正的视图对象,比如 JSP 或 Thymeleaf 模板。
4.6 HttpMessageConverter 是什么
HttpMessageConverter 是消息转换器。
当前后端分离接口返回的是对象、JSON、XML 等响应体数据时,Spring MVC 会通过它把 Java 对象转换成 HTTP 响应内容。
最常见的场景就是把 Java 对象转换为 JSON。
5. Controller 执行完之后,会返回什么
这部分要分成两种场景来看。
5.1 传统服务端页面渲染
如果是传统 Web 项目,控制器方法通常可能返回:
- 视图名,比如
"userList" ModelAndView
这时 Spring MVC 的处理思路是:
- 控制器方法执行完成
- 得到视图相关结果
- 交给
ViewResolver解析视图 - 由视图技术渲染页面
- 最终把 HTML 返回给浏览器
5.2 前后端分离接口返回
如果是前后端分离项目,控制器方法通常返回:
- 一个普通对象
ResponseEntity- 标注了
@ResponseBody的返回结果
如果类上使用了 @RestController,本质上也等价于默认带有 @ResponseBody 语义。
这时流程就不是“返回视图”,而是“直接返回数据”。
更准确地说,这类返回值会由 Spring MVC 的返回值处理机制配合 HttpMessageConverter 写入响应体,而不是再走视图解析。
所以这里不要简单理解成“HandlerAdapter 返回了 null”,更准确的理解应该是:
- 控制器方法返回的是数据
- Spring MVC 把这些数据写进 HTTP 响应体
DispatcherServlet不再进行视图渲染
6. 一次请求在 Spring MVC 中是怎么流转的
把前面的内容串起来,一次典型请求大致会经过下面这些步骤。
- 浏览器发起 HTTP 请求。
- Web 容器接收到请求后,把请求交给
DispatcherServlet。 DispatcherServlet调用HandlerMapping查找当前请求对应的处理器。- 找到处理器后,
DispatcherServlet再交给合适的HandlerAdapter去执行。 HandlerAdapter完成参数绑定、类型转换,然后调用目标控制器方法。- 控制器方法执行业务流程,并返回结果。
- 如果返回的是视图名或
ModelAndView,则进入视图解析和页面渲染流程。 - 如果返回的是对象或
ResponseEntity,则通过HttpMessageConverter直接写入响应体。 - 最终响应返回给客户端。
为了先把主线讲清楚,这里暂时没有展开拦截器、异常处理器、文件上传解析器这些扩展机制,但它们本质上也都是围绕这条主流程工作的。
7. 几个容易混淆的点
7.1 Controller 不等于业务逻辑
Controller 的主要职责是接收请求、做参数承接、组织调用和返回结果。
真正的业务逻辑通常应该放在 Service 层。这样分层才清晰,也更容易维护。
7.2 DispatcherServlet 不是“一个类包办一切”
虽然 DispatcherServlet 是统一入口,但它并不是自己完成所有工作。
它更像一个总调度器,会把不同阶段的工作分别交给:
HandlerMappingHandlerAdapterViewResolverHttpMessageConverter
7.3 前后端分离场景下,通常不会再走视图解析
如果控制器返回的是 JSON 数据,那么重点就不再是 ViewResolver,而是返回值处理机制和 HttpMessageConverter。
也就是说,前后端分离项目和传统服务端页面渲染项目,后半段流程是不一样的。