前面 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 原理