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 | 视图渲染 | — |
| HttpMessageConverter | HTTP 消息与 Java 对象的转换 | MappingJackson2HttpMessageConverter 等 |
2.2 完整请求流程 (12步)
详细步骤说明:
- 客户端发送 HTTP 请求
DispatcherServlet接收请求,调用doDispatch()- 遍历
HandlerMapping找到匹配的HandlerExecutionChain(Handler + Interceptor 列表) - 遍历
HandlerAdapter找到支持当前 Handler 的适配器 - 执行拦截器链的
preHandle()方法 - HandlerAdapter 执行 Handler(Controller 方法)— 处理参数绑定、校验
- Controller 执行完毕,返回
ModelAndView(或@ResponseBody直接写响应) - 执行拦截器链的
postHandle()方法 - 处理异常(如有)—
HandlerExceptionResolver - ViewResolver 解析视图名称 → 获取 View 对象
- View 渲染(JSP/Thymeleaf/Freemarker 等)
- 执行拦截器链的
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 索引**