Spring MVC 请求处理流程步骤详解
作者:云之兕
这篇文章主要介绍了Spring MVC 请求处理流程详解,本文分步骤结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
步骤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。
- 扩展点:拦截器、异常处理器、自定义参数解析器。
- 设计思想:职责分离、组件化、高度可定制。
到此这篇关于Spring MVC 请求处理流程详解的文章就介绍到这了,更多相关Spring MVC 请求处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
