SpringMVC 底层原理:DispatcherServlet、九大组件、请求全流程、参数绑定、消息转换器
前面 4 篇我们讲解了 Spring IOC、AOP、SpringBoot 自动配置、Spring 事务。本篇作为 Spring 全家桶系列收尾讲解 SpringMVC也就是 Spring 体系的 Web 层框架。 SpringBoot 的 Web 能力底层就是 SpringMVC日常写RestController、RequestMapping接口都是 SpringMVC 的能力。很多开发只会写 Controller 接口但是不清楚一次 HTTP 请求从浏览器到后端再返回响应完整经历了哪些组件不理解参数解析、JSON 序列化、拦截器、全局异常处理器底层原理。本文从 MVC 设计思想、DispatcherServlet、九大组件、完整请求流程、参数绑定、HttpMessageConverter、拦截器、开发踩坑完整拆解。前言MVC 是经典分层架构Model模型数据、View视图、Controller控制器。 传统 Servlet 开发每个请求对应一个 Servlet大量重复代码手动解析 request 参数、封装 response耦合严重维护困难。SpringMVC 基于前端控制器Front Controller模式所有请求统一交给DispatcherServlet接收由 DispatcherServlet 调度各个可插拔组件完成请求处理。SpringMVC 构建在 Servlet 规范之上同时依托 Spring IOC 容器Controller、拦截器、异常处理器全部作为 Bean 托管。 SpringBoot 内置 SpringMVC自动装配 DispatcherServlet不需要 web.xml 配置。一、核心DispatcherServlet前端控制器DispatcherServlet是整个 SpringMVC 的入口本质是一个 Servlet。 职责拦截全部 HTTP 请求协调九大组件调度请求处理链路捕获处理过程中的异常交给异常解析器最终渲染视图 / 写出响应返回客户端。核心设计思想单一职责 可插拔组件。DispatcherServlet 只做调度具体工作交给 HandlerMapping、HandlerAdapter 等组件完成组件可以自定义替换、扩展。二、SpringMVC 九大核心组件全部由 Spring IOC 管理DispatcherServlet 启动时自动加载这些 Bean。HandlerMapping 处理器映射器根据请求 URL、请求方式GET/POST、请求头查找匹配的 Handler标注 RequestMapping 的 Controller 方法叫 HandlerMethod同时把匹配的拦截器一起封装返回。常用实现RequestMappingHandlerMapping处理RequestMapping注解。HandlerAdapter 处理器适配器DispatcherServlet 不直接调用 Handler通过适配器模式执行 Handler。 不同类型 Handler 有不同执行方式适配器屏蔽差异。最常用RequestMappingHandlerAdapter负责执行注解 Controller 方法内部包含参数解析器、返回值处理器。HandlerExceptionResolver 异常解析器Controller、拦截器执行抛出异常时由异常解析器捕获处理异常封装返回结果。我们开发的全局异常处理器就是实现这个接口。ViewResolver 视图解析器把逻辑视图名称如user/list解析为 View 视图对象。前后端分离项目用RestController直接返回 JSON不会走视图渲染。如 ThymeleafViewResolver、InternalResourceViewResolverJSP。View 视图负责渲染模型数据生成 HTML 页面。前后端分离项目基本不用。MultipartResolver 文件上传解析器解析 multipart/form-data 类型请求封装文件上传对象。LocaleResolver 国际化解析器解析请求对应的区域语言zh-CN、en-US用于国际化页面。ThemeResolver 主题解析器页面主题样式解析现在很少使用。FlashMapManager 闪存管理器重定向时传递临时参数避免参数放在 URL 上。重点记忆日常开发最核心 4 个组件DispatcherServlet、HandlerMapping、HandlerAdapter、HandlerExceptionResolver。三、一次 HTTP 请求完整执行流程核心浏览器发起 HTTP 请求 → Tomcat 接收请求 → 交给 DispatcherServlet阶段 1HandlerMapping 查找处理器DispatcherServlet 遍历所有 HandlerMapping根据URL、请求方法匹配找到对应的HandlerMethod同时组装匹配的拦截器链HandlerExecutionChain。找不到匹配 Handler直接返回 404。阶段 2执行拦截器 preHandle ()按顺序执行拦截器的preHandle()任意一个preHandle返回false直接终止请求返回响应不会执行 Controller。阶段 3寻找 HandlerAdapterDispatcherServlet 查找能够支持当前HandlerMethod的适配器常用RequestMappingHandlerAdapter。阶段 4参数绑定与解析参数解析器 ArgumentResolverHandlerAdapter 调用参数解析器从HttpServletRequest解析各类参数URL 路径变量PathVariableURL 查询参数 / 表单参数RequestParam请求体 JSONRequestBody依赖 HttpMessageConverterHeader、Cookie、实体对象解析完成后自动做类型转换、JSR303 参数校验组装成 Controller 方法入参。阶段 5执行 Controller 业务方法调用 Controller 方法执行业务代码拿到方法返回值。阶段 6返回值处理器处理返回结果HandlerAdapter 使用返回值处理器对返回值做处理标记ResponseBody通过 HttpMessageConverter 将对象序列化为 JSON写入 response body普通字符串返回视为逻辑视图名称进入视图渲染流程。阶段 7执行拦截器 postHandle ()Controller 方法正常执行完毕后、视图渲染之前执行postHandle。如果 Controller 抛出异常postHandle不会执行。阶段 8视图渲染前后端分离项目直接跳过如果返回ModelAndView/ 视图名称ViewResolver 解析视图View 渲染页面。阶段 9执行拦截器 afterCompletion ()视图渲染完成后执行。无论 Controller 正常执行还是抛出异常都会执行适合写资源释放逻辑。阶段 10异常兜底处理整个链路任意环节抛出异常都会交给HandlerExceptionResolver统一捕获封装错误响应。一句话精简流程 请求→DispatcherServlet→HandlerMapping 找 Handler→拦截器 preHandle→HandlerAdapter→参数解析→调用 Controller→处理返回值→postHandle→视图渲染→afterCompletion→返回响应。四、关键模块详解4.1 HttpMessageConverter 消息转换器作用负责请求体序列化、响应体反序列化。读请求把 Request Body 的 JSON 字符串转为 Java 对象RequestBody写响应把 Java 对象序列化为 JSON 字符串写入 ResponseResponseBody。SpringBoot 默认配置MappingJackson2HttpMessageConverter底层 Jackson。坑点RequestBody只能读取 POST 请求 body不能读取 url 参数Content-Type 必须是 application/json。4.2 拦截器 HandlerInterceptor三个方法preHandleController 执行之前返回 true 放行false 拦截。适合登录校验、token 校验。postHandleController 执行成功视图渲染之前可以修改 Model 数据。异常不会执行。afterCompletion请求全部完成视图渲染完毕无论是否异常都会执行资源清理。拦截器和过滤器 Filter 区别FilterServlet 规范属于 Tomcat在 DispatcherServlet之前执行只能拿到 request、responseHandlerInterceptorSpringMVC 组件在 DispatcherServlet 内部Controller 前后执行可以拿到 HandlerMethod 对象Spring Bean。4.3 Controller 和 RestControllerTarget(ElementType.TYPE) RestController Controller ResponseBodyController返回视图页面RestController类上自带ResponseBody所有方法返回值直接写入响应体不走视图解析。五、常用注解原理RequestMapping派生注解GetMapping/PostMapping在容器启动阶段被RequestMappingHandlerMapping扫描把 URL 和 HandlerMethod 存入映射注册表。RequestParam解析 url 查询参数、表单参数。PathVariable解析 URL 路径占位符。RequestBody使用消息转换器读取请求体 JSON。RequestHeader读取请求头。六、开发实战踩坑清单GET 请求不能使用 RequestBodyGET 没有请求体RequestBody读取 body 会报错GET 参数用RequestParam、PathVariable。拦截器 preHandle 返回 falseafterCompletion 仍然会执行但是 postHandle 不会执行。全局异常处理器只能捕获 Controller 内抛出的异常Filter 中抛出的异常SpringMVC 异常解析器捕获不到。参数绑定类型转换失败、JSR303 校验失败会抛出 MethodArgumentNotValidException交给全局异常处理器。ResponseBody依赖 HttpMessageConverter如果没有 Jackson 依赖JSON 序列化失败。静态资源html、图片默认不走 ControllerDispatcherServlet 放行静态资源。跨域问题浏览器同源策略。可以使用CrossOrigin注解或者 WebMvcConfigurer 统一配置跨域。Configuration public class WebConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(http://localhost:8080) .allowedMethods(GET,POST); } }注意allowCredentialstrue 时allowedOrigins 不能写*会冲突。WebMvcConfigurer 不要加EnableWebMvc加上之后 SpringBoot 自动配置失效全部 MVC 配置需要自己手动配置。七、SpringMVC 和 SpringBoot 的关系SpringBoot Web Starter 自动装配 SpringMVC 自动创建 DispatcherServlet、自动装配 HandlerMapping、HandlerAdapter、消息转换器、视图解析器等组件。如果不使用 SpringBootSSM 项目需要在 xml 手动注册 DispatcherServlet 和 MVC 组件。八、问答汇总Q1SpringMVC 的执行流程A浏览器请求到达 DispatcherServletHandlerMapping 匹配 url 找到 Handler 和拦截器链执行拦截器 preHandleHandlerAdapter 解析请求参数调用 Controller 方法返回值处理器处理结果执行 postHandle视图渲染执行 afterCompletion异常交给异常解析器处理。Q2Filter 和 Interceptor 的区别AFilter 属于 Servlet 规范Tomcat 执行在 DispatcherServlet 之前Interceptor 是 SpringMVC 组件在 DispatcherServlet 内部Controller 前后执行。Filter 只能操作 request、responseInterceptor 可以拿到 HandlerMethod依赖 Spring 容器。Q3HttpMessageConverter 作用A消息转换器负责请求体 JSON 转 Java 对象RequestBodyJava 对象序列化为 JSON 写入响应ResponseBody。SpringBoot 默认使用 Jackson。Q4九大组件简单说几个ADispatcherServlet 调度HandlerMapping 映射处理器HandlerAdapter 执行处理器HandlerExceptionResolver 异常处理ViewResolver 视图解析器MultipartResolver 文件上传解析器。Q5RestController 是什么AController ResponseBody类上所有方法返回值直接写入 response body不进行视图解析前后端分离开发常用。Q6preHandle、postHandle、afterCompletion 执行顺序和异常场景A正常流程preHandle → Controller → postHandle → afterCompletion。 Controller 抛出异常preHandle 执行postHandle 不执行afterCompletion 依然执行。preHandle 返回 false 直接终止afterCompletion 执行。Q7EnableWebMvc 作用A开启 SpringMVC 完全手动配置会覆盖 SpringBoot 的 Web 自动配置消息转换器、静态资源等自动配置失效一般业务项目不要加。结语SpringMVC 是 Spring 全家桶 Web 层的核心和前面 IOC、AOP 一脉相承。DispatcherServlet 本身是 IOC 容器中的 BeanHandler、拦截器、异常处理器全部托管在 IOCAOP 可以作用在 Controller、Service 方法上。 理解 SpringMVC你就能打通从 HTTP 请求 → Web 层 → Service 层 → 数据库的完整链路。 至此Spring 全家桶系列 5 篇博客全部完成Spring IOC 容器原理Spring AOP 原理SpringBoot 自动配置 自定义 StarterSpring 事务声明式 编程式SpringMVC 原理

相关新闻

让推理飞起来:NVIDIA-Nemotron-3.5-Bolt-74B-A9B-GGUF 搭配DFlash NVFP4推测解码加速实战

让推理飞起来:NVIDIA-Nemotron-3.5-Bolt-74B-A9B-GGUF 搭配DFlash NVFP4推测解码加速实战

大模型基础模型多模态本地部署 【免费下载链接】NVIDIA-Nemotron-3.5-Bolt-74B-A9B-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/NVIDIA-Nemotron-3.5-Bolt-74B-A9B-GGUF 点击查看 免费下载 NVIDIA-Nemotron-3.5-Bolt-74B-A9B-GGUF 是 Unsloth 为 N…

2026/10/18 5:49:44 阅读更多 →
失眠与焦虑的脑机制异同:基于静息态ALE元分析的系统比较

失眠与焦虑的脑机制异同:基于静息态ALE元分析的系统比较

1. 研究背景:为什么把失眠和焦虑放在一起比较?失眠和广泛性焦虑障碍,在精神科门诊里几乎是一对"难兄难弟"。很多患者晚上躺下睡不着,脑子里各种念头停不下来;白天又因为没睡好而烦躁、担心、坐立不安。临床上…

2026/10/18 5:48:44 阅读更多 →
性能测试入门实战:核心指标与瓶颈定位指南

性能测试入门实战:核心指标与瓶颈定位指南

性能测试这个事,很多人一听就觉得“高大上”,总觉得是专门搞性能优化的大牛才碰的。但真进了这个圈子你会发现,性能测试更像是体检,不复杂但特别考验耐心和思路。刚入行的时候我也一头雾水,光看那些术语就够懵的&#…

2026/10/18 5:48:44 阅读更多 →

最新新闻

基于MATLAB的视频行人检测与跟踪系统实战解析

基于MATLAB的视频行人检测与跟踪系统实战解析

前阵子我帮一家园区做监控视频的离线分析,需求不复杂:统计每条通道一天的行人流量,最好还能画出每个目标的行走轨迹。人工盯录像实在不现实,一小时快进看完基本就是碰运气。后来我用MATLAB搭了一套视频行人检测与跟踪系统&#xf…

2026/10/18 12:59:42 阅读更多 →
PHP原生生成Excel:不装Composer轻松导出xlsx

PHP原生生成Excel:不装Composer轻松导出xlsx

简介:在PHP后端开发中,Excel文件生成是数据导出、报表下载等场景的高频需求。这套源码示例围绕“PHP生成Excel文件”提供完整入门演示,适合需要快速实现表格导出功能的初中级开发者参考使用。压缩包共2个文件,RAR格式,…

2026/10/18 12:59:42 阅读更多 →
Spark 2.3.0无Hive版部署指南:轻量级生产就绪实践

Spark 2.3.0无Hive版部署指南:轻量级生产就绪实践

简介:本资源是专为大数据工程师与 Spark 高级使用者定制的 Spark 2.3.0 精简发行版,聚焦 Hive on Spark 场景下的轻量集成需求——在不捆绑 Hive JAR 包的前提下,实现 Spark 对 Hive 元数据与表数据的访问能力,适用于已部署独立 H…

2026/10/18 12:59:42 阅读更多 →
零分配流式CSV解析器:23GB大文件秒级吞吐实战

零分配流式CSV解析器:23GB大文件秒级吞吐实战

简介:本资源是一份面向C#中高级开发者的高性能CSV文件读取实战方案,聚焦大数据量场景下的速度瓶颈与内存优化问题。针对9GB、1.2亿行14列的极端规模CSV文件,提供可在8秒内完成读取与初步显示的完整工程实现,适用于金融数据清洗、日…

2026/10/18 12:59:42 阅读更多 →
Nexus 3.30.0 Windows 安装避坑指南:JDK 8 与端口冲突解决方案

Nexus 3.30.0 Windows 安装避坑指南:JDK 8 与端口冲突解决方案

简介:本资源为Nexus Repository Manager 3.30.0-01正式版Windows 64位安装包,面向Java开发者、DevOps工程师及企业级Maven仓库搭建者,用于快速部署本地或私有化构件仓库,解决依赖代理缓存、多源聚合、安全发布与权限管控等核心问题…

2026/10/18 12:59:42 阅读更多 →
微信小程序英语学习平台:Spring Boot+MySQL全栈实践指南

微信小程序英语学习平台:Spring Boot+MySQL全栈实践指南

简介:这是一套面向计算机专业本科生的毕业设计级微信小程序实战项目,聚焦英语学习场景下的用户互动与知识管理需求,适用于Java后端开发、小程序前端及全栈课程设计实践。资源包含1221个文件,涵盖111个Java后端代码(SSM…

2026/10/18 12:58:41 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →