
SpringMVC 完整执行流程核心组件DispatcherServlet前端控制器、HandlerMapping、HandlerAdapter、Handler(Controller)、ModelAndView、ViewResolver、View整体流程图文字版客户端发送请求请求到达服务器被DispatcherServlet拦截前端控制器整个流程入口DispatcherServlet将请求交给HandlerMappingHandlerMapping根据 URL 查找对应的处理器Handler(Controller)返回HandlerExecutionChain包含 handler 对象 拦截器链DispatcherServlet拿到 Handler去找HandlerAdapter处理器适配器适配不同 Controller 调用方式HandlerAdapter执行目标Handler(Controller)业务方法Controller 处理业务返回ModelAndView封装模型数据 Model 逻辑视图名 ViewNameHandlerAdapter 将 ModelAndView 返回给 DispatcherServletDispatcherServlet把逻辑视图名交给ViewResolver 视图解析器ViewResolver把逻辑视图名解析成真正的View视图对象如 jsp、thymeleafDispatcherServlet调用View.render()渲染视图传入 Model 数据视图渲染把模型数据填充到页面生成响应返回响应给浏览器详细分步拆解带源码调用顺序View视图对象ViewResolver视图解析器Controller业务处理器HandlerAdapter处理器适配器HandlerExecutionChain处理器执行链(Handler拦截器)HandlerMapping处理器映射器DispatcherServlet前端控制器Tomcat容器浏览器(Client)View视图对象ViewResolver视图解析器Controller业务处理器HandlerAdapter处理器适配器HandlerExecutionChain处理器执行链(Handler拦截器)HandlerMapping处理器映射器DispatcherServlet前端控制器Tomcat容器浏览器(Client)执行拦截器 preHandle()执行拦截器 postHandle()执行拦截器 afterCompletion()发送HTTP请求doService() → doDispatch()getHandler(request) 查询处理器封装Handler 拦截器集合返回 HandlerExecutionChaingetHandlerAdapter(handler) 获取适配器调用Controller业务方法返回 ModelAndView(模型逻辑视图名)返回 ModelAndViewresolveViewName(逻辑视图名)解析生成View物理视图对象返回 View对象render(model,request,response) 渲染视图把Model数据写入Request域输出页面返回HTTP响应结果① 请求进入 DispatcherServletweb 容器(Tomcat)收到 http 请求匹配到 SpringMVC 的核心 ServletDispatcherServlet执行doService()→doDispatch()doDispatch 是 SpringMVC 核心调度方法。protectedvoiddoDispatch(HttpServletRequestrequest,HttpServletResponseresponse)throwsException② 获取执行链HandlerMapping// 1. 根据request获取 HandlerExecutionChainHandlerExecutionChainmappedHandlergetHandler(request);HandlerMapping 作用URL → Controller映射返回HandlerExecutionChain包含 handlercontroller对象 拦截器HandlerInterceptor集合如果找不到handler返回404。拦截器执行时机preHandle()在Controller方法执行之前执行。③ 获取适配器 HandlerAdapter// 2. 根据handler拿到可以执行它的适配器HandlerAdapterhagetHandlerAdapter(mappedHandler.getHandler());为什么需要适配器SpringMVC支持多种handler实现方式注解Controller、HttpRequestHandler、SimpleControllerHandlerAdapter不同接口方法不一样适配器统一对外调用接口DispatcherServlet不需要关心controller是什么类型。④ 执行Controller业务逻辑// 调用handler执行controller方法返回ModelAndViewmvha.handle(processedRequest,response,mappedHandler.getHandler());HandlerAdapter 调用 controller 的业务方法业务处理封装数据到 Model设置视图名称返回ModelAndView如果是 ResponseBody直接返回jsonModelAndView为null跳过视图解析阶段⑤ 拦截器 postHandleController方法执行完毕后执行拦截器的postHandle()在视图渲染之前。⑥ 视图解析 ViewResolver// 3. 视图解析渲染页面processDispatchResult(processedRequest,response,mappedHandler,mv,dispatchException);内部ViewviewresolveViewName(mv.getViewName(),mv.getModelInternal(),locale,request);ViewResolver接收逻辑视图名拼接前后缀得到物理视图生成View对象例逻辑视图list前缀/WEB-INF/views/后缀.jsp→/WEB-INF/views/list.jsp⑦ 视图渲染 View#render()view.render(mv.getModelInternal(),request,response);将 Model 中的数据放入 request域jsp/模板引擎渲染页面生成输出流⑧ 拦截器 afterCompletion视图渲染完成之后执行拦截器afterCompletion()做资源清理。⑨ 响应返回浏览器两种分支情况普通页面跳转返回视图完整走完上面全部流程解析视图、渲染页面。ResponseBody / RestController返回JSONController执行完直接把对象转json写入response输出流返回的 ModelAndView null跳过视图解析、视图渲染ControllerHandlerAdapter(RequestResponseBody处理器)HandlerMappingDispatcherServlet浏览器(Client)ControllerHandlerAdapter(RequestResponseBody处理器)HandlerMappingDispatcherServlet浏览器(Client)preHandle拦截器postHandle、afterCompletionHTTP请求查询Handler返回执行链执行handler调用Controller方法返回Java对象对象序列化为JSON直接写入response输出流ModelAndView null直接返回JSON响应跳过视图解析组件职责总结组件作用DispatcherServlet前端控制器总调度整个MVC的入口HandlerMapping请求URL映射到Controller返回执行链Handler(Controller)业务处理器处理业务逻辑HandlerAdapter适配器统一调用不同类型ControllerModelAndView封装模型数据逻辑视图名称ViewResolver视图解析器逻辑视图 → 物理View对象View视图对象负责渲染输出页面HandlerInterceptor拦截器在controller前后做增强处理时序记忆口诀请求找前端控制器映射器找处理器链适配器调用控制器返回模型和视图名解析器解析真实视图视图渲染输出响应。面试常问DispatcherServlet 在什么时候初始化tomcat启动容器初始化servlet时加载springmvc.xml初始化各个HandlerMapping、HandlerAdapter等组件。Filter 和 Interceptor 区别FilterServlet规范在DispatcherServlet之前执行InterceptorSpringMVC组件在DispatcherServlet内部Controller方法前后执行。ResponseBody为什么不跳转页面RequestResponseBodyMethodProcessor 适配器处理直接写responsemodelAndView置null不进入视图解析。文字时序梳理面试口述版浏览器发起HTTP请求Tomcat接收请求交给DispatcherServlet的doDispatch()DispatcherServlet调用HandlerMapping根据url得到HandlerExecutionChainController拦截器执行拦截器preHandle()DispatcherServlet通过getHandlerAdapter()拿到适配当前Controller的HandlerAdapterHandlerAdapter调用Controller业务方法得到ModelAndView执行拦截器postHandle()将逻辑视图名交给ViewResolver解析得到真实View对象调用View.render()渲染填充Model数据执行拦截器afterCompletion()做资源清理响应返回浏览器特殊ResponseBody场景适配器直接序列化写responseModelAndViewnull跳过视图解析与渲染。