Spring MVC 处理请求的流程

      • 流程步骤详解
        • 第1步:发起请求 (HTTP Request)
        • 第2步:映射处理器 (Handler Mapping)
        • 第3步:获取适配器 (Handler Adapter)
        • 第4步:执行拦截器前置处理 (Interceptors - preHandle)
        • 第5步:真正调用处理器 (Handler Execution)
        • 第6步:执行拦截器后置处理 (Interceptors - postHandle)
        • 第7步:处理分发结果 (Process Dispatch Result)
        • 第8步:执行拦截器完成处理 (Interceptors - afterCompletion)
        • 第9步:返回响应 (HTTP Response)
      • 核心组件总结

Spring MVC 处理请求的流程是其最核心的机制,理解它对于掌握整个框架至关重要。这个过程围绕一个核心——前端控制器模式(Front Controller Pattern),即 DispatcherServlet。

整个流程清晰且模块化,下图展示了从请求发起到响应返回的完整生命周期,以及其中涉及的核心组件交互:

ClientDispatcherServlet(前端控制器)HandlerMappingHandlerAdapterController (@Controller)ViewResolverView (JSP/Thymeleaf...)HTTP Request1. 接收请求查询Handler2. 映射查找根据URL找到目标Controller和方法返回HandlerExecutionChain(包含Handler和Interceptors)3. 适配调用获取HandlerAdapter返回Adapter按顺序执行preHandle()loop[4. 执行拦截器 (preHandle)]5. 处理请求(参数解析、方法调用、返回值处理)调用Controller方法返回方法执行结果(ModelAndView/String等)逆序执行postHandle()loop[6. 执行拦截器 (postHandle)]7. 处理视图/响应通过HttpMessageConverter直接写回响应解析视图名返回View对象调用render()渲染视图返回渲染后的HTMLalt[返回@ResponseBody][返回视图名]最终触发afterCompletion()loop[8. 执行拦截器 (afterCompletion)]9. 返回响应HTTP ResponseClientDispatcherServlet(前端控制器)HandlerMappingHandlerAdapterController (@Controller)ViewResolverView (JSP/Thymeleaf...)

流程步骤详解

现在,我们结合上图,对每一个步骤进行详细解读:

第1步:发起请求 (HTTP Request)

请求离开浏览器,到达 DispatcherServlet。根据 web.xml 或 Servlet 3.0+ 的配置,所有匹配特定模式(如 /)的请求都会由它处理。

第2步:映射处理器 (Handler Mapping)

DispatcherServlet 咨询一个或多个 HandlerMapping Bean:“这个请求应该由哪个‘处理器’(Handler)来处理?”。HandlerMapping 根据请求的 URL 进行查找。

  • 常见实现
    • RequestMappingHandlerMapping:用于映射 @RequestMapping 注解的方法(最常用)。
    • BeanNameUrlHandlerMapping:根据 Bean 的名字进行映射。
  • 返回结果:不仅返回找到的目标处理器方法,还会返回一个 HandlerExecutionChain 对象,该对象包含了找到的 Handler 以及所有适用于该请求的 HandlerInterceptor(拦截器)。
第3步:获取适配器 (Handler Adapter)

DispatcherServlet 拿着找到的 Handler,问一堆 HandlerAdapter:“你们谁支持(support)这个 Handler 的类型?”

  • 为什么需要它?:Handler 的类型五花八门(如 @ControllerHttpRequestHandlerServlet)。DispatcherServlet 需要一個统一的接口来调用它们。HandlerAdapter适配器模式的典型应用,它屏蔽了不同处理器的调用细节。
  • 常见实现RequestMappingHandlerAdapter(用于适配 @RequestMapping 注解的方法)。
第4步:执行拦截器前置处理 (Interceptors - preHandle)

在真正调用业务逻辑之前,DispatcherServlet 会调用 HandlerExecutionChain 中所有拦截器的 preHandle() 方法。

  • 应用:进行权限检查、日志记录、 locale 解析等。
第5步:真正调用处理器 (Handler Execution)

现在,DispatcherServlet 让获取到的 HandlerAdapter 去真正地执行 Handler。
这个执行过程非常复杂,包括:

  1. 参数解析:根据方法签名,使用各种 HandlerMethodArgumentResolver 来解析方法的参数(如 @RequestParam, @RequestBody, @PathVariable)。
  2. 调用方法:通过反射调用控制器方法。
  3. 返回值处理:使用方法返回值,使用各种 HandlerMethodReturnValueHandler 处理返回值(如 @ResponseBody, ModelAndView)。
第6步:执行拦截器后置处理 (Interceptors - postHandle)

控制器方法执行完毕后,DispatcherServlet逆序调用所有拦截器的 postHandle() 方法。

  • 应用:有机会修改即将发送到视图的 ModelAndView 对象。
第7步:处理分发结果 (Process Dispatch Result)

这是视图渲染和响应的核心环节。DispatcherServlet 根据控制器方法的返回结果,进行不同的处理:

  • 情况A:方法有 @ResponseBody 或返回 ResponseEntity
    • 流程RequestResponseBodyMethodProcessor 会使用配置的 HttpMessageConverter(如 MappingJackson2HttpMessageConverter)将返回值(如一个 Java 对象)直接序列化(如转为 JSON),并写入 HttpServletResponse 的输出流。此过程不涉及视图解析。
  • 情况B:方法返回视图名(如 String)或 ModelAndView
    • 视图解析DispatcherServlet 调用 ViewResolver 来根据逻辑视图名(如 "success")解析为一个具体的 View 对象(如 InternalResourceView 对应 JSP,ThymeleafView 对应 Thymeleaf)。
    • 视图渲染DispatcherServlet 将模型数据传递给 View 对象,并调用其 render() 方法。该方法会生成最终的 HTML 内容(如合并 JSP 模板和模型数据),并将其写入 HttpServletResponse 的输出流。
第8步:执行拦截器完成处理 (Interceptors - afterCompletion)

无论请求处理成功还是出现异常,DispatcherServlet 都会最终触发所有拦截器的 afterCompletion() 方法。

  • 应用:进行资源清理、记录请求完成时间等。
第9步:返回响应 (HTTP Response)

最终,完整的响应通过 Servlet 容器(如 Tomcat)返回给客户端。


核心组件总结

组件职责类比
DispatcherServlet前端控制器,协调所有组件,是整个流程的总指挥。餐厅的前台经理
HandlerMapping请求映射,根据 URL 找到对应的处理器。餐厅的引座员
HandlerAdapter处理器适配,用统一的接口调用各种不同类型的处理器。餐厅的服务员,连接经理和后厨
Handler处理器(通常是我们写的 @Controller)。餐厅的厨师
ViewResolver视图解析器,将逻辑视图名解析为具体视图对象。餐厅的出菜员
View视图,负责将模型数据渲染成最终的响应内容(HTML/JSON等)。最终呈现的菜肴
HandlerInterceptor拦截器,在请求处理的不同阶段进行横切处理。餐厅的质检员

这个流程充分体现了 Spring MVC 的高度可配置性和可扩展性。其中的每一个步骤几乎都可以通过配置自定义组件或实现特定接口来进行干预和扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921454.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921454.shtml
英文地址,请注明出处:http://en.pswp.cn/news/921454.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

敏捷scrum管理实战经验总结

1.敏捷 敏捷的构成 敏捷由实践来源、应用场景、组织文化、领导力、团队、需求、管理、技术、质量、度量、交付、过程改进、大型项目组合管理以及受监管行业中的敏捷等构成 敏捷开发的特点 短发布周期小批量的方式、开展从需求到实现的开发工作高层级的预先规划结合详细的即时规…

南科大适应、协同与规划的完美融合!P³:迈向多功能的具身智能体

作者:Shengli Zhou1^{1}1, Xiangchen Wang1^{1}1, Jinrui Zhang1^{1}1, Ruozai Tian2^{2}2, Rongtao Xu2,3^{2,3}2,3, Feng Zheng1,2^{1,2}1,2单位:1^{1}1南方科技大学,2^{2}2时空智能,3^{3}3穆罕默德本扎耶德人工智能大学论文标题…

自动化流水线

import React, { useState, useEffect } from ‘react’; import { ChevronRight, CheckCircle, Circle, AlertCircle, Clock, Play, Pause, Settings, Code, Server, Shield, Database, Globe, Zap, FileText, Users, GitBranch, Package, Monitor, ChevronDown } from ‘luci…

【高等数学】第十一章 曲线积分与曲面积分——第三节 格林公式及其应用

上一节:【高等数学】第十一章 曲线积分与曲面积分——第二节 对坐标的曲线积分 总目录:【高等数学】 目录 文章目录1. 格林公式2. 平面上曲线积分与路径无关的条件3. 二元函数的全微分求积4. 曲线积分的基本定理1. 格林公式 单连通与复连通区域 设 DDD …

Boost电路:平均状态空间建模

电路特征介绍如图所示是一个非理想情况下的boost电路,其中L1L_{1}L1​和RL1R_{L1}RL1​是分别是电感和串联电阻;C1C_{1}C1​和RC1R_{C1}RC1​是输出电容和串联电阻;Q1Q_{1}Q1​是MOS管,其导通电阻是RonR_{on}Ron​;D1D…

免费网站模板/网站模板建站的优势/如何下载网站模板搭建网站?

在网站建设领域,“网站模板” 是降低技术门槛、提升建站效率的核心工具,尤其适合非专业开发者或追求低成本、快上线的需求场景。下面从定义、核心优势两方面展开详细解析,帮助你全面理解其价值。 一、什么是网站模板? 网站模板&am…

【MATLAB例程】平面上的组合导航例程,使用EKF融合IMU和GNSS数据,8维状态量和2维观测量,附代码下载链接

文章目录程序详解概述系统架构核心数学模型性能评估算法特点运行结果MATLAB源代码程序详解 概述 本代码实现基于扩展卡尔曼滤波器(EKF)的二维组合导航系统,融合IMU(惯性测量单元)和GNSS(全球导航卫星系统…

react生命周期,详细版本

React 组件的生命周期分为三个阶段:挂载(Mounting)、更新(Updating) 和 卸载(Unmounting)。以下是类组件生命周期的详细说明(基于 React 16.3+ 版本): 一、挂载阶段(Mounting) 组件实例被创建并插入 DOM 时的流程: constructor(props) ○ 用途:初始化状态(this…

腾讯最新开源HunyuanVideo-Foley本地部署教程:端到端TV2A框架,REPA策略+MMDiT架构,重新定义视频音效新SOTA!

一、模型介绍HunyuanVideo-Foley 是腾讯混元团队在2025年8月底开源的一款端到端视频音效生成模型。它旨在解决AI生成视频“有画无声”的痛点,通过输入视频和文本描述,就能自动生成电影级别的同步音效,显著提升视频的沉浸感。它是专为视频内容…

计算机原理(二)

计算机原理系列 欢迎大家关注「海拉鲁知识大陆」 多交流不迷路 计算机原理(一) 继续上一篇计算机原理(一)深入了解程序执行部分,进一步说说程序在冯诺依曼模型上如何执行。如果没有了解的童鞋可以查看我上一篇文章。…

【设计模式】 工厂方法模式

系列文章目录 文章目录系列文章目录需要了解工厂制造细节吗?简单工厂模式实现工厂方法模式的实现简单方法? 工厂方法?总结需要了解工厂制造细节吗? 我们在前面的文章中为大家介绍了简单工厂模式,我们知道 简单工厂模式…

详解 Java 中的 CopyOnWriteArrayList

目录 【1】CopyOnWriteArrayList 简介 【2】核心原理 1.底层数据结构 2.写时复制机制 【3】CopyOnWriteArrayList常用方法及实例 1.添加元素方法 add () 2.获取元素方法 get () 3.删除元素方法remove() 【4】优缺点分析 【5】适用场景 【6】总结 【1】CopyOnWriteAr…

新手SEO优化快速起步教程

本教程专为SEO新手设计,帮助您快速上手优化工作。我们将一步步带您了解基础概念,包括高效挖掘关键词的方法、内容优化的核心技巧,以及网站基础设置的关键步骤。后续还会讲解提升排名的实用策略、如何监控效果并进行调整,确保您能系…

Minecraft图片搜索技巧

以下是更多专注 Minecraft 内容的高质量社区平台,涵盖建筑展示、模组/材质分享、实机截图、艺术创作等方向,按类型分类整理:---一、国际知名综合社区平台 特点 链接 CurseForge 模组/材质/数据包第一仓库,作者更新快,支…

数学建模-非线性规划(NLP)

1-理论知识介绍应用2-基于matlab实现非线性规划1)例1% 清除工作台和命令行 clear;clc; x0[0 0 0]; A [-1 1 -1]; b 0; [x,value] fmincon(f1,x0,A,b,[],[],[],[],nonlfun1) function f f1(x)f x(1)^2x(2)^2x(3)^28; end function [c,ceq] nonlfun1(x)c [x(1)…

人工智能学习:什么是seq2seq模型

一、seq2seq模型 Seq2Seq(Sequence-to-Sequence)模型是一种用于处理序列转换问题的深度学习模型,广泛应用于机器翻译、文本摘要、对话系统、语音识别等领域。Seq2Seq模型的核心思想是通过一个编码器(Encoder)将输入序列编码为一个固定长度的上下文向量(Context Vector),…

生态 | 华院计算与深至科技达成战略合作,携手推动AI+医学影像算法升级迭代

8月25日,华院计算技术(上海)股份有限公司(以下简称“华院计算”)与上海深至信息科技有限公司(以下简称“深至科技”)正式签署战略合作协议。双方将秉持“优势互补、资源共享、战略协同、共同发展…

详解MySQL环境变量配置及其在备份中的应用

正确配置MySQL环境变量是保障数据库稳定运行和高效管理的基础。这些变量涵盖了从内存分配、连接设置到日志行为等方方面面,直接决定了数据库的性能表现和功能特性。对于数据库管理员而言,熟练掌握环境变量的配置,是进行性能调优和故障排查的必…

scikit-learn零基础配置(含python、anaconda)

一、Anaconda环境搭建 1、关于Anaconda Anaconda 是一个非常 popular 的 Python 发行版,它不仅包含了 Python 语言本身,还预装了众多常用的科学计算库,如 NumPy、Pandas、Matplotlib 等,能够极大地方便用户的开发和数据分析工作。…

RAG提示词(日本語版)

RAG提示词(日本語版) System Message # 知能型質問応答アシスタント(RAGシステムプロンプト)## 役割定義 あなたは「知能型質問応答アシスタント」として、提供されたコンテキスト情報に基づいてユーザーの質問に回答する専門的な…