SpringMVC执行流程

1. 用户发起请求
  • HTTP 请求:用户通过浏览器或客户端发送请求到服务器(如 http://example.com/app/user/1)。

2. DispatcherServlet 接收请求
  • 前端控制器:所有请求首先被 DispatcherServlet(前端控制器)拦截。
    • DispatcherServlet 是 Spring MVC 的核心,继承自 HttpServlet,负责统一调度。
    • 初始化时加载 HandlerMappingHandlerAdapterViewResolver 等组件。

3. 确定处理器(Handler)​
  • HandlerMappingDispatcherServlet 查询所有 HandlerMapping 实现,找到匹配当前请求的处理器(HandlerExecutionChain)。
    • 默认实现RequestMappingHandlerMapping(处理 @RequestMapping 注解)。
    • 处理器链:包含目标 Controller 方法及相关的拦截器(Interceptor)。

4. 执行拦截器(Interceptor)的 preHandle 方法
  • 拦截器前置处理:按顺序调用所有拦截器的 preHandle() 方法。
    • 返回值:若某个拦截器返回 false,流程终止,直接返回响应。
    • 典型用途:权限检查、日志记录。

5. 调用处理器适配器(HandlerAdapter)​
  • HandlerAdapterDispatcherServlet 通过 HandlerAdapter 执行具体的处理器(Controller 方法)。
    • 默认实现RequestMappingHandlerAdapter(处理 @Controller 和 @RequestMapping)。
    • 参数解析:使用 HandlerMethodArgumentResolver 解析方法参数(如 @RequestParam@PathVariable)。
    • 数据绑定与验证:处理 @Valid 注解,执行数据校验。

6. 执行 Controller 方法
  • 业务处理:Controller 方法处理请求,返回结果。
    • 返回类型:可能是 ModelAndView、视图名称(String)、@ResponseBody 注解的响应体或 ResponseEntity

7. 处理返回结果
  • 结果处理HandlerAdapter 处理 Controller 方法的返回值。
    • 视图渲染:若返回 ModelAndView 或视图名称,进入视图解析流程。
    • 直接响应:若返回 @ResponseBody 或 ResponseEntity,跳过视图解析,直接通过 HttpMessageConverter 转换数据格式(如 JSON)。

8. 执行拦截器的 postHandle 方法
  • 拦截器后置处理:按倒序调用拦截器的 postHandle() 方法。
    • 典型用途:修改模型数据或视图。

9. 视图解析与渲染
  • ViewResolver:将逻辑视图名解析为具体视图(如 JSP、Thymeleaf)。
    • 默认实现InternalResourceViewResolver(解析 JSP)。
  • 视图渲染:将模型数据填充到视图中,生成 HTML 或其他格式的响应内容。

10. 执行拦截器的 afterCompletion 方法
  • 请求完成处理:所有拦截器的 afterCompletion() 方法被调用(无论成功或异常)。
    • 典型用途:资源清理、性能监控。

11. 返回响应
  • HTTP 响应:生成的响应内容通过 DispatcherServlet 返回给客户端。

异常处理流程

  • HandlerExceptionResolver:若处理过程中抛出异常,由该组件捕获并处理。
    • 常用实现
      • ExceptionHandlerExceptionResolver(处理 @ExceptionHandler 注解)。
      • ResponseStatusExceptionResolver(处理 @ResponseStatus 注解)。
      • DefaultHandlerExceptionResolver(处理标准 Spring 异常)。
  • 全局异常处理:通过 @ControllerAdvice 类集中处理异常。

关键组件总结

组件职责
DispatcherServlet前端控制器,统一调度请求处理流程。
HandlerMapping映射请求到处理器(Controller 方法)。
HandlerAdapter执行处理器方法,处理参数解析和数据绑定。
ViewResolver解析逻辑视图名到具体视图实现。
HandlerInterceptor拦截请求,在处理器执行前后插入逻辑。
HttpMessageConverter转换请求/响应数据(如 JSON ↔ Java 对象)。
HandlerExceptionResolver统一处理异常,返回友好错误响应。

执行流程图解

HTTP Request
    ↓
DispatcherServlet
    ↓
HandlerMapping → HandlerExecutionChain(Handler + Interceptors)
    ↓
Interceptor.preHandle()
    ↓
HandlerAdapter.handle() → Controller Method
    ↓
Interceptor.postHandle()
    ↓
ViewResolver.resolveViewName() → View
    ↓
View.render()
    ↓
Interceptor.afterCompletion()
    ↓
HTTP Response

示例场景:获取用户信息

  1. 请求GET /user/1
  2. DispatcherServlet 接收请求,查询 HandlerMapping
  3. 匹配到 UserController 的 getUser(@PathVariable Long id) 方法。
  4. 拦截器检查权限(preHandle)。
  5. HandlerAdapter 解析 id=1,调用 getUser 方法。
  6. Controller 返回 User 对象(@ResponseBody)。
  7. HttpMessageConverter 将 User 转为 JSON。
  8. 拦截器记录日志(postHandle)。
  9. 返回 JSON 响应 {"id":1, "name":"Alice"}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值