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

Spring MVC 核心工作流程

1. 流程起点:用户发起请求

  • 角色:用户(浏览器/客户端)
  • 动作:发送 HTTP 请求(如访问 http://xxx/user/list ),请求先到达 DispatcherServlet(Spring MVC 入口)。

2. 核心调度:DispatcherServlet(前端控制器)

作为 Spring MVC 的“总调度”,是所有请求的入口,负责协调后续所有组件:

  • 职责:接收请求 → 调用其他组件处理 → 组装响应返回。

3. 找处理器:HandlerMapping(处理器映射器)

  • 作用:根据请求的 URL,查找对应的 Handler(处理器,通常是 Controller 的方法)
  • 细节:还会关联 HandlerInterceptor(处理器拦截器),形成 HandlerExecutionChain(包含拦截器 + 处理器),用于在请求前后做增强(如日志、权限校验 )。

4. 执行处理器:Handler + HandlerAdapter(处理器适配器)

  • Handler:即实际处理请求的业务逻辑(如 UserController 的某个方法 ),可理解为“谁处理这个请求”。
  • HandlerAdapter:“适配器”,因为 Handler 有多种实现方式(如注解式、实现接口等 ),Adapter 负责适配调用,让框架能统一执行不同类型的 Handler。
  • 执行结果:返回 ModelAndView(包含数据 Model + 视图名 View ),也可能直接返回数据(如 REST 接口用 @ResponseBody )。

5. 解析视图:ViewResolver(视图解析器)

  • 作用:根据 ModelAndView 中的视图名,解析出实际的 View(视图对象,如 JSP、Thymeleaf 模板 )
  • 细节:拼接视图路径(如配置前缀 /WEB-INF/views/ + 视图名 userList + 后缀 .jsp ),找到最终要渲染的视图文件。

6. 渲染视图:View(视图)

  • 职责:结合 Model 中的数据(如用户列表、提示消息 ),渲染出完整的页面(HTML)。
  • 输出:生成的响应内容(HTML/JSON 等)通过 DispatcherServlet 返回给用户。

7. 流程闭环:返回响应

  • 结果:用户收到最终响应(如网页、接口数据 ),流程结束。

关键设计思想

  • 职责分离:每个组件只做一件事(DispatcherServlet 调度、Handler 处理业务、View 渲染…),符合“单一职责”。
  • 可扩展:通过适配器(HandlerAdapter)、拦截器(HandlerInterceptor)等,轻松扩展功能(如添加日志、校验 )。
  • 解耦:组件间通过接口交互(如 HandlerMapping 不直接依赖 Controller 实现 ),降低代码耦合度。

简单总结流程:
用户请求 → DispatcherServlet 接收 → HandlerMapping 找处理器 → HandlerAdapter 执行 Handler → 返回 ModelAndView → ViewResolver 解析视图 → View 渲染 → 响应给用户

Spring MVC 核心工作流程

http://www.lryc.cn/news/594680.html

相关文章:

  • 二、SpringBoot-REST开发
  • OSS文件上传(三):断点续传
  • CentOS 系统上部署一个简单的 Web 应用程序
  • Git上传与下载GitHub仓库
  • 计算机网络:概述层---计算机网络的性能指标
  • FastMCP全篇教程以及解决400 Bad Request和session termination的问题
  • 网络服务(第三次作业)
  • 果园里的温柔之手:Deepoc具身智能如何重塑采摘机器人的“生命感知”
  • GoLand安装指南
  • QT6 源,七章对话框与多窗体(5) 文件对话框 QFileDialog 篇二:源码带注释
  • Android 默认图库播放视频没有自动循环功能,如何添加2
  • 文远知行推出与联想共研的100%车规级HPC 3.0计算平台
  • SpringDoc 基本使用指南
  • Boost库智能指针boost::shared_ptr详解和常用场景使用错误示例以及解决方法
  • 如何防止QQ浏览器录屏,盗录视频资源?
  • Pytorch02:深度学习基础示例——猫狗识别
  • MySQL(05) mysql锁,MVCC、Innodb行锁
  • 网络协议与层次对应表
  • Spring Boot 集成 RabbitMQ:普通队列、延迟队列与死信队列全解析
  • 我的网页聊天室设计
  • Python100个库分享第38个—lxml(爬虫篇)
  • sky-take-out项目中Redis的使用
  • 【Linux】Prometheus 监控 Kafka 集群
  • 基于大数据的旅游推荐系统 Python+Django+Hive+Vue.js
  • 关于 URL 中 “+“ 号变成空格的问题
  • 机器学习对词法分析、句法分析、浅层语义分析的积极影响
  • 人工智能真的能编程吗?研究勾勒出自主软件工程的障碍
  • [Python] -项目实战10- 用 Python 自动化批量重命名文件
  • 识别并计算滑块距离
  • 远程登录服务器黑屏如何处理?