Spring MVC 请求流程 - getHandler

阅读本文需要 5 分钟
tips:本文属于 Spring MVC 请求流程 - 基于源码解读 的小分支

DEBUG

  • 在org.springframework.web.servlet.DispatcherServlet#getHandler处打断点
    发现处理器映射器有两个:

    • BeanNameUrlHandlerMapping
    • RequestMappingHandlerMapping
      在这里插入图片描述
  • 进入 getHandler 方法,这个方法主要是先尝试获取 handler,然后再获取拦截器,返回执行链,这里我们把注意放在获取 handler 的方法上面,也就是 getHandlerInternal
    在这里插入图片描述

  • 进入 getHandlerInternal 方法,从当前请求解析出要查找的url,然后继续寻找 handler

    • 第一个处理器处理器映射器进入了 AbstractUrlHandlerMapping 的 getHandlerInternal,但结果为null
      在这里插入图片描述

    • 第二个处理器映射器进入了 AbstractHandlerMethodMapping 的 getHandlerInternal,找到了handler
      在这里插入图片描述
      对于为什么第二个处理器能获取到 handler ,可以看到 urlLookup 存储了要查找的 urlPath,两者能匹配
      在这里插入图片描述

### Spring MVC 框架源码详细分析及工作流程解析 #### 1. Spring MVC 架构概述 Spring MVC 是一种基于 Java 的 Web 开发框架,采用了经典的 Model-View-Controller (MVC) 设计模式。这种设计模式将应用程序分为三个主要部分:模型(Model),视图(View),和控制器(Controller)[^1]。 - **模型 (Model)** 负责管理应用的核心数据及其逻辑。 - **视图 (View)** 负责呈现用户界面并显示来自模型的数据。 - **控制器 (Controller)** 接收用户的输入并将这些输入转换成命令传递给模型或视图。 #### 2. 核心组件剖析 ##### 2.1 `DispatcherServlet` 类 作为整个 Spring MVC 请求处理的入口点,`DispatcherServlet` 承担着核心职责。它是 Servlet 容器中的一个标准 Servlet 实现,在接收到 HTTP 请求后会将其分派到相应的处理器上[^1]。 以下是 `DispatcherServlet` 的几个关键功能: - 解析 URL 并找到匹配的 Handler 映射; - 使用适配器机制调用具体的 Controller 方法; - 将响应结果渲染至客户端。 ```java public class DispatcherServlet extends FrameworkServlet { @Override protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest processedRequest = checkAndPrepare(request); // 获取 handler execution chain HandlerExecutionChain mappedHandler = getHandler(processedRequest); if (mappedHandler != null) { try { mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); } finally { triggerAfterCompletion(processedRequest, response, mappedHandler, webRequest, dispatchException); } } } } ``` ##### 2.2 多部件解析器 (`MultipartResolver`) 为了支持文件上传等功能,Spring MVC 提供了一个名为 `MultipartResolver` 的接口来解析 multipart 表单提交的内容。此解析器通常会在初始化阶段按 ID 注册到容器中以便后续使用[^2]。 #### 3. 请求处理流程详解 下面是对 Spring MVC 请求处理过程的一个逐步分解: 1. 当用户发起请求时,该请求会被转发给前端控制器——`DispatcherServlet`。 2. 随后,`DispatcherServlet` 对请求 URI 进行拆解,并尝试查找与之关联的具体处理器(Handler)[^3]。 3. 如果找到了合适的处理器,则进一步寻找适合它的 Adapter 来完成实际操作。 4. 在真正执行目标方法之前,允许一系列预定义好的拦截器介入其中以实施必要的前置动作。 5. 参数绑定完成后进入真正的业务逻辑处理环节;在此期间可能会涉及数据库访问或其他外部服务交互。 6. 最终形成的结果集需经过视图解析器转化为最终形式反馈给用户端。 #### 4. 总结 通过对上述内容的学习可以发现,Spring MVC 不仅提供了强大的灵活性还保持了良好的可维护性和扩展能力。无论是简单的 CRUD 应用还是复杂的分布式系统都能从中受益匪浅。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火车站卖橘子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值