Spring MVC 请求处理流程步骤详解

 更新时间:2025年04月15日 09:48:21   作者:云之兕  
这篇文章主要介绍了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);
    }
}
  • 内容协商:根据请求的 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。
  • 扩展点:拦截器、异常处理器、自定义参数解析器。
  • 设计思想:职责分离、组件化、高度可定制。

到此这篇关于Spring MVC 请求处理流程详解的文章就介绍到这了,更多相关Spring MVC 请求处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IntelliJ IDEA运行SpringBoot项目的详细步骤

    IntelliJ IDEA运行SpringBoot项目的详细步骤

    这篇文章主要介绍了IntelliJ IDEA如何运行SpringBoot项目,步骤一配置maven,步骤二配置JDK环境,紧接着通过步骤三检查数据库的配置,最后一步数据库连接,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Java中求最大值的4种方法实例代码

    Java中求最大值的4种方法实例代码

    这篇文章主要给大家介绍了关于Java中求最大值的4种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java获取Excel中图片所在的行和列坐标位置

    Java获取Excel中图片所在的行和列坐标位置

    这篇文章主要介绍了Java获取Excel中图片所在的行和列坐标位置,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • IDEA Eval Reset 使用方法汇总

    IDEA Eval Reset 使用方法汇总

    本文给大家介绍了IDEA Eval Reset 使用方法,安装插件包括离线安装方式和在线安装方式,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • 解决jpa查询语句自动变成了update的问题

    解决jpa查询语句自动变成了update的问题

    这篇文章主要介绍了解决jpa查询语句自动变成了update的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 在IDEA中实现生成Maven依赖关系图

    在IDEA中实现生成Maven依赖关系图

    这篇文章主要介绍了在IDEA中实现生成Maven依赖关系图方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java二叉树面试题详解

    java二叉树面试题详解

    下面小编就为大家带来一篇java二叉树的几道面试题详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-07-07
  • java合并多个文件的两种方法

    java合并多个文件的两种方法

    这篇文章主要为大家详细介绍了java合并多个文件的两种方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • java 实现Comparable接口排序,升序、降序、倒叙

    java 实现Comparable接口排序,升序、降序、倒叙

    这篇文章主要介绍了java 实现Comparable接口排序,升序、降序、倒叙,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Centos6.5下Jdk+Tomcat+Mysql环境安装图文教程

    Centos6.5下Jdk+Tomcat+Mysql环境安装图文教程

    这篇文章主要为大家详细介绍了Centos6.5系统下Jdk+Tomcat+Mysql环境安装过程,感兴趣的小伙伴们可以参考一下
    2016-05-05

最新评论