SpringMVC 执行流程¶
结论¶
SpringMVC 围绕 DispatcherServlet 设计,本质是一个前端控制器(Front Controller)。完整流程:
请求 -> DispatcherServlet -> HandlerMapping -> HandlerExecutionChain
-> HandlerAdapter -> Controller -> ModelAndView
-> ViewResolver -> View 渲染 -> 响应
详细步骤¶
1. 请求到达 DispatcherServlet¶
所有请求统一进入 DispatcherServlet,它是前端控制器。
2. DispatcherServlet 查询 HandlerMapping¶
HandlerMapping 根据请求 URL 找到对应的 HandlerMethod(即 @RequestMapping 标注的方法),并生成 HandlerExecutionChain(包含拦截器链)。
常见实现:RequestMappingHandlerMapping。
3. 执行拦截器 preHandle¶
依次执行 HandlerInterceptor#preHandle,返回 false 则中断。
4. DispatcherServlet 通过 HandlerAdapter 调用 Controller¶
HandlerAdapter 屏蔽不同类型 Controller 的调用差异(注解控制器、HttpRequestHandler等)。
5. 调用方法并处理参数解析¶
HandlerAdapter(实际是 RequestMappingHandlerAdapter):
- 用
HandlerMethodArgumentResolver解析参数(@RequestParam、@RequestBody、@PathVariable等)。 - 调用 Controller 方法。
- 用
HandlerMethodReturnValueHandler处理返回值(@ResponseBody走RequestResponseBodyMethodProcessor,用 HttpMessageConverter 写 JSON)。
6. Controller 返回 ModelAndView¶
如果是 @ResponseBody,直接写回 Response,不经过 View。
7. 执行拦截器 postHandle¶
8. ViewResolver 解析视图¶
把逻辑视图名解析为具体 View(如 Thymeleaf、JSP)。
9. View 渲染¶
把 Model 数据填充进模板,输出 HTML。
10. 执行拦截器 afterCompletion¶
流程图¶
sequenceDiagram
participant Client
participant DS as DispatcherServlet
participant HM as HandlerMapping
participant HA as HandlerAdapter
participant C as Controller
participant VR as ViewResolver
participant V as View
Client->>DS: HTTP 请求
DS->>HM: 查找 Handler
HM-->>DS: HandlerExecutionChain
DS->>HA: 适配调用
HA->>C: 反射调用方法
C-->>HA: ModelAndView
HA-->>DS: ModelAndView
DS->>VR: 解析视图
VR-->>DS: View
DS->>V: 渲染
V-->>Client: HTTP 响应
高频追问
@ResponseBody为什么不经过 View?因为RequestResponseBodyMethodProcessor直接用MappingJackson2HttpMessageConverter写 JSON 到 OutputStream。- 拦截器 vs Filter:Filter 是 Servlet 规范,在 DispatcherServlet 之前;Interceptor 是 SpringMVC 概念,只对 Controller 生效。