Spring MVC 请求处理流程

Spring MVC 处理流程主要分为 前端请求、DispatcherServlet 处理、Handler 解析、执行控制器、视图解析 等多个步骤。具体流程如下:


Spring MVC 请求处理流程

1. 用户请求

用户通过浏览器或客户端发送 HTTP 请求(GET/POST/PUT/DELETE),请求 URL 形如:

bash 复制代码
http://localhost:8080/user/list

其中:

  • http://localhost:8080 是服务器地址
  • /user/list 是请求的路径

2. 进入 DispatcherServlet

Spring MVC 的 核心控制器 DispatcherServlet 是前端控制器(Front Controller),它是所有请求的统一入口,并负责调度后续处理流程。

DispatcherServlet 的初始化

  • 继承 HttpServlet,会在服务器启动时初始化

  • 通过 web.xmlSpring Boot 自动配置 进行注册:

    xml 复制代码
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
  • 监听所有 *.do/ 结尾的请求


3. 查找 HandlerMapping

DispatcherServlet 根据请求 URL 解析出对应的控制器(Controller) ,它会查询 HandlerMapping

  • Spring Boot 默认提供的 HandlerMapping

    • RequestMappingHandlerMapping(基于 @RequestMapping 的映射)
    • SimpleUrlHandlerMapping(基于 XML 配置的映射)
  • 查找逻辑

    1. 获取 HandlerMapping 列表
    2. 按优先级遍历 HandlerMapping
    3. 匹配 URL,找到对应的 HandlerMethod

例如:

less 复制代码
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/list")
    public String getUserList() {
        return "userList";
    }
}

请求 /user/list 时,HandlerMapping 会匹配 UserController.getUserList() 方法。


4. 解析 HandlerAdapter

找到 HandlerMethod 后,DispatcherServlet 需要借助 HandlerAdapter 来执行该方法。

  • Spring Boot 默认提供的 HandlerAdapter

    • RequestMappingHandlerAdapter(基于 @RequestMapping 的适配器)
    • SimpleControllerHandlerAdapter(适用于 Controller 接口实现类)

执行流程:

  1. 参数解析 :解析 @RequestParam@RequestBody@PathVariable
  2. 调用 Controller 方法
  3. 返回结果

5. 处理返回值

控制器方法返回的对象可以是:

  • 视图名称 (String)
  • 数据对象 (JSONModelAndView)
  • HTTP 响应 (ResponseEntity)

例如:

less 复制代码
@RequestMapping("/list")
@ResponseBody
public List<User> getUserList() {
    return userService.findAll();
}

Spring MVC 通过 HttpMessageConverterList<User> 序列化为 JSON 响应。


6. 视图解析

如果返回的是 视图名称(String) ,Spring MVC 需要解析并渲染页面:

  1. DispatcherServlet 调用 ViewResolver 解析视图
  2. 找到对应的 JSP、Thymeleaf、Freemarker 页面
  3. 渲染视图并返回 HTML 响应

例如:

typescript 复制代码
@RequestMapping("/list")
public String getUserList(Model model) {
    model.addAttribute("users", userService.findAll());
    return "userList";  // 视图名称
}
  • 视图解析器(ViewResolver) 会解析 "userList"/WEB-INF/views/userList.jsp
  • 渲染页面并返回 HTML 给用户

7. 返回响应

最终,Spring MVC 将结果返回给客户端:

  • 如果是 JSON,则 HttpMessageConverter 处理 @ResponseBody
  • 如果是 HTML,则 ViewResolver 解析 JSP/Thymeleaf 视图

Spring MVC 处理流程时序图

rust 复制代码
[用户请求]  -->  DispatcherServlet  -->  HandlerMapping  -->  找到 Controller
               ⬇                   ⬇
          HandlerAdapter        调用 Controller 方法
               ⬇                   ⬇
        解析返回值 (JSON/视图)  -->  ViewResolver (解析视图)
               ⬇                   ⬇
          渲染视图 (HTML)  -->  返回 HTTP 响应

总结

Spring MVC 的完整处理流程:

  1. 请求进入 DispatcherServlet
  2. 查找 HandlerMapping 获取 Controller
  3. 解析 HandlerAdapter 并执行 Controller 方法
  4. 处理 Controller 返回值
  5. 视图解析(如果是 HTML)
  6. 渲染并返回响应

你可以尝试自己实现 DispatcherServletHandlerMapping,加深理解!🚀

相关推荐
小灰灰搞电子17 分钟前
Rust Attribute(属性标记)完整整理
开发语言·后端·rust
tedcloud12335 分钟前
God‘s Eye View 怎么搭建?在云服务器上部署一个实时 3D 地球可视化平台
linux·服务器·开发语言·后端·rust
深入云栈40 分钟前
Netty 4.2.x 源码深度解析 (十三):Epoll 传输 —— Linux 高性能 IO 的 Netty 实现
java·后端
Lyra_Infra1 小时前
从一段错误 JSON 说起:Policy、Role 与 IAM
后端·json·aigc
Charlie_Byte1 小时前
在用户目录安装多版本 JDK,并用环境变量切换
后端
黑马程序员毕设2 小时前
基于微信小程序的节目活动报名与管理系统设计与实现
java·开发语言·spring boot·后端·电脑
掘金者阿豪2 小时前
Windows 部署 Papra:建立私有文档库、标签管理,再配置固定公网访问
后端
Bs_MoneyMagnet2 小时前
基于springboot+vue的会议室预约管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
Bs_MoneyMagnet2 小时前
基于springboot+vue的茶铺管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
她说..2 小时前
RabbitMQ 使用场景详解
java·spring boot·后端·spring·rabbitmq·java-rabbitmq