SpringMVC 执行流程详解

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 视图流程

传统视图阶段的完整流程可以这样理解:

  1. 用户发送请求,请求进入 DispatcherServlet
  2. DispatcherServlet 调用 HandlerMapping
  3. HandlerMapping 根据 URL 找到对应的 Handler,并返回 HandlerExecutionChain
  4. DispatcherServlet 调用 HandlerAdapter
  5. HandlerAdapter 负责参数处理,然后调用 Controller 方法。
  6. Controller 执行业务逻辑,返回 ModelAndView
  7. HandlerAdapterModelAndView 返回给 DispatcherServlet
  8. DispatcherServlet 把逻辑视图名交给 ViewResolver
  9. ViewResolver 返回真正的 View 对象。
  10. DispatcherServlet 渲染视图,把模型数据填充到页面。
  11. 响应用户。

这里的重点是 ModelAndView。它既包含模型数据,也包含视图信息。

前后端分离接口流程

现在更多项目是前后端分离,Controller 返回对象,由框架转成 JSON。


HTTP 请求
DispatcherServlet
定位

Controller 方法
解析 PathVariable

RequestBody 等参数
执行接口方法
返回 Java 对象
HttpMessageConverter

序列化
JSON 写入响应体

流程相比 JSP 会短一些:

  1. 请求进入 DispatcherServlet
  2. HandlerMapping 找到对应 Controller 方法。
  3. HandlerAdapter 调用 Controller 方法。
  4. 方法上有 @ResponseBody,或者类上有 @RestController
  5. SpringMVC 使用 HttpMessageConverter 把返回对象转换成 JSON。
  6. 直接写入响应体返回给前端。

示例:

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 和前后端分离两种返回路径,就不会乱。

相关推荐
晨曦中的暮雨5 小时前
4.16滴滴 AIOT 一面|面经
java·算法
Dicky-_-zhang8 小时前
系统容量规划与压测实战:从1万到100万QPS的科学扩容
java·jvm
Dicky-_-zhang13 小时前
消息队列Kafka/RocketMQ选型与高可用架构:从单体到100万TPS的演进
java·jvm
晨曦中的暮雨13 小时前
4.15腾讯 CSIG云服务产线 一面
java·开发语言
fake_ss19813 小时前
AI时代学习全栈项目开发的新范式
java·人工智能·学习·架构·个人开发·学习方法
茉莉玫瑰花茶13 小时前
工作流的常见模式 [ 1 ]
java·服务器·前端
未若君雅裁14 小时前
Spring AOP、日志切面与声明式事务原理
java·后端·spring
No8g攻城狮14 小时前
【人大金仓】wsl2+ubuntu22.04安装人大金仓数据库V9
java·数据库·spring boot·非关系型数据库
xiaoerbuyu123314 小时前
开源Java 邮箱 基于SpringBoot+Vue前后端分离的电子邮件
java·开发语言