Skip to content

04.1 — DispatcherServlet 流程

定位: Spring MVC 的前端控制器——从 HTTP 请求到响应的完整链路 面试高频度: ⭐⭐⭐⭐⭐ 考查方式: 12 步请求流程、HandlerMapping/HandlerAdapter 作用

一、这是什么?为什么需要它?

DispatcherServlet 是 Spring MVC 的前端控制器(Front Controller)。它将所有 HTTP 请求集中到一个入口,由框架进行分发和处理,避免每个 Servlet 各自处理请求的重复代码。

二、原理拆解

2.1 核心组件

组件职责默认实现
DispatcherServlet前端控制器,请求分发
HandlerMapping请求 -> Handler 的映射RequestMappingHandlerMapping
HandlerAdapter调用 Handler 并适配参数/返回值RequestMappingHandlerAdapter
HandlerInterceptor拦截器链
ViewResolver视图名称 -> View 对象InternalResourceViewResolver
View视图渲染
HttpMessageConverterHTTP 消息与 Java 对象的转换MappingJackson2HttpMessageConverter 等

2.2 完整请求流程 (12步)

详细步骤说明:

  1. 客户端发送 HTTP 请求
  2. DispatcherServlet 接收请求,调用 doDispatch()
  3. 遍历 HandlerMapping 找到匹配的 HandlerExecutionChain(Handler + Interceptor 列表)
  4. 遍历 HandlerAdapter 找到支持当前 Handler 的适配器
  5. 执行拦截器链的 preHandle() 方法
  6. HandlerAdapter 执行 Handler(Controller 方法)— 处理参数绑定、校验
  7. Controller 执行完毕,返回 ModelAndView(或 @ResponseBody 直接写响应)
  8. 执行拦截器链的 postHandle() 方法
  9. 处理异常(如有)— HandlerExceptionResolver
  10. ViewResolver 解析视图名称 → 获取 View 对象
  11. View 渲染(JSP/Thymeleaf/Freemarker 等)
  12. 执行拦截器链的 afterCompletion() 方法

2.3 @RequestMapping 匹配

java
@RestController
@RequestMapping("/api/users")
public class UserController {
    
    @GetMapping("/{id}")
    public User getById(@PathVariable Long id) { ... }
    
    @PostMapping
    public User create(@RequestBody User user) { ... }
    
    @PutMapping("/{id}")
    public User update(@PathVariable Long id, @RequestBody User user) { ... }
    
    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id) { ... }
    
    @GetMapping(params = "status")  // 参数匹配
    public List<User> getByStatus(@RequestParam String status) { ... }
}

组合注解

注解等价于
@GetMapping@RequestMapping(method = GET)
@PostMapping@RequestMapping(method = POST)
@PutMapping@RequestMapping(method = PUT)
@DeleteMapping@RequestMapping(method = DELETE)
@PatchMapping@RequestMapping(method = PATCH)

三、面试视角

追问答案要点
DispatcherServlet 的完整流程?12步:HandlerMapping -> HandlerAdapter -> interceptor -> Controller -> ViewResolver -> View
HandlerMapping 和 HandlerAdapter 的区别?HandlerMapping 找到 Handler,HandlerAdapter 执行 Handler
为什么需要 HandlerAdapter?适配不同类型的 Handler(@Controller、HttpRequestHandler 等)

📚 相关链接

  • **参数绑定与返回值** — 请求处理中的参数转换
  • **拦截器与异常处理** — 流程中的拦截和异常处理
  • ← 返回 **返回 Spring MVC 索引**

Knowledge4J — Java 知识库