
一、什么是SpringMVC之前一直觉得会使用框架就懂了但其实底层原理我们也要清楚这样使用的时候就会更加有逻辑而不是只停留在表面SpringMVC是Spring生态体系内置的MVC分层Web请求处理框架底层基于原生Servlet规范实现核心入口为DispatcherServlet中央调度器。 它专门用于服务端接收HTTP请求、参数绑定、调用业务层、封装返回结果是传统SSM框架、现代SpringBoot后端接口开发的Web底层支撑所有SpringBoot Web接口本质底层都在运行SpringMVC。MVC三层拆分含义Model模型封装业务数据、数据库查询结果对应项目中的Service、DAO、实体类View视图页面展示层如JSP、Thymeleaf、HTML模板前后端分离项目几乎舍弃视图层统一返回JSONController控制器接收前端请求协调Model与View处理请求分发逻辑开发者编写的RestController/Controller即为控制器。二、SpringMVC核心特点与优势1. 基于注解开发无强制类继承约束原生Servlet开发必须继承HttpServlet重写doGet/doPost方法耦合度极高 SpringMVC仅通过Controller、RestController标记普通POJO类即可作为控制器无需继承任何框架类、实现接口代码轻量化、低耦合。2. 分层解耦职责单一整套框架拆分多个独立组件调度器、处理器映射器、处理器适配器、视图解析器每个组件只负责一件事符合单一职责原则组件可灵活替换扩展。3. 原生支持RESTful接口规范提供GetMapping、PostMapping、PutMapping、DeleteMapping系列注解天然支持REST风格接口设计搭配RestController快速实现前后端分离JSON返回。4. 内置拦截器机制统一请求增强提供HandlerInterceptor拦截器可在Controller执行前后、请求结束后自定义逻辑用于登录校验、权限拦截、日志记录区别于Servlet过滤器Filter仅作用于SpringMVC内部请求。5. 强大的参数自动绑定与类型转换前端表单、URL路径参数、JSON请求体框架自动封装到实体类自动完成字符串、数字、日期等类型转换无需手动通过request.getParameter()取值。6. 容器统一管理依托Spring IOC所有Controller、拦截器、工具组件都交由Spring IOC容器管理自动实现依赖注入Controller可直接注入Service、Mapper无需手动创建对象。7. 灵活的视图解析机制内置InternalResourceViewResolver视图解析器自动拼接页面前缀后缀传统服务端渲染项目可快速跳转页面前后端分离场景直接跳过视图解析序列化对象返回JSON。三、核心组件对应图讲解结合流程图图片来源于网络先梳理图中全部核心组件明确每个组件定位DispatcherServlet中央调度器SpringMVC总入口所有HTTP请求第一道关口全局总指挥本质是HttpServlet子类底层依托Servlet运行。HandlerMapping 处理器映射器只做查询工作根据请求URL匹配对应Controller方法封装成处理器执行链返回。HandlerExecutionChain 处理器执行链封装目标HandlerController方法 全部拦截器集合类比过滤器链。HandlerAdapter 处理器适配器统一执行规范适配不同类型Controller真正调用Controller业务方法。Handler(Controller) 处理器开发者编写的接口业务类调用Service操作数据库。ModelAndView封装Controller返回的数据(Model)与视图名称(View)前后端分离项目不会生成该对象。ViewResolver 视图解析器拼接页面路径定位前端视图文件。View 视图页面模板渲染数据并生成最终页面返回浏览器。四、基于流程图的完整11步执行流程步骤1浏览器发起HTTP请求前端通过URL发送GET/POST/PUT/DELETE请求请求抵达服务端首先进入DispatcherServlet中央调度器。补充SSM需要在web.xml手动注册DispatcherServletSpringBoot通过自动配置WebMvcAutoConfiguration自动创建注册无需XML配置。步骤2DispatcherServlet调用HandlerMapping处理器映射器调度器将当前请求交给HandlerMapping核心作用解析当前请求URL扫描项目中所有Controller匹配该URL对应的目标业务方法。步骤3HandlerMapping返回HandlerExecutionChain执行链匹配完成后映射器返回一条执行链包含两部分Handler目标Controller方法拦截器数组当前请求需要执行的所有Interceptor拦截器。步骤4DispatcherServlet调用HandlerAdapter处理器适配器调度器拿到执行链后不直接执行Controller交给适配器。 设计适配器的原因SpringMVC支持多种类型控制器注解Controller、传统Controller适配器统一封装调用逻辑调度器无需关心Controller底层实现。步骤5HandlerAdapter调用目标HandlerController适配器按照统一反射逻辑执行匹配到的Controller接口方法自动完成请求参数封装、类型转换。步骤6Controller调用Service、DAO操作数据库控制器执行业务逻辑调用Service层处理业务DAO层查询/修改数据库拿到业务结果数据。步骤7Controller返回ModelAndView对象传统服务端渲染JSP/Thymeleaf方法返回数据视图名称封装为ModelAndViewModel存放页面所需数据View代表页面文件名。前后端分离项目RestController方法添加ResponseBody直接返回实体对象、字符串框架使用Jackson自动序列化为JSON不会生成ModelAndView直接跳过视图解析流程。步骤8DispatcherServlet调用ViewResolver视图解析器仅传统页面项目会执行此步骤调度器将ModelAndView交给视图解析器自动拼接页面前缀、后缀找到服务器存放的真实视图文件。 例视图名为user前缀/templates/后缀.html最终定位/templates/user.html。步骤9视图解析器返回View视图对象解析完成后返回封装好路径的视图对象。步骤10View执行视图渲染框架将Model中存储的业务数据填充到HTML/JSP页面完成页面渲染生成完整静态页面。步骤11DispatcherServlet向前端返回HTTP响应页面项目将渲染完成的HTML页面作为响应返回浏览器前后端分离项目直接返回JSON字符串无视图渲染步骤。五、流程关键补充知识点面试高频拓展1. 拦截器Interceptor执行时机内嵌在执行链中一条完整请求中拦截器执行顺序preHandleController执行前返回false直接拦截请求流程终止postHandleController执行完毕视图渲染之前afterCompletion整个请求全部结束资源释放、日志记录。拦截器属于SpringMVC自有组件仅DispatcherServlet内部生效Filter过滤器属于Servlet原生规范先执行Filter再进入DispatcherServlet最后执行拦截器。2. HandlerMapping与HandlerAdapter的分工区别HandlerMapping只负责查找根据URL找到Controller不执行任何业务代码HandlerAdapter只负责执行统一调用Controller方法不做匹配查找。3. Controller 和 RestController 对流程的影响Controller无自动JSON转换方法返回字符串会进入视图解析流程跳转页面如需返回JSON方法上加ResponseBodyRestController Controller ResponseBody类内所有方法自动序列化对象为JSON直接跳过步骤8、9、10不执行视图渲染适配前后端分离开发。4. url-pattern / 和 /* 的区别SSM配置DispatcherServlet拦截路径/拦截所有普通HTTP请求不拦截.jsp页面是标准配置/*拦截包含JSP在内的全部请求会导致页面被控制器拦截页面404禁止使用。5. Spring两级容器关系Spring存在父子容器父容器根容器管理Service、Mapper、工具BeanDispatcherServlet子容器管理Controller、拦截器 子容器可获取父容器所有Bean父容器无法访问子容器BeanSpringBoot自动整合两级容器无需手动配置。六、总结SpringMVC依托Servlet实现以DispatcherServlet为调度核心通过分层组件拆分请求处理全流程实现了请求分发、参数绑定、业务调用、视图渲染完整能力。 对比原生Servlet它依托注解简化开发、分层解耦、支持REST接口如今SpringBoot虽大幅简化配置但Web开发底层依旧完全依赖SpringMVC整套执行逻辑。