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

08-Spring MVC 请求处理流程全解析

Spring MVC 请求处理流程全解析(从 DispatcherServlet 到 Controller)

Spring MVC 是构建 Web 应用的基础框架,而其中最核心的组件就是 DispatcherServlet,它作为整个请求流程的入口和协调者,掌控了从接收请求、分发到处理器再到视图渲染的全过程。本文将从源码出发,深入剖析 Spring MVC 的请求处理流程。


一、核心架构概览

请求从浏览器发起到 Controller 方法执行,Spring MVC 的核心流程如下:

客户端请求 → DispatcherServlet → HandlerMapping → HandlerAdapter → Controller → ViewResolver → 渲染视图

简要组件说明:

组件作用
DispatcherServlet中央调度器,拦截所有请求
HandlerMapping根据请求路径查找处理器(Controller)
HandlerAdapter适配执行不同类型的处理器
Controller具体的业务处理逻辑
ViewResolver将逻辑视图名称解析为物理视图
View渲染返回结果(如 JSP, Thymeleaf 等)

二、DispatcherServlet 初始化过程

DispatcherServlet 是一个 HttpServlet,其初始化发生在容器启动时的 init() 方法中。

源码路径:org.springframework.web.servlet.DispatcherServlet

@Override
protected void onRefresh(ApplicationContext context) {
    initStrategies(context); // 初始化 9 大组件
}

其中包括:

  • initHandlerMappings()
  • initHandlerAdapters()
  • initViewResolvers()

✅ Spring 提前准备好请求处理相关的全部组件,等待请求到来。


三、请求到达 DispatcherServlet 的处理流程

@Override
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 1. 根据请求找到 HandlerExecutionChain(含拦截器)
    HandlerExecutionChain mappedHandler = getHandler(processedRequest);

    // 2. 根据 Handler 查找合适的 HandlerAdapter
    HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

    // 3. 执行 Controller 方法
    ModelAndView mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

    // 4. 解析视图
    View view = resolveViewName(mv.getViewName(), mv.getModel(), ...);

    // 5. 渲染视图
    view.render(mv.getModel(), request, response);
}

🌟 小提示:

如果使用的是 @RequestMapping 注解的 Controller,最终的 Handler 是 RequestMappingHandlerAdapter


四、HandlerMapping 详解

Spring MVC 提供了多种 HandlerMapping,常见的是:

  • RequestMappingHandlerMapping(@RequestMapping)
  • SimpleUrlHandlerMapping(传统 XML)

它的作用是根据请求路径、方法等信息,找到具体的 Controller 和方法。

@Override
public HandlerExecutionChain getHandler(HttpServletRequest request) {
    for (HandlerMapping hm : this.handlerMappings) {
        HandlerExecutionChain handler = hm.getHandler(request);
        if (handler != null) {
            return handler;
        }
    }
}

五、HandlerAdapter 的职责

由于处理器类型不一(注解 Controller、HttpRequestHandler、Servlet 等),需要适配器模式将其统一执行。

常用的 HandlerAdapter:

  • RequestMappingHandlerAdapter
  • SimpleControllerHandlerAdapter
@Override
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    // 实际调用 Controller 中的方法
    invokeHandlerMethod(...);
}

六、ViewResolver 与视图渲染

根据 ModelAndView 中的逻辑视图名,调用 ViewResolver 解析成物理视图地址,再进行渲染。

如 Thymeleaf:

InternalResourceViewResolver --> /WEB-INF/views/login.html

视图最终调用 View#render() 完成页面展示。


七、流程总结图

HTTP 请求
   ↓
DispatcherServlet
   ↓
HandlerMapping(匹配 Controller)
   ↓
HandlerAdapter(调用 Controller)
   ↓
执行方法,返回 ModelAndView
   ↓
ViewResolver(解析视图)
   ↓
View(渲染视图)
   ↓
HTTP 响应

八、嵌入式问答(结合源码场景)

💬 Q:DispatcherServlet 默认会处理哪些 URL?

🧠 A:默认会拦截 / 下的所有请求。可以通过 Web 配置自定义其映射路径。


💬 Q:如果 Controller 方法返回 String,会发生什么?

🧠 A:返回的字符串会作为视图名交由 ViewResolver 处理,找到对应的页面进行渲染。


💬 Q:请求参数是如何绑定到方法参数上的?

🧠 A:通过 HandlerMethodArgumentResolver 实现参数的解析和注入,比如 @RequestParam@PathVariable 对应的解析器。


💬 Q:404 一般在哪个阶段出现?

🧠 A:大概率出现在 HandlerMapping 阶段,未匹配到 Controller 方法。


九、总结

Spring MVC 请求处理流程是高度解耦的链式结构,核心是 DispatcherServlet。通过一系列组件协同工作完成请求的接收、处理和响应。

掌握 DispatcherServlet 的执行过程有助于我们理解:

  • 为什么请求找不到 Controller?
  • 为什么参数没注入成功?
  • 为什么页面渲染失败?

✅ 一切都在 DispatcherServlet 的流程中!

相关文章:

  • webrtc-stats
  • 3.神经网络
  • Linux系统(Ubuntu和树莓派)的远程操作练习
  • 第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
  • 初始JavaEE篇 —— SpringBoot 统一功能处理
  • c++--------- stack queue
  • 大语言模型(LLM)全解析:从原理到实战应用
  • 具身推理器:协同视觉搜索、推理和行动,实现具身交互任务
  • openssl源码分析之加密模式(modes)
  • java 集合进阶
  • 顺序表:从数组到高效数据管理的进化之路
  • Android studio打包uniapp插件
  • 浅谈JS判断类型的几个方法
  • CNN注意力机制的进化史:深度解析10种注意力模块如何重塑卷积神经网络
  • 在 Vue 中监听常用按键事件(回车,ESC 键,空格等)。
  • Wincc通过VBS脚本控制控件“ Wincc Online Trend Control ”的曲线显示
  • windows开启wsl与轻量级虚拟机管理
  • [Vue]App.vue讲解
  • 【Vue3知识】组件间通信的方式
  • 2025年Python的主要应用场景
  • 巴基斯坦军方:印度导弹袭击巴首都附近空军基地
  • 习近平会见缅甸领导人敏昂莱
  • 【社论】职业上新,勇于“尝新”
  • 讲座预告|全球贸易不确定情况下企业创新生态构建
  • 两部上戏学生作品亮相俄罗斯“国际大学生戏剧节”
  • 叙利亚政权领导人首访西方国家,与法国总统讨论叙局势