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

SpringMVC的工作流程

一、简介:

MVC:是一种架构模式,将业务逻辑和页面展示分离,使程序分层、分工合作,既相互独立,又协同合作。

MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范

Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或 JavaBean组件,不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。

View(视图):负责进行模型的展示,将逻辑视图解析成物理视图并渲染。

Controller(控制器):接收用户请求,委托给模型进行处理,处理完毕后把返回的模型数据返回给视图,由视图负责展示。起调度作用。

二、流程图

1. 请求到达:客户端发起一个HTTP请求到服务器,请求被Spring MVC的前端控制器DispatcherServlet拦截。
2. 查找处理器:DispatcherServlet接收到请求后,会查询HandlerMapping处理器映射器来确定请求应该由哪个控制器(Controller)来处理。处理器映射器会根据请求的URL路径找到与之匹配的处理器。
3. 处理器适配与执行:找到合适的处理器后,DispatcherServlet会将请求传递给HandlerAdapter处理器适配器。处理器适配器负责调用控制器中的具体方法来处理请求,并处理方法的返回值。
4. 模型数据准备:控制器在处理请求时,可能会操作模型数据(Model),这些数据会被封装到一个对象中,并通过ModelAndView对象传给视图解析器。同时,控制器会指定逻辑视图名,指示下一步应呈现哪个视图。
5. 视图解析:DispatcherServlet根据ModelAndView中的视图名,通过ViewResolver视图解析器找到实际的视图对象(如JSP页面)。视图解析器会将逻辑视图名转换成实际的视图对象。
6. 渲染视图:视图对象负责渲染模型数据,即将模型数据填充到响应页面中。这个过程中,视图可能需要访问之前存入模型中的数据。
7. 响应客户端:最终,填充好的视图(通常是HTML页面)作为HTTP响应体的一部分,由DispatcherServlet发送回客户端,完成整个请求处理流程。 

三、SpringMVC核心组件

SpringMVC框架的核心组件主要包括以下五个部分:
1. DispatcherServlet(前端控制器):
        作为整个Spring MVC应用的入口点,负责接收HTTP请求并响应。
        分发请求到具体的处理器(Controller)。
        联合其他组件协同工作,完成请求的处理流程。
2. HandlerMapping(处理器映射器):
        负责将接收到的请求映射到具体的处理器(Controller的处理方法)。
        支持不同的映射策略,如基于URL路径、注解等。
3. HandlerAdapter(处理器适配器):
        用于调用处理器(Controller方法)并处理其返回的结果。
        适配不同类型的处理器,使得DispatcherServlet能与各种类型的控制器协同工作。
4. ViewResolver(视图解析器):
        根据逻辑视图名解析出实际的视图对象(如JSP、Thymeleaf模板等)。
        将模型数据传递给视图,准备渲染。
5. Controller(控制器):
        实现业务逻辑,处理来自用户的请求。
        负责向模型添加属性,并决定视图名称(或直接返回视图)。

 参考:SpringMVC工作流程 — 详解-腾讯云开发者社区-腾讯云 (tencent.com)

相关文章:

  • 编程App软件优化是什么
  • 【知识点】std::thread::detach std::lock_guard std::unique_lock
  • 【CT】LeetCode手撕—121. 买卖股票的最佳时机
  • 在不使用js在情况下只用css实现瀑布流效果
  • 速盾:cdn加速怎么计费?
  • 二刷算法训练营Day29 | 回溯算法(5/6)
  • SortTable.js + vxe-table 实现多条批量排序
  • 第 4 章:从 Spring Framework 到 Spring Boot
  • PyCharm设置不默认打开上次的项目
  • Android 调用系统相册、系统相机拍照
  • MyBatis进行模糊查询时SQL语句拼接引起的异常问题
  • kubeadm快速部署K8S
  • 长亭雷池部署
  • 【云岚到家】-day03-1-门户等缓存方案选择
  • Django DetailView视图
  • CSS 三角实现
  • dva中组件的懒加载
  • js数组之filter
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • SegmentFault 2015 Top Rank
  • sessionStorage和localStorage
  • Spring核心 Bean的高级装配
  • vue数据传递--我有特殊的实现技巧
  • 从setTimeout-setInterval看JS线程
  • 力扣(LeetCode)56
  • 前端存储 - localStorage
  • 前端临床手札——文件上传
  • 前端路由实现-history
  • 前端学习笔记之观察者模式
  • 入手阿里云新服务器的部署NODE
  • 删除表内多余的重复数据
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​io --- 处理流的核心工具​
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #### go map 底层结构 ####
  • #pragma 指令
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $().each和$.each的区别
  • (12)Hive调优——count distinct去重优化
  • (13)Hive调优——动态分区导致的小文件问题
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2)空速传感器
  • (6)设计一个TimeMap
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .Net CoreRabbitMQ消息存储可靠机制
  • .Net Memory Profiler的使用举例
  • .NET 中让 Task 支持带超时的异步等待
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .NET中两种OCR方式对比
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • @angular/cli项目构建--Dynamic.Form