面试知识库
进阶

SpringMVC请求处理流程#

一句话答案#

请求→DispatcherServlet→HandlerMapping 找处理器→HandlerAdapter 调用→返回 ModelAndView→视图渲染响应。

核心要点

流程:

  1. DispatcherServlet 接收请求
  2. HandlerMapping 找到对应的 Handler(Controller)
  3. HandlerAdapter 适配并调用 Handler
  4. Handler 返回 ModelAndView
  5. ViewResolver 解析视图
  6. 渲染视图返回响应

REST模式: @ResponseBody 直接返回 JSON,跳过视图渲染

面试回答(2分钟版)

SpringMVC 的请求处理以 DispatcherServlet 为核心前端控制器。一个 HTTP 请求进来后,DispatcherServlet 首先调用 HandlerMapping 根据 URL 和请求方法找到对应的 Handler,也就是我们写的 Controller 方法,同时会把匹配到的拦截器一起组成 HandlerExecutionChain 返回。接着 DispatcherServlet 根据 Handler 类型找到合适的 HandlerAdapter,由 HandlerAdapter 负责参数解析、数据绑定,然后反射调用 Controller 方法。Controller 处理完返回 ModelAndView 对象,DispatcherServlet 再交给 ViewResolver 解析视图名称得到具体的 View,最后渲染视图写入响应。在前后端分离的 REST 模式下,Controller 方法加上 @ResponseBody 注解后,返回值会被 HttpMessageConverter 直接序列化为 JSON 写入响应体,跳过了视图解析和渲染这两步。整个流程中拦截器的 preHandle 在 Controller 之前执行,postHandle 在之后、视图渲染之前执行,afterCompletion 在视图渲染之后执行。

追问与易错

追问方向:

  • “HandlerMapping 和 HandlerAdapter 各自作用?”→ HandlerMapping 负责根据 URL 和请求方法找到对应的 Handler(Controller 方法);HandlerAdapter 负责适配不同类型的 Handler 并执行参数解析、数据绑定和方法调用
  • “@ResponseBody 改变了哪步?”→ 跳过了 ViewResolver 视图解析和视图渲染两步,返回值直接由 HttpMessageConverter(如 MappingJackson2HttpMessageConverter)序列化为 JSON 写入 Response Body
  • “拦截器和过滤器在流程中的位置?”→ Filter 在 Servlet 容器层面执行(DispatcherServlet 之前);Interceptor 在 SpringMVC 层面,preHandle 在 Controller 之前、postHandle 在之后视图渲染前、afterCompletion 在渲染后

易错点:

  • ❌ 混淆 DispatcherServlet 和普通 Servlet
  • ❌ HandlerAdapter 就是 Controller——是适配器