步骤1:用户发起请求
-
所有请求首先被
DispatcherServlet(前端控制器)拦截,它是整个流程的入口。 -
DispatcherServlet继承自HttpServlet,通过web.xml或WebApplicationInitializer配置映射路径(如/)。
步骤2:请求映射(Handler Mapping)
-
HandlerMapping根据请求的 URL、参数、Header 等信息,找到对应的 处理器(Handler)。-
处理器 可以是
@Controller注解的类中的方法,或实现Controller接口的类。 -
关键接口:
RequestMappingHandlerMapping(处理@RequestMapping注解)。
-
-
匹配规则:
@Controller public class UserController {@GetMapping("/users/{id}")public String getUser(@PathVariable Long id, Model model) {// 业务逻辑} }
步骤3:处理器适配(Handler Adapter)
-
HandlerAdapter负责调用处理器方法,并处理参数绑定、返回值转换。-
关键实现类:
RequestMappingHandlerAdapter(支持@RequestMapping方法)。 -
适配过程:
-
解析方法参数(如
@RequestParam、@RequestBody)。 -
执行方法逻辑。
-
处理返回值(如
ModelAndView、JSON 数据)。
-
-
步骤4:执行拦截器(Interceptor)
-
HandlerInterceptor在处理器执行前后插入逻辑:-
preHandle:在处理器方法执行前调用(如权限校验)。
-
postHandle:在处理器方法执行后、视图渲染前调用。
-
afterCompletion:在请求完成后调用(资源清理)。
-
步骤5:业务逻辑处理
-
控制器方法执行业务逻辑,可能涉及:
-
调用 Service 层处理数据。
-
操作 Model 对象向视图传递数据。
@GetMapping("/users") public String listUsers(Model model) {List<User> users = userService.findAll();model.addAttribute("users", users); // 数据传递到视图return "user/list"; // 视图名称 }
-
步骤6:视图解析(View Resolver)
-
ViewResolver将控制器返回的视图名称解析为具体的View对象。-
常见实现:
-
InternalResourceViewResolver:解析 JSP 页面(如/WEB-INF/views/user/list.jsp)。 -
ThymeleafViewResolver:解析 Thymeleaf 模板。
-
-
配置示例:
@Bean public ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver; }
-
步骤7:视图渲染(View Rendering)
-
View对象将模型数据渲染到响应中(如生成 HTML、JSON)。-
渲染方式:
-
JSP:使用 JSTL 或 EL 表达式填充数据。
-
REST API:通过
HttpMessageConverter将返回值序列化为 JSON(如@ResponseBody)。
-
-
步骤8:返回响应
-
渲染后的响应通过
DispatcherServlet返回给客户端。
关键组件与接口
| 组件 | 职责 |
|---|---|
| DispatcherServlet | 前端控制器,统一调度请求处理流程。 |
| HandlerMapping | 映射请求到处理器(Controller 方法)。 |
| HandlerAdapter | 调用处理器方法,处理参数绑定与返回值。 |
| ViewResolver | 解析视图名称到具体视图实现(如 JSP、Thymeleaf)。 |
| HandlerInterceptor | 拦截请求,实现预处理和后处理逻辑(如日志、权限校验)。 |
| HttpMessageConverter | 处理请求/响应的数据转换(如 JSON ↔ Java 对象)。 |
异常处理机制
-
@ExceptionHandler:在 Controller 内处理特定异常。@ExceptionHandler(UserNotFoundException.class) public ResponseEntity<String> handleUserNotFound(UserNotFoundException ex) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage()); }
-
HandlerExceptionResolver:全局异常解析器,自定义异常响应。 -
@ControllerAdvice:定义全局异常处理类。@ControllerAdvice public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ModelAndView handleAllExceptions(Exception ex) {ModelAndView mav = new ModelAndView("error");mav.addObject("message", ex.getMessage());return mav;} }
RESTful 请求处理
-
@RestController:组合@Controller和@ResponseBody,直接返回数据。@RestController @RequestMapping("/api/users") public class UserApiController {@GetMapping("/{id}")public User getUser(@PathVariable Long id) {return userService.findById(id);} }
-
内容协商:根据请求的
AcceptHeader 返回 JSON/XML 等格式(通过HttpMessageConverter)。
源码级流程解析(简化版)
-
DispatcherServlet.doDispatch():
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {HandlerExecutionChain mappedHandler = getHandler(request); // 获取处理器链HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());ModelAndView mv = ha.handle(request, response, mappedHandler.getHandler());processDispatchResult(request, response, mappedHandler, mv, dispatchException); }
2.参数解析:通过 HandlerMethodArgumentResolver 解析方法参数。
3.返回值处理:通过 HandlerMethodReturnValueHandler 处理返回值。
总结
-
核心流程:DispatcherServlet → HandlerMapping → HandlerAdapter → Interceptor → ViewResolver。
-
扩展点:拦截器、异常处理器、自定义参数解析器。
-
设计思想:职责分离、组件化、高度可定制。
