当前位置: 首页 > backend >正文

SpringMVC执行流程

SpringMVC的执行流程是一个基于前端控制器模式的请求处理机制,核心围绕DispatcherServlet展开,以下是详细步骤和关键组件的说明:


1. 用户发起请求

  • 用户通过浏览器或其他客户端发送HTTP请求到服务器(例如:GET /user/list)。
  • 请求首先被Servlet容器(如Tomcat)接收,并转发给DispatcherServlet(前端控制器)。

2. DispatcherServlet接收请求

  • DispatcherServlet是SpringMVC的核心组件,所有请求首先到达这里。
  • 它不直接处理业务逻辑,而是作为协调者,调用其他组件完成请求处理。

3. 请求映射(HandlerMapping)

  • HandlerMapping(处理器映射器)根据请求的URL、HTTP方法等信息,找到匹配的处理器(Handler)
    • Handler通常是Controller类中的方法(通过@RequestMapping@GetMapping等注解定义)。
    • 示例:/user/list可能映射到UserControllerlistUsers()方法。
  • HandlerMapping返回一个HandlerExecutionChain对象,包含:
    • 目标处理器(Handler):具体的Controller方法。
    • 拦截器(Interceptor):配置的拦截器链(如登录校验、日志记录)。

4. 拦截器预处理(Interceptor preHandle)

  • 执行HandlerExecutionChain中所有拦截器的preHandle()方法。
    • 如果某个拦截器返回false,流程终止并直接返回响应(如未登录用户被拦截)。
    • 如果全部拦截器返回true,继续后续处理。

5. 处理器适配与执行(HandlerAdapter)

  • HandlerAdapter(处理器适配器)负责调用目标处理器(Controller方法),具体任务包括:
    • 参数绑定:将HTTP请求参数转换为方法参数(如@RequestParam@RequestBody@PathVariable)。
    • 数据转换/格式化:例如字符串转日期、数字类型。
    • 数据验证:通过@Valid触发校验(如Hibernate Validator)。
    • 执行处理器:调用Controller方法,执行业务逻辑(如查询数据库)。

6. 处理器返回结果

  • 传统MVC场景
    • Controller方法返回ModelAndView对象,包含:
      • Model:模型数据(如用户列表)。
      • View:视图名称(如userList)。
  • 前后端分离场景
    • Controller方法直接返回数据对象(如Java对象),配合@ResponseBody@RestController
    • HttpMessageConverter(如MappingJackson2HttpMessageConverter)将对象序列化为JSON/XML,直接写入响应。

7. 视图解析(ViewResolver)

  • 传统MVC场景
    • ViewResolver(视图解析器)根据ModelAndView中的视图名称(如userList),解析出具体的View对象(如JSP、Thymeleaf模板)。
    • 视图渲染View对象将模型数据填充到模板中,生成HTML响应内容。
  • 前后端分离场景
    • 跳过视图解析步骤,直接返回JSON/XML数据。

8. 拦截器后处理(Interceptor postHandle)

  • 执行拦截器的postHandle()方法(仅对传统MVC有效)。
    • 可以修改ModelAndView对象(如添加公共数据)。
    • 不影响前后端分离场景。

9. 最终响应与资源清理

  • 响应返回
    • 渲染后的HTML内容或JSON/XML数据通过DispatcherServlet返回给客户端。
  • 拦截器收尾
    • 无论请求成功或异常,执行拦截器的afterCompletion()方法,进行资源清理(如关闭数据库连接)。

10. 异常处理

  • 异常解析器(HandlerExceptionResolver)
    • 如果在流程中发生异常,HandlerExceptionResolver会捕获并处理异常。
    • 根据异常类型返回相应的错误页面或JSON响应(如@ExceptionHandler@ControllerAdvice)。

关键组件总结

组件作用
DispatcherServlet前端控制器,协调整个流程。
HandlerMapping根据URL映射到对应的Controller方法。
HandlerAdapter适配不同类型的Handler,执行Controller方法并处理参数/返回值。
ModelAndView传统MVC中包含模型数据和视图名称的对象。
ViewResolver解析视图名称,找到具体的视图实现(如JSP、Thymeleaf)。
Interceptor拦截请求,执行预处理、后处理和资源清理(如登录校验、日志记录)。
HttpMessageConverter前后端分离场景中,将Java对象序列化为JSON/XML并写入响应。

示例流程(传统MVC)

假设用户访问/user/list

  1. DispatcherServlet接收请求。
  2. HandlerMapping找到UserControllerlistUsers()方法。
  3. HandlerAdapter调用listUsers(),执行业务逻辑,返回包含用户列表和视图名userListModelAndView
  4. ViewResolver解析userList,找到对应的JSP页面。
  5. 视图渲染:将用户列表填充到JSP中,生成HTML响应。
  6. 响应返回:浏览器显示用户列表。

前后端分离差异

  • 直接返回JSON:Controller方法返回数据对象,HttpMessageConverter序列化为JSON。
  • 跳过视图解析:无需ViewResolver和视图渲染步骤。
  • 典型注解@RestController@ResponseBody

总结

SpringMVC的执行流程通过分层设计组件解耦实现了高度灵活性和可扩展性:

  • 前端控制器模式统一管理请求分发。
  • 拦截器支持通用逻辑的复用(如权限校验)。
  • 适配器模式兼容不同类型的Controller。
  • 前后端分离与传统MVC无缝切换,适应现代开发需求。

http://www.xdnf.cn/news/12562.html

相关文章:

  • 前端关于position: sticky
  • 智能心理医疗助手开发实践:从技术架构到人文关怀——CangjieMagic情感医疗应用技术实践
  • Halcon提取车牌字符
  • 燃气经营从业人员考试知识点总结
  • 从以物换物到DeFi:交易的演变与Arbitrum的DeFi生态
  • Java开发过程中,trycatch异常处理的避坑梳理
  • k8s安装ingress-nginx
  • CC7利用链深度解析
  • Python | Windows11通过离线方式安装pyserial
  • 若依框架页面缓存查询条件后,切换页面想重新请求一下数据
  • 单芯片电流采用电路分享
  • SEO长尾关键词实战优化指南
  • 【2025最新】Miniconda3下载保姆级安装教程(附官方下载链接)
  • 计算机组成原理知识点汇总(六)总结:十六个核心问题
  • Day14
  • PL/SQLDeveloper中数值类型字段查询后显示为科学计数法的处理方式
  • 《深度剖析:Java利用ONNX Runtime部署ViT模型的关键路径》
  • 龙虎榜——20250606
  • JUC并发—volatile和synchronized原理(二)
  • leetcode sql50题
  • placeholder不显示and模板字符串无效
  • JeecgBoot低代码管理平台
  • 软考 系统架构设计师系列知识点之杂项集萃(83)
  • 1、cpp实现Python的print函数
  • 构建 MCP 服务器:第 4 部分 — 创建工具
  • 【人工智能】一些基本概念
  • 虹科方案 | 高效集成!CAN/CAN FD通信与数字信号控制一体化
  • 流量治理:熔断 vs 限流的协同防御体系构建‌
  • AI Infra运维实践:DeepSeek部署运维中的软硬结合
  • 应用宝和苹果App Store上架条件、审核规则及操作流程文档