当前位置: 首页 > news >正文

详细介绍:Spring MVC 请求执行流程详解

1. 核心组件简介

在深入了解流程之前,第一需要认识流程中涉及的核心组件:

  • DispatcherServlet前端控制器(Front Controller),是整个流程的核心和入口。它接收所有请求,并负责协调各个组件共同完成请求处理,但其自身不处理业务逻辑。
  • HandlerMapping处理器映射器,根据请求的 URL、手段等信息,找到能够处理该请求的处理器(Handler)拦截器(Interceptors)
  • HandlerAdapter处理器适配器,负责以统一的接口方式去实际执行找到的处理器(如 @Controller 中的方法)。因为处理器有多种形式(如基于注解的控制器、实现 Controller 接口的控制器等),适配器模式使得 DispatcherServlet 无需关心处理器的具体实现。
  • HandlerInterceptor处理器拦截器,给出了在处理器执行前、后以及请求搞定后的拦截钩子,用于实现横切关注点(如日志、权限验证等)。
  • Handler处理器,通常是我们编写的带有 @Controller@RestController 注解的类中的方法,是实际执行业务逻辑的地方。
  • ViewResolver视图解析器,根据控制器返回的逻辑视图名(如 "home"),解析出具体的 View 对象(如 JSP, Thymeleaf 模板等)。
  • View视图,负责将模型数据渲染成最终的响应内容(如 HTML 页面)。
  • HandlerExceptionResolver异常解析器,负责处理请求处理过程中抛出的异常,将其转换为统一的错误响应(如错误页面、JSON 错误信息)。
  • MultipartResolver: ** multipart 解析器**,用于解析文件上传等 multipart 类型的请求。

2. 请求执行流程详述

一个典型的 HTTP 请求在 Spring MVC 中的处理遵循一条清晰的“请求-响应”管道。其完整流程如下图所示:
在这里插入图片描述

阶段一:请求接收与分发

  1. 用户发起请求: 用户通过浏览器访问一个 URL(例如 http://example.com/app/products)。
  2. 请求到达 DispatcherServlet
    • HTTP 请求首先被 Web 容器(如 Tomcat)捕获。
    • 根据 web.xmlServletRegistrationBean 中的配置,匹配到请求路径的 DispatcherServlet 开始处理该请求。
    • DispatcherServlet 是唯一的入口,它代表“前端控制器”设计模式。

阶段二:寻找处理器

  1. 查询处理器映射(HandlerMapping
    • DispatcherServlet 会查询所有配置的 HandlerMapping bean(如 RequestMappingHandlerMapping),询问哪一个 Handler(控制器方法)能处理当前请求。
    • HandlerMapping 根据请求的 URL、HTTP 方法(GET、POST等)、请求头等信息进行匹配。
    • 如果找到匹配的处理器,HandlerMapping 会返回一个 HandlerExecutionChain 对象。该对象不仅包含了目标处理器(Handler),还包含了适用于该请求的所有 HandlerInterceptor(拦截器)。

阶段三:执行预处理拦截器

  1. 执行拦截器的 preHandle 方法
    • DispatcherServlet 按顺序执行 HandlerExecutionChain 中所有拦截器的 preHandle() 方法。
    • 拦截器通常用于执行权限检查、日志记录、本地化设置等预处理逻辑。
    • 重要: 如果任何一个拦截器的 preHandle 方法返回 false,则流程中断,直接返回,不会执行后续的处理器和拦截器。

阶段四:执行处理器(业务逻辑)

  1. 获取并调用处理器适配器(HandlerAdapter
    • DispatcherServlet 遍历所有配置的 HandlerAdapter,找到第一个支持该类型处理器的适配器(如 RequestMappingHandlerAdapter 用于支持 @RequestMapping 注解的方法)。
  2. 实际执行处理器
    • 适配器调用处理器的具体方法(即我们编写的 @Controller 中的方法),并传入相应的参数(如 @RequestParam, @PathVariable, @RequestBody 等注解修饰的参数)。参数解析由一系列的 HandlerMethodArgumentResolver 完成。
    • 处理器执行业务逻辑(如调用 Service 层),并返回一个结果。这个结果通常被包装成一个ModelAndView 对象(包含模型数据和视图名),或者只是一个视图名,或者是一个被 @ResponseBody 注解的对象。

阶段五:执行后处理拦截器

  1. 执行拦截器的 postHandle 方法
    • 处理器执行完毕后,DispatcherServlet逆序执行所有拦截器的 postHandle() 方法。
    • 此时可以对 ModelAndView 进行进一步的修改(如添加公共模型数据),但在前后端分离架构中(返回 JSON),此方法可能用处不大。

阶段六:处理结果与渲染视图

  1. 处理返回结果

  2. 渲染视图(如果需要)

阶段七:请求结束回调

  1. 执行拦截器的 afterCompletion 方法
    • 无论请求处理成功与否,在返回响应给客户端之前DispatcherServlet 会按逆序执行所有拦截器的 afterCompletion() 方法。
    • 此手段非常适合进行资源清理、记录请求完毕日志等操作。注意:即使前面的 preHandle 或处理器执行过程中抛出异常,此方法也会被调用(但仅限那些 preHandle 成功执行并返回 true 的拦截器)。

阶段八:返回响应

  1. 返回响应: 最终生成的响应(可能是 HTML 页面,也可能是 JSON 数据)通过 DispatcherServlet 返回给 Web 容器,并由容器最终发送回客户端。

4. 异常处理机制

异常处理贯穿于上述流程的多个环节:

  • 处理器执行期间: 如果在任何阶段(特别是处理器执行时)抛出异常,DispatcherServlet 会捕获它。
  • 委托给 HandlerExceptionResolverDispatcherServlet 会遍历所有配置的 HandlerExceptionResolver(如 @ExceptionHandler, ExceptionHandlerExceptionResolver),让它们来处理异常。
  • 解析异常: 异常解析器可能会将异常转换为一个错误响应(如设置特定的 HTTP 状态码,返回一个错误视图 ModelAndView("error"),或者直接写入一个 JSON 错误信息)。
  • 跳过后续步骤: 一旦发生异常,正常的流程(如 postHandle)会被跳过,但 afterCompletion 仍然会执行。

5. 总结与要点

http://www.gsyq.cn/news/13824.html

相关文章:

  • Aduro电涌保护器特惠:6口插座与2USB端口52%折扣
  • centos 网卡IPv6配置
  • IPD和PLM谁先谁后
  • PySimpleGUI中常见功能元素和函数缩写形式示例
  • 实用指南:interface g0/0/0.1 概念及题目
  • 万字长文:企业可观察性平台的建设方案实践
  • 离最新版本只有一步之遥了!重新启动 Chrome 即可完成更新
  • 2025 昆明哪家旅行社好?久游国际赏龙门滇池风光
  • 2025云南游选哪家?昆明久游商务车舒适超赞
  • CF Round 942(#1967) 总结
  • 2025 热压机厂家权威推荐排行榜:深度解析 TOP3 优质厂家核心竞争力,最新选购指南发布
  • 2025 最新权威推荐!国内车床生产厂家 TOP 排行榜发布,聚焦数控 / 卧式 / 斜床身 / 重型等多类型设备优选这几家
  • 2025云南哪家旅行社好?昆明久游精品小团超舒适
  • 详细介绍:42.传输层协议TCP(上)
  • 仿muduo库One Thread One Loop主从Reactor模型实践——介绍 - 实践
  • Lucene 8.7.0 版本中dvd、dvm文件详解 - 教程
  • 详解 PHP 中的命名空间 Namespace 与 PSR4 自动加载
  • 摩尔线程88天过会,过会当天提交注册:看懂这3个关键,才算懂国产GPU的“生存逻辑”
  • 上海住宅新规调整,背后的野心可大了
  • 魔兽争霸3冰封王座安装包下载
  • AI两周手搓一个进度管理神器,快来安排你的国庆假期吧
  • 读人形机器人26人类情感
  • 岐金兰AI元人文构想的全面系统研究——声明ai研究
  • 2025登车桥生产厂家最新推荐榜单:聚焦月台登车桥、装卸登车桥、卸货平台登车桥、10吨登车桥产品,精选五家实力企业助力采购
  • 【SimpleFOC】区分BLDC霍尔安装间隔60还是120
  • [GenAI] 提示词工程
  • 【Nordic随笔】
  • 数据类型-字典
  • 步进电机T型加减速
  • 苍穹外卖-day03(公共字段自动填充,新增菜品,菜品分页查询,删除菜品,修改菜品) - a