SpringMVC与SpringBoot响应请求的流程

news2024/11/18 5:38:40

SpringMVC是基于Servlet的MVC模型,Model:一个或多个javabean对象,用于存储数据和业务逻辑;View:一个或多个jsp页面,拿到控制器提交的数据为模型提供数据显示;Controller:一个或多个servlet对象,根据视图提交的请求进行控制。

 SpringMVC 的执行流程如下。

  1. 用户点击某个请求路径,发起一个 HTTP request 请求,该请求会被提交到 DispatcherServlet(前端控制器);
  2. 由 DispatcherServlet 请求一个或多个 HandlerMapping(处理器映射器),并返回一个执行链(HandlerExecutionChain)。
  3. DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);
  4. HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(常称为 Controller);
  5. Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);
  6. HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
  7. DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;
  8. ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;
  9. DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
  10. 视图负责将结果显示到浏览器(客户端)。

Spring MVC接口

Spring MVC 涉及到的组件有 DispatcherServlet(前端控制器)、HandlerMapping(处理器映射器)、HandlerAdapter(处理器适配器)、Handler(处理器)、ViewResolver(视图解析器)和 View(视图)。下面对各个组件的功能说明如下。

1)DispatcherServlet

DispatcherServlet 是前端控制器,从图 1 可以看出,Spring MVC 的所有请求都要经过 DispatcherServlet 来统一分发。DispatcherServlet 相当于一个转发器或中央处理器,控制整个流程的执行,对各个组件进行统一调度,以降低组件之间的耦合性,有利于组件之间的拓展。

2)HandlerMapping

HandlerMapping 是处理器映射器,其作用是根据请求的 URL 路径,通过注解或者 XML 配置,寻找匹配的处理器(Handler)信息。

3)HandlerAdapter

HandlerAdapter 是处理器适配器,其作用是根据映射器找到的处理器(Handler)信息,按照特定规则执行相关的处理器(Handler)。

4)Handler

Handler 是处理器,和 Java Servlet 扮演的角色一致。其作用是执行相关的请求处理逻辑,并返回相应的数据和视图信息,将其封装至 ModelAndView 对象中。

5)View Resolver

View Resolver 是视图解析器,其作用是进行解析操作,通过 ModelAndView 对象中的 View 信息将逻辑视图名解析成真正的视图 View(如通过一个 JSP 路径返回一个真正的 JSP 页面)。

6)View

View 是视图,其本身是一个接口,实现类支持不同的 View 类型(JSP、FreeMarker、Excel 等)。

以上组件中,需要开发人员进行开发的是处理器(Handler,常称Controller)和视图(View)。通俗的说,要开发处理该请求的具体代码逻辑,以及最终展示给用户的界面。

SpringBoot启动流程:

1、首先从main找到run()方法,在执行run()方法之前new一个SpringApplication对象
2、进入run()方法,创建应用监听器SpringApplicationRunListeners开始监听
3、然后加载SpringBoot配置环境(ConfigurableEnvironment),然后把配置环境(Environment)加入监听对象中
4、然后加载应用上下文(ConfigurableApplicationContext),当做run方法的返回对象
5、最后创建Spring容器,refreshContext(context),实现starter自动化配置和bean的实例化等工作。
容器包含关系:

 

请求处理主要流程
1、过滤器链chain.doFilter之前的执行(过滤器是在Server容器中的,如Tomcat);
2、拦截器链preHandle方法执行;
3、路径映射、参数绑定(参数解析、参数转换、参数校验);
4、Controller的具体方法执行;
5、返回值处理(含信息转换);
6、拦截器链postHandle方法执行;
7、异常解析器处理异常(@ControllerAdvice、自定义异常解析器都在这里执行);
8、视图解析渲染;
9、拦截器链afterCompletion方法执行;
10、过滤器链chain.doFilter之后的执行。


一个完整的SpringBoot请求流程:

1、由前端发起请求

2、根据路径,Springboot会加载相应的Controller进行拦截

3、拦截处理后,跳转到相应的Service处理层

4、跳转到ServiceImplement(service实现类)

5、在执行serviceimplement时会加载Dao层,操作数据库

6、再跳到Dao层实现类

7、执行会跳转到mapper层

8、然后MallMapper会继续找对应的mapper.xml配置文件,之后便会跳转到第4步继续执行,执行完毕后会将结果返回到第1步,然后便会将数据以JSON的形式返回到页面,同时返回状态码,正常则会返回200,便会回到步骤1中查询判断。如果判断正常。前端根据数据遍历显示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【消息中间件】RabbitMQ的工作模式

前 言 🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 ☕专栏简介:深入、全面、系统的介绍消息中间件 🌰 文章简介:本文将介绍RabbitMQ的工作模式 &#x1f353…

cubeIDE开发, stm32的CRC计算CubeMX配置及HAL库底层实现分析

一、stm32的CRC 1.1 CRC的简介及MCU关联说明 STM32的CRC(Cyclic Redundancy Check,循环冗余校验)计算单元使用一个固定的多项式发生器,从一个32位的数据字产生一个CRC码。在业务开发应用中,会基于CRC的技术用于验证数据传输或存储完整性。在E…

【python基础_05】面向对象1_对象和类、魔术方法

文章目录1. 类和对象1.1 使用对象组织数据的模版1.2 成员变量和成员方法1.3 实现代码2. 内置方法(魔术方法)2.1 构造方法: __init__()2.2 __call__()2.3 __len__()2.3 __str__()2.4 __getitem__()2.5 __setitem__()2.6 __delitem__()2.7 __lt…

【从零开始学习深度学习】35. 门控循环神经网络之门控循环单元(gated recurrent unit,GRU)介绍、Pytorch实现GRU并进行训练预测

在循环神经网络中,当时间步数较大或者时间步较小时,循环神经网络的梯度较容易出现衰减或爆炸。上一篇文章中介绍的裁剪梯度可以应对梯度爆炸,但无法解决梯度衰减的问题。因此,循环神经网络在实际中较难捕捉时间序列中时间步距离较…

Elastic-Job分布式任务调度(1):概述

1 什么是任务调度 我们可以先思考一下下面业务场景的解决方案: 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。某银行系统需要在信用卡到期还款日的前三天进行短信提醒。某财务系统需要在每天凌晨0:10结算前一天的财务数据…

【自学Python】Linux安装Python

Linux安装Python Python下载 Python下载地址 https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xzPython下载 我们在 Linux 终端中,直接使用 wget 命令,下载 Linux 版 Python 的安装包,我们在终端输入以下命令: wg…

PAT乙级|1094 谷歌的招聘

题源https://pintia.cn/problem-sets/994805260223102976/exam/problems/1071785997033074688 提交1:一个用例没过 提交2:AC 错因:输出需为字符串,例如在 200236 中找 4 位素数,解是0023 关键:第33行代码…

linphone android sdk 源码下载编译

前言 前面的有写过Android 使用Linphone SDK开发SIP客户端相关的文章, 在后续的开发过程中, 为了更深入了解linphone, 便尝试下载SDK源码自行编译. 关于linphone这里不作过多介绍, 可以参考前面的文章. Linphone-SDK 是一个将 Liblinphone 及其依赖项捆绑为 git 子模块的项目&a…

HTC FOCUS3在PC端串流FOHEART H1数据手套(手柄)

本教程介绍使用FOHEART H1数据手套与HTC手柄驱动VR中的虚拟手运动,实现手部的追踪及定位。 本教程内容与之前使用腕带定位(HTC FOCUS3在PC端串流FOHEART H1数据手套(腕带))不同,这次我们使用头显中自带的…

【Kuangbin简单DP】挤奶时间

4561. 挤奶时间 - AcWing题库 题意: 思路: 一开始的思路是把这么多的区间当作物品,然后选与不选,这样去搞线性DP 显然是不行的,因为这样答案就不知道怎么统计了 而且,我们是设阶段!&#xf…

HSK汉语考试变革,您需要了解以下几点

2023年HSK考试可能有哪些变化汉语考试难度增加了还是减低了? 对现在的课程和教材有影响? 汉语老师怎么样应对?HSK考试变化猜想1.HSK3级考试和HSKK初级结合在一起 2.HSK4级考试和HSKK中级结合在一起 3.HSK5,6级考试和HSKK高级结合在一起HSKK考…

INTERSPEECH 2022|面向零样本声音克隆的内容相关细粒度说话人表征方法

本文由清华大学与腾讯 AI Lab、香港中文大学合作。 零样本说话人自适应(zero-shot speaker adaptation),或称为零样本声音克隆,旨在根据任意一条参考语音(reference speech)合成训练过程中从未见过的说话人…

Leetcode:239. 滑动窗口最大值(C++)

目录 问题描述: 实现代码和解析: 暴力法(会超时): 原理思路: 单调队列法: 原理思路: 单调队列: 模拟过程: 问题描述: 给你一个整数数组…

Python基础知识(二)

目录 顺序语句 条件语句 条件语句书写格式一及对比:if条件语句 条件语句书写格式二及对比:if...else...语句 条件语句书写格式三及对比:if...elif...else语句 空语句pass 条件语句的总结: 循环语句 while循环 与c/java/…

对于Muduo主从Reactor模式的理解

从12月20号开始看Muduo网络库,到28号的时候弄懂了EventLoop, Poller, Channel是怎么一回事,一番琢磨之后觉得还是应该发到博客上跟大家分享,特此记录。 对照linyacool那个webserver的实现,再看了一遍muduo的EventLoop, Poller ,C…

IDEA快速启动多个微服务模块 -idea如何开启Run DashBoard

文章目录 缘起 Run DashBoard面板如何开启开启 Run DashBoard 注意: 缘起 在idea里面如果需要启动多个项目的话,尤其是是比如微服务项目,动辄要启动五六个七八个应用,如果通过右上角那边启动会很不方便,你需要选择…

基于GIS简单处理世界土壤数据库(HWSD)的中国土壤数据集

来源:GIS前沿 一、 数据介绍 土壤属性表主要字段包括(图1):详细描述请参考Harmonized World Soil Database (version 1.1).pdf文件,其中以T开头的土壤属性表示土壤上层的属性(0-30cm)&#xff…

【曲线全局逼近】

曲线全局逼近 本文是基于 这篇文章 翻译而来的,仅学习。 在插值中,插值曲线以给定的顺序通过所有给定的数据点。正如在全局插值页面中所讨论的,插值曲线可能会在所有数据点上摆动,而不是紧紧跟随数据多边形。为了克服这个问题&…

包装类的使用

文章目录一、单元测试方法的使用步骤二、包装类的使用基本数据类型、包装类、String类型之间的相互转化基本数据类型——>包装类注意包装类——>基本数据类型自动装箱与自动拆箱(jdk5.0后)基本数据类型、包装类——>String类型String类型——&g…

史上最全 Appium 自动化测试从基础到框架实战精华学习笔记(一)

1080402 31.8 KB 对测试人来说,Appium 是非常重要的一个开源跨平台自动化测试工具,它允许测试人员在不同的平台(iOS、Android 等)使用同一套 API 来写自动化测试脚本,这样可大幅提升代码复用率和工作效率。 本文汇总了…