SpringMVC 的执行流程是 Web 框架篇最核心的问题。它不是让你机械背 11 个步骤,而是要理解一次请求从浏览器进来后,SpringMVC 是怎么找到 Controller、调用方法、处理参数、处理返回值的。
一句话概括:请求先进入 DispatcherServlet,再通过 HandlerMapping 找到处理器,通过 HandlerAdapter 调用 Controller,最后根据返回类型走视图渲染或 JSON 响应。

ModelAndView
ResponseBody
浏览器发送请求
DispatcherServlet
前端控制器
HandlerMapping
查找处理器
返回
HandlerExecutionChain
HandlerAdapter
调用 Controller
Controller
执行业务方法
返回类型
ViewResolver
解析视图
渲染 JSP 页面
HttpMessageConverter
转 JSON
响应前端
核心组件先记住
| 组件 | 作用 |
|---|---|
DispatcherServlet |
前端控制器,统一接收请求和分发请求 |
HandlerMapping |
处理器映射器,根据请求路径找到具体 Handler |
HandlerExecutionChain |
处理器执行链,包含 Handler 和拦截器 |
HandlerAdapter |
处理器适配器,负责真正调用 Controller 方法 |
ViewResolver |
视图解析器,把逻辑视图名解析成真正视图 |
HttpMessageConverter |
消息转换器,把 Java 对象转换成 JSON 等响应体 |
如果是传统 JSP 项目,会走视图解析和渲染;如果是前后端分离接口项目,通常通过 @ResponseBody 或 @RestController 直接返回 JSON。
传统 JSP 视图流程
传统视图阶段的完整流程可以这样理解:
- 用户发送请求,请求进入
DispatcherServlet。 DispatcherServlet调用HandlerMapping。HandlerMapping根据 URL 找到对应的 Handler,并返回HandlerExecutionChain。DispatcherServlet调用HandlerAdapter。HandlerAdapter负责参数处理,然后调用 Controller 方法。- Controller 执行业务逻辑,返回
ModelAndView。 HandlerAdapter把ModelAndView返回给DispatcherServlet。DispatcherServlet把逻辑视图名交给ViewResolver。ViewResolver返回真正的View对象。DispatcherServlet渲染视图,把模型数据填充到页面。- 响应用户。
这里的重点是 ModelAndView。它既包含模型数据,也包含视图信息。
前后端分离接口流程
现在更多项目是前后端分离,Controller 返回对象,由框架转成 JSON。

HTTP 请求
DispatcherServlet
定位
Controller 方法
解析 PathVariable
RequestBody 等参数
执行接口方法
返回 Java 对象
HttpMessageConverter
序列化
JSON 写入响应体
流程相比 JSP 会短一些:
- 请求进入
DispatcherServlet。 HandlerMapping找到对应 Controller 方法。HandlerAdapter调用 Controller 方法。- 方法上有
@ResponseBody,或者类上有@RestController。 - SpringMVC 使用
HttpMessageConverter把返回对象转换成 JSON。 - 直接写入响应体返回给前端。
示例:
java
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/getById/{id}")
public User getById(@PathVariable Integer id) {
return userService.getById(id);
}
}
@RestController 等价于 @Controller + @ResponseBody,所以方法返回的 User 不会被当成视图名,而是会被转换成 JSON。
HandlerAdapter 为什么需要适配
Controller 方法的写法很多:
java
@GetMapping("/user/{id}")
public User getById(@PathVariable Integer id) {
return userService.getById(id);
}
java
@PostMapping("/user")
public User save(@RequestBody User user) {
return userService.save(user);
}
SpringMVC 要处理路径参数、请求参数、请求体、请求头、返回对象等各种形式。HandlerAdapter 的价值就是屏蔽这些差异,用统一方式调用处理器。
参数解析和返回值处理,大多发生在 HandlerAdapter 调用 Controller 的过程中。
常见注解顺手记
| 注解 | 作用 |
|---|---|
@RequestMapping |
映射请求路径,可用在类和方法上 |
@GetMapping / @PostMapping |
更具体的请求方式映射 |
@RequestBody |
接收请求体 JSON,并转换成 Java 对象 |
@RequestParam |
获取请求参数 |
@PathVariable |
获取路径变量,例如 /user/{id} |
@ResponseBody |
把返回对象写入响应体 |
@RequestHeader |
获取请求头 |
@RestController |
@Controller + @ResponseBody |
面试回答模板
可以这样回答:
SpringMVC 请求首先进入前端控制器
DispatcherServlet,它会调用HandlerMapping根据请求路径查找具体处理器,返回处理器执行链。然后DispatcherServlet调用HandlerAdapter,由适配器完成参数解析并执行 Controller 方法。如果是传统 JSP,Controller 返回ModelAndView,再通过ViewResolver解析视图并渲染。如果是前后端分离接口,方法上有@ResponseBody或使用@RestController,返回值会通过HttpMessageConverter转成 JSON 响应给前端。
小结
SpringMVC 执行流程可以压缩成一条主线:
DispatcherServlet 接收请求 -> HandlerMapping 找方法 -> HandlerAdapter 调方法 -> ViewResolver 渲染页面或 HttpMessageConverter 返回 JSON。
面试时先讲主线,再区分 JSP 和前后端分离两种返回路径,就不会乱。