步骤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); } }
内容协商:根据请求的
Accept
Header 返回 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。
扩展点:拦截器、异常处理器、自定义参数解析器。
设计思想:职责分离、组件化、高度可定制。