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

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无缝切换,适应现代开发需求。

相关文章:

  • Odoo 19 路线图(新功能)
  • C语言字符数组输入输出方法大全(附带实例)
  • Python训练day40
  • API标准的本质与演进:从 REST 架构到 AI 服务集成
  • DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
  • 双碳时代,能源调度的难题正从“发电侧”转向“企业侧”
  • LeetCode--23.合并k个升序链表
  • 【计算机网络】非阻塞IO——select实现多路转接
  • 量化面试绿皮书:5. 扑克牌游戏概率与期望值
  • Redis哨兵
  • 【C】-数据类型及存储空间长度
  • 使用python把json数据追加进文件,然后每次读取时,读取第一行并删除
  • 【时时三省】(C语言基础)局部变量和全局变量
  • 12.6Swing控件4 JSplitPane JTabbedPane
  • C++ if语句完全指南:从基础到工程实践
  • ​​TLV4062-Q1​​、TLV4082-Q1​​迟滞电压比较器应用笔记
  • 如何用 HTML 展示计算机代码
  • 11-Oracle 23ai Vector Embbeding和ONNX
  • 大模型编程助手-Cline
  • 深入Java8-日期时间API:TemporalAdjusters、TemporalAdjuster类
  • 网站建设销售一个月开几个单/seo有哪些优化工具
  • 网站推广方法的费用/点点站长工具
  • 网上商城代码/seo优化的价格
  • 旅游网站建设报价单/百度推广是什么意思
  • 湘西州住房和城乡建设局网站/济南网站建设方案
  • 中山做网站排名/中国新闻最新消息今天