一、SpringMVC执行流程一览

二、Spring MVC执行流程概述

2-1、流程详解

Spring MVC采用前端控制器模式,核心流程如下:

1. 请求到达DispatcherServlet

用户发送的HTTP请求首先被DispatcherServlet(前端控制器)拦截。DispatcherServlet是Spring MVC的入口点,所有请求都必须经过它

2. 请求映射到Handler

DispatcherServlet调用HandlerMapping组件来查找能处理该请求的处理器。

HandlerMapping根据请求的URL与配置的映射关系(如@RequestMapping注解)找到对应的Controller方法,返回一个HandlerExecutionChain对象,其中包含了Handler和相关的拦截器。

3. 获取处理器适配器

接着,DispatcherServlet通过HandlerAdapter(处理器适配器)来执行找到的Handler

HandlerAdapter的作用是适配不同类型的处理器,使得DispatcherServlet能够以统一的方式调用各种类型的处理器。

HandlerAdapter中有参数解析器、结果处理器

4. 执行拦截器前置处理

在真正执行Handler之前,会依次执行所有拦截器的preHandle方法

如果某个拦截器的preHandle方法返回false,则请求被中断,不再继续处理。

5. 执行Handler方法

【正常情况】

HandlerAdapter调用真正的处理器方法(Controller中的业务逻辑方法),处理器处理完业务逻辑后返回一个ModelAndView对象

ModelAndView包含了模型数据(Model)和视图名称(View)。

(此时没有抛出异常,正常执行下面的流程)

【异常情况】:

如果Handler方法执行过程中抛出异常,异常会被DispatcherServlet捕获,然后交给HandlerExceptionResolver(异常处理器解析器)处理。

HandlerExceptionResolver会查找使用@ControllerAdvice@ExceptionHandler注解定义的全局异常处理器,根据异常类型找到对应的异常处理方法来处理该异常。

异常处理器会返回一个包含错误信息的ModelAndView对象或直接返回错误响应数据(如JSON格式的错误信息)。

6. 执行拦截器后置处理

处理器方法执行完后(当没有发生异常的时候),会依次执行所有拦截器的postHandle方法

若是发生了异常,则不执行拦截器的postHandle方法。

7. 视图解析

DispatcherServlet将ModelAndView传递给ViewResolver(视图解析器)

ViewResolver根据视图名称解析出具体的View对象。

例如,如果视图名是"user",ViewResolver可能会返回一个JSP文件的View对象;如果是异常情况,可能会解析到错误页面视图。

8. 视图渲染

View对象将Model中的数据(包括错误信息)渲染到视图中,生成最终的HTML内容。

例如,JSP会使用EL表达式或JSTL标签来展示模型中的数据。

9. 执行拦截器完成处理

视图渲染完成后,会执行所有拦截器的afterCompletion方法,进行清理工作

该方法会在所有情况下都被执行,包括正常流程和异常流程,确保资源得到正确释放。

10. 响应返回

最终将渲染好的视图内容作为HTTP响应返回给客户端浏览器。


2-2、核心组件说明

  • DispatcherServlet:前端控制器,核心分发器
  • HandlerMapping:请求映射器,找到处理该请求的Handler
  • HandlerAdapter:处理器适配器,执行Handler
  • HandlerExceptionResolver:异常处理器解析器,处理异常
  • @ControllerAdvice:全局异常处理器标注,统一处理异常
  • @ExceptionHandler:异常处理方法标注,定义具体的异常处理逻辑
  • Controller:控制器,包含业务逻辑处理方法
  • ModelAndView:封装了模型数据和视图信息
  • ViewResolver:视图解析器,根据视图名称解析出View对象
  • View:视图,负责渲染最终的页面
  • Interceptor:拦截器,可在处理前后进行拦截处理

2-3、流程图总结

请求 → DispatcherServlet
      → HandlerMapping查找Handler
      → 获取HandlerAdapter
      → 执行拦截器preHandle
      → 执行Handler方法
          ↓
          ├─ 【正常执行】 → 返回ModelAndView
          |             → 执行拦截器postHandle
          │
          └─ 【抛出异常】 → HandlerExceptionResolver捕获
                        → @ControllerAdvice全局异常处理器处理
                        → 返回错误ModelAndView或错误响应
                        → 拦截器postHandle被跳过 ✗
      → ViewResolver解析视图
      → View渲染数据
      → 执行拦截器afterCompletion(无论异常与否都执行)
      → 响应返回客户端

2-4、代码预览

【错误修改】:

  • postHandle():只有“Controller 正常返回”才会执行。

  • afterCompletion():请求结束时总会执行(包括异常/全局异常处理的场景)。

三、小结

问:SpringMVC 执行流程

答:

总:
使用了 SpringMVC 之后,所有请求都会经过前端控制器 DispatcherServlet,该类提供了一个 doDispatch() 方法。
所有请求处理、拦截器执行、异常处理和结果响应的完整流程都在此方法中完成。


分:

首先,借助 HandlerMapping 将请求映射到对应的HandlerExecutionChain(处理器执行链)
其中封装了目标 HandlerMethod(代表 Controller 的方法)以及要执行的拦截器列表。

接下来,根据 HandlerMethod 获取相应的 HandlerAdapter(处理器适配器),
适配器中封装了参数解析器、返回值处理器等组件。

然后,执行拦截器的 preHandle() 方法。
如果任意一个拦截器返回 false,请求会被中断,后续的 Controller 与其他拦截器将不再执行。


接下来是核心步骤:
通过 HandlerAdapter 调用目标 Controller 方法(ha.handle())。
此过程中会先通过参数解析器为方法参数赋值,再执行控制器逻辑。

  • 若 Controller 正常返回结果,会调用拦截器的 postHandle() 方法。

  • 若 Controller 抛出异常,则跳过 postHandle(),进入异常处理阶段。


然后进入 结果处理阶段

  • 若请求出现异常,则调用异常处理逻辑(包括全局异常处理器 @ControllerAdvice),
    生成对应的 ModelAndView 或响应体;

  • 若正常返回结果,则交由 视图解析器 ViewResolver解析视图并进行渲染;

  • 无论是否出现异常,最后都会执行拦截器的 afterCompletion() 方法,用于资源清理与日志记录。


最终总结顺序:

1️⃣ 获取 HandlerExecutionChain(包含目标方法与拦截器)
2️⃣ 调用每个拦截器的 preHandle()
3️⃣ 执行 Controller(HandlerMethod)
     ├─ 正常返回 → 执行 postHandle()
     └─ 抛出异常 → 进入异常处理(全局异常处理器)
4️⃣ 渲染视图(ViewResolver)
5️⃣ 执行 afterCompletion()(无论是否异常都会执行)