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

消息转换器在SpringMVC执行流程

消息转换器的工作机制

内部工作流程
  1. 读取(Read)操作

    • 当接收到一个包含实体内容的HTTP请求时,Spring MVC会根据请求头中的Content-Type属性来确定应该使用哪个HttpMessageConverter来解析请求体。
    • DispatcherServlet会遍历已注册的HttpMessageConverter列表,寻找支持该Content-Type的转换器。
    • 一旦找到匹配的转换器,它将调用readInternal()方法,将输入流中的数据转换成Java对象,并将其作为控制器方法的参数传递。
  2. 写入(Write)操作

    • 在响应阶段,如果控制器方法返回了一个对象(例如通过@ResponseBodyResponseEntity),Spring MVC会根据客户端请求头中的Accept属性选择最合适的HttpMessageConverter
    • 它再次遍历HttpMessageConverter列表,这次是基于Accept头来决定哪个转换器最适合用于序列化返回的对象。
    • 找到匹配的转换器后,它会调用writeInternal()方法,将Java对象转换为输出流格式的数据,并设置响应的内容类型。
  3. 优先级规则

    • 如果有多个HttpMessageConverter都能处理相同的媒体类型,Spring MVC会根据它们的优先级来选择最合适的一个。优先级通常由实现类自身定义,也可以通过配置调整。
  4. 支持的内容类型

    • 每个HttpMessageConverter都声明了它能够处理的一组媒体类型(MIME types)。例如,MappingJackson2HttpMessageConverter通常支持application/json,而Jaxb2RootElementHttpMessageConverter则可能支持application/xml等。
    • 这意味着只有当请求或响应的Content-TypeAccept头与某个转换器支持的媒体类型相匹配时,该转换器才会被选中进行实际的数据转换工作。
数据绑定与校验
  • 数据绑定:Spring MVC框架可以自动地将HTTP请求中的查询参数、路径变量以及表单字段绑定到控制器方法的参数上。对于复杂的对象结构,如JSON或XML格式的数据,则需要HttpMessageConverter来进行反序列化。

  • 校验:如果控制器方法参数上有@Valid@Validated注解,Spring会调用校验框架(如Hibernate Validator)对传入的对象进行验证。如果校验失败,可以抛出异常或者返回错误信息给客户端。

配置HttpMessageConverter

开发者可以通过多种方式配置HttpMessageConverter

  • 全局配置:在Spring Boot应用中,可以在application.propertiesapplication.yml文件中指定默认的HttpMessageConverter设置。例如,你可以调整Jackson库的行为以改变JSON序列化/反序列化的规则。

  • 编程式配置:通过创建一个实现了WebMvcConfigurer接口的配置类,并重写extendMessageConverters方法,你可以添加、移除或自定义HttpMessageConverter实例。

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {// 添加或修改现有的HttpMessageConverterconverters.add(new CustomHttpMessageConverter());}
}
  • 自定义转换器:如果你的应用需要处理非标准的数据格式,你可以编写自己的HttpMessageConverter实现,并将其添加到Spring MVC的转换器列表中。

请求处理流程中的具体运作

以下是更为详细的请求处理流程:

  1. 接收HTTP请求:Web服务器接收到HTTP请求并转发给DispatcherServlet

  2. HandlerMapping选择处理器DispatcherServlet根据URL模式或其他条件查找适当的控制器方法。

  3. 拦截器链预处理:如果有配置拦截器,它们会在请求到达目标处理器之前进行预处理。

  4. 准备调用控制器方法

    • 解析请求参数DispatcherServlet检查是否有任何@RequestBody标注的方法参数。如果是,它会遍历已注册的HttpMessageConverter,寻找能处理当前Content-Type的转换器,并使用它来解析请求体为Java对象。

    • 数据验证:如果存在@Valid@Validated注解,Spring会调用校验框架对传入的对象进行校验。

  5. 调用控制器方法:所有准备工作完成后,DispatcherServlet调用相应的控制器方法。

  6. 处理方法返回值

    • 视图解析:如果控制器方法返回的是视图名称或ModelAndViewViewResolver会负责渲染视图。

    • 响应体转换:对于标记了@ResponseBody的方法,或者是返回了ResponseEntityHttpEntity类型的对象,Spring会再次遍历HttpMessageConverter列表,根据Accept头选择适合的转换器,将返回的对象序列化为HTTP响应体。

  7. 拦截器链后处理:如果有配置拦截器,它们可以在控制器方法执行后进行后处理。

  8. 发送响应DispatcherServlet构建完整的HTTP响应,并发送回客户端。

  9. 结束请求:整个请求-响应周期完成,资源释放,等待下一个请求到来。

HttpMessageConverter示例

接下来,我们将详细展示如何创建和配置一个自定义的消息转换器,用于处理特定的文本格式(假设是CSV格式)。

自定义HttpMessageConverter实现

首先,我们需要创建一个新的类继承自AbstractHttpMessageConverter<T>,其中T是我们想要转换的目标类型。在这个例子中,我们将处理List<String>类型的CSV数据。

import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;public class CsvHttpMessageConverter extends AbstractHttpMessageConverter<List<String>> {public CsvHttpMessageConverter() {super(MediaType.parseMediaType("text/csv"));}@Overrideprotected boolean supports(Class<?> clazz) {return List.class.isAssignableFrom(clazz);}@Overrideprotected List<String> readInternal(Class<? extends List<String>> clazz, HttpInputMessage inputMessage)throws IOException, HttpMessageNotReadableException {try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputMessage.getBody(), "UTF-8"))) {String line;List<String> result = new ArrayList<>();while ((line = reader.readLine()) != null) {result.addAll(List.of(line.split(",")));}return result;}}@Overrideprotected void writeInternal(List<String> t, HttpOutputMessage outputMessage)throws IOException, HttpMessageNotWritableException {try (OutputStreamWriter writer = new OutputStreamWriter(outputMessage.getBody(), "UTF-8")) {for (int i = 0; i < t.size(); i++) {writer.write(t.get(i));if (i < t.size() - 1) {writer.write(",");}}}}
}
注册自定义HttpMessageConverter

然后,我们需要在Spring配置中注册这个自定义的消息转换器。这可以通过实现WebMvcConfigurer接口并在其extendMessageConverters方法中添加我们的转换器来完成。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.List;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new CsvHttpMessageConverter());}
}
使用自定义HttpMessageConverter

最后,我们可以在控制器中使用这个自定义的消息转换器来处理CSV格式的数据。例如:

@RestController
@RequestMapping("/csv")
public class CsvController {@PostMapping(consumes = "text/csv", produces = "text/csv")public ResponseEntity<List<String>> handleCsv(@RequestBody List<String> csvData) {// 处理CSV数据...return ResponseEntity.ok(csvData);}
}

在这个例子中,我们创建了一个名为CsvHttpMessageConverter的类,它可以处理text/csv类型的数据。然后我们在配置类中将这个自定义的转换器添加到了Spring MVC的HttpMessageConverter列表中。通过这种方式,你可以根据应用程序的具体需求定制化消息转换过程,确保你的API能够正确地解析和生成各种格式的数据。

总结

综上所述,HttpMessageConverter在Spring MVC中扮演着至关重要的角色,它使得开发者可以专注于业务逻辑,而无需关心如何从HTTP请求中解析数据或如何构建HTTP响应。通过深入了解其工作机制、配置方法以及如何扩展和自定义转换器,我们可以更好地利用Spring MVC的强大功能来构建高效、灵活的Web应用程序。

相关文章:

消息转换器在SpringMVC执行流程

消息转换器的工作机制 内部工作流程 读取&#xff08;Read&#xff09;操作 当接收到一个包含实体内容的HTTP请求时&#xff0c;Spring MVC会根据请求头中的Content-Type属性来确定应该使用哪个HttpMessageConverter来解析请求体。DispatcherServlet会遍历已注册的HttpMessage…...

7. C语言 运算符详解

本章目录: 前言C语言运算符的分类1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 杂项运算符 运算符优先级 前言 在C语言中&#xff0c;运算符是程序中执行各种操作的核心工具&#xff0c;涉及算术运算、逻辑判断、位操作等多个方面。掌握C语言中的各种运…...

一、准备工作(2):部署TensorFlow和Keras

目录 一、确保已安装 Python 和 pip 二、打开命令行界面并执行安装命令 Windows macOS 和 Linux 三、安装过程中的注意事项 创建虚拟环境 激活虚拟环境 在虚拟环境中安装包 四、验证安装 五、常见问题排查 六、下一步 pip install tensorflow keras 是一个用于在计算…...

Rabbitmq Fanout如何保证不重复消费及应用场景

rabbitmq fanout业务场景&#xff0c;一个交换机对应多个队列&#xff0c;不会重复消费吗 在 RabbitMQ 中&#xff0c;使用 Fanout 类型的交换机时&#xff0c;确实可以将一个交换机绑定到多个队列。每当有消息发布到这个交换机时&#xff0c;交换机会把消息广播到所有绑定的队…...

【Linux系列】使用 `nohup` 命令运行 Python 脚本并保存输出日志的详细解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

基于Python的考研学习系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

多模态大模型文生图和图生文的主要技术

1 图生文 CLIP 该模型架构由图像编码器和文本编码器组成。图像编码器将图像转换为嵌入&#xff08;数字列表&#xff09;&#xff0c;文本编码器将文本转换为嵌入。 这两个编码器在成批的图像-文本对上进行训练&#xff0c;其中文本描述图像。编码器的训练方式如下&#xff1…...

云架构:考量与框架

云架构&#xff1a;考量与框架 引言 在当今的数字化环境中&#xff0c;云计算已成为现代商业运营的基石。一个设计良好的云架构框架为可扩展、安全和弹性的系统奠定了基础。本文将深入探讨云架构的核心要素&#xff0c;讨论重要的考量因素、设计指南&#xff0c;以及最佳实践…...

用uniapp写一个播放视频首页页面代码

效果如下图所示 首页有导航栏&#xff0c;搜索框&#xff0c;和视频列表&#xff0c; 导航栏如下图 搜索框如下图 视频列表如下图 文件目录 视频首页页面代码如下 <template> <view class"video-home"> <!-- 搜索栏 --> <view class…...

开发培训-慧集通(iPaaS)集成平台脚本开发Groovy基础培训视频

‌Groovy‌是一种基于Java虚拟机&#xff08;JVM&#xff09;的敏捷开发语言&#xff0c;结合了Python、Ruby和Smalltalk的许多强大特性。它旨在提高开发者的生产力&#xff0c;通过简洁、熟悉且易于学习的语法&#xff0c;Groovy能够与Java代码无缝集成&#xff0c;并提供强大…...

供需平台信息发布付费查看小程序系统开发方案

供需平台信息发布付费查看小程序系统主要是为了满足个人及企业用户的供需信息发布与匹配需求。 一、目标用户群体 个人用户&#xff1a;寻找兼职工作、二手物品交换、本地服务&#xff08;如家政、维修&#xff09;等。 小微企业&#xff1a;推广产品和服务&#xff0c;寻找合…...

【Qt】如何保证线程安全(以日志写入为例)

前言 在近日学习中发现&#xff0c;如果开发一个单例模式的日志系统&#xff0c;难免会出现多个线程记录日志的情况&#xff0c;这个时候线程可能导致竞争&#xff0c;或者始料未及的情况发生。 通过学习&#xff0c;如果要保证线程安全&#xff0c;要使用互斥锁QMutex&#xf…...

k8s基础(3)—Kubernetes-Deployment

一、 Deployment概述 ‌ Kubernetes Deployment‌是Kubernetes中的一个核心概念&#xff0c;它是一种高级别的控制器&#xff0c;用于管理Pod和ReplicaSet&#xff0c;确保应用程序的高可用性和稳定性。Deployment通过声明式配置来创建和更新Pod和ReplicaSet&#xff0c;从而…...

信息系统管理师试题-人力资源

下列&#xff08; &#xff09;不属于人力资源管理的主要工作内容。 A根据各工作岗位任务的特点和工作要求&#xff0c;预测组织的人力需求 B根据工作需要&#xff0c;选拔出符合组织需要的员工 C对新员工进行工作指导和培训 D为项目团队争取和募集更多资金 答案D 解析&#xf…...

【情感】程序人生之情感关系中的平等意识(如何经营一段长期稳定的关系 沸羊羊舔狗自查表)

【情感】程序人生之情感关系中的平等意识&#xff08;如何经营一段长期稳定的关系 & 沸羊羊舔狗自查表&#xff09; 文章目录 1、情感关系中的平等意识2、如何经营一段长期稳定的关系&#xff08;避免左倾 | 敬畏与担当&#xff09;3、沸羊羊/舔狗自查表&#xff08;避免右…...

pyspark执行group by操作

前情提要 在处理亿级别数据时&#xff0c;常常输入是hive表&#xff0c;因此需要在pypark流程中引入一些场景sql操作&#xff0c;其中group by就是比较常见的操作。 基础步骤 创建SparkSession&#xff1a;通过enableHiveSupport()方法启用Hive支持&#xff0c;确保能够访问…...

小寒时处在二三九,天寒地冻北风吼

今&#xff08;1月5日上午10时33分&#xff09;天迎来了小寒节气&#xff0c;本“人民体验官”推广人民日报官方微博文化产品《小寒来了&#xff01;最冷的时候如何养生防病》&#xff0c;同时科普小寒相关知识。 截图&#xff1a;来源本“人民体验官”推广平台 人民微博告诉我…...

微信小程序校园自助点餐系统实战:从设计到实现

随着移动互联网的发展&#xff0c;越来越多的校园场景开始智能化、自助化。微信小程序凭借其轻量化、便捷性和强大的生态支持&#xff0c;成为了各类校园应用的首选工具之一。今天&#xff0c;我们将通过实际开发一个微信小程序“校园自助点餐系统”来展示如何设计和实现这样一…...

java基础之代理

代理模式&#xff08;Proxy Pattern&#xff09; 简介 是一种结构型设计模式&#xff0c;主要用于为某对象提供一个代理对象&#xff0c;以控制对该对象的访问。通过引入一个代理对象来控制对原对象的访问。代理对象在客户端和目标对象之间充当中介&#xff0c;负责将客户端的…...

uniapp - 基于uniapp+vue3实现自定义增强版table表格组件体验「兼容H5+小程序+App端」

本文提供增强版table表格组件体验,打造跨端表格的新标杆. uv3-table&#xff1a;一款基于uniappvue3跨端自定义手机端增强版表格组件。支持固定表头/列、边框、斑马纹、单选/多选&#xff0c;自定义表头/表体插槽、左右固定列阴影高亮显示。支持编译兼容H5小程序端App端。 提供…...

【Obsidian插件开发】新建窗口时出现多余的空白窗口

问题描述 在打开Edit Task的Modal的时候&#xff0c;有一个多余的空白modal同时也被打开了&#xff0c;并且点右上角的叉号可以把Edit Task窗口也关上。最开始没有这个问题&#xff0c;我给edit task窗口加了css&#xff0c;移动位置之后问题就出现了。 解决方法 我最开始看到…...

springmvc--请求参数的绑定

目录 一、创建项目&#xff0c;pom文件 二、web.xml 三、spring-mvc.xml 四、index.jsp 五、实体类 Address类 User类 六、UserController类 七、请求参数解决中文乱码 八、配置tomcat,然后启动tomcat 1. 2. 3. 4. 九、接收Map类型 1.直接接收Map类型 &#x…...

前缀和与差分专题

领地选择 &#xff08;二维前缀和&#xff09; 作为在虚拟世界里统帅千军万马的领袖&#xff0c;小 Z 认为天时、地利、人和三者是缺一不可的&#xff0c;所以&#xff0c;谨慎地选择首都的位置对于小 Z 来说是非常重要的。 首都被认为是一个占地 CC 的正方形。小 Z 希望你寻…...

Go Ebiten小球弹性碰撞代码示例

Go Ebiten小球弹性碰撞代码示例 我们来编写一个简单的示例程序&#xff0c;在其中实现一个小球在窗口中弹性碰撞的效果。具体来说&#xff0c;当小球碰到窗口的边缘时&#xff0c;它会反弹回来&#xff0c;改变运动方向。我们将使用Ebiten的图形和物理模拟功能来实现这个效果。…...

C++中map和set的封装

一、关于封装过程中传入的模板参数的问题 通过源码中的封装方式进行理解&#xff1a; 1.1map和set中成员变量 set中&#xff1a; template <class Key, class Compare less<Key>, class Alloc alloc> class set { public:typedef Key key_type;typedef Key v…...

dsa introduction 3

空间复杂度一般不会超过时间复杂度。空间复杂度就是申请的空间的数量级别。 减治和分治都是算法策略。都可以用递归和迭代的手段去实现。递归就是函数自己调用自己。一直到递归基之后再返回。递归算法的空间复杂度是递归深度。分治是分别求解子问题&#xff0c;然后由子问题的…...

C++ 日志库 spdlog 使用教程

Spdlog是一个快速、异步、线程安全的C日志库&#xff0c;他可以方便地记录应用程序的运行状态&#xff0c;并提供多种输出格式。官网&#xff1a;https://github.com/gabime/spdlog 安装教程可以参考&#xff1a;https://blog.csdn.net/Harrytsz/article/details/144887297 S…...

Pytorch机器学习——1 深度学习介绍

outline 人工智能、机器学习与深度学习深度学习工具介绍 1. 人工智能、机器学习与深度学习 AI&#xff1a;研究如何能让计算机模拟人类的智能&#xff0c;来实现特定的依赖人类智能才能实现的任务&#xff08;例如学习、语言、识别&#xff09; AI历史&#xff1a; 1818&#x…...

软件工程期末大复习(六)面向对象分析

6.1 软件分析概述 软件分析是软件开发生命周期中的一个关键阶段&#xff0c;它紧随需求收集之后。在这个阶段&#xff0c;分析者的目标是理解用户的需求&#xff0c;并确定系统应该做什么。 需求分析&#xff1a;分析用户的需求&#xff0c;确定系统必须实现的功能。概念性设计…...

科研绘图系列:R语言科研绘图之标记热图(heatmap)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图系统信息参考介绍 科研绘图系列:R语言科研绘图之标记热图(heatmap) 加载R包 library(tidyverse) library(ggplot2) library(reshape)…...

数据挖掘——朴素贝叶斯分类

数据挖掘——朴素贝叶斯分类 朴素贝叶斯分类极大后验假设独立性假设贝叶斯分类器总结 朴素贝叶斯分类 什么是分类&#xff1f; 找出描述和区分数据类或概念的模型&#xff0c;以便能够使用模型预测未知的对象的类标号 概念区分 分类与回归 分类是预测分类&#xff08;离散、…...

Redis数据库笔记—— Hash(哈希)的扩容机制(rehash)

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。详细介绍Hash&#xff08;哈希&#xff09;的扩容机制(rehash)、源码、以及扩容和缩容过程。 文章目录 Redis 字典&#xff08;dict&#xff09;结构源码哈希…...

【Web】软件系统安全赛CachedVisitor——记一次二开工具的经历

明天开始考试周&#xff0c;百无聊赖开了一把CTF&#xff0c;还顺带体验了下二开工具&#xff0c;让无聊的Z3很开心&#x1f642; CachedVisitor这题 大概描述一下&#xff1a;从main.lua加载一段visit.script中被##LUA_START##(.-)##LUA_END##包裹的lua代码 main.lua loca…...

面向对象分析与设计Python版 建模工具UML

文章目录 一、建模与模型二、统一建模语言 一、建模与模型 建模与模型 建模 modeling&#xff1a; 把不太理解的东西和一些已经较为理解、且十分类似的东西做比较&#xff0c;可以对这些不太理解的东西产生更深刻的理解&#xff0c;叫做建模重要的研发成果常常产自类比 模型 …...

Flink系列知识讲解之:深入了解 Flink 的网络协议栈

Flink系列知识之&#xff1a;深入了解 Flink 的网络协议栈 Flink 的网络协议栈是组成 flink-runtime 模块的核心组件之一&#xff0c;也是每个 Flink 任务的核心。它连接着来自所有任务管理器的各个工作单元&#xff08;子任务&#xff09;。这是流数据流过的地方&#xff0c;…...

动态库dll与静态库lib编程4:MFC规则DLL讲解

文章目录 前言一、说明二、具体实现2.1新建项目2.2 模块切换的演示 总结 前言 动态库dll与静态库lib编程4&#xff1a;MFC规则DLL讲解。 一、说明 1.前面介绍的均为Win32DLL&#xff0c;即不使用MFC的DLL。 2.MFC规则DLL的特点&#xff1a;DLL内部可以使用MFC类库、可以被其他…...

TypeScript 后端开发中的热重载编译处理

在一些除了nest框架外的一些其他nodejs框架中没有提供对ts编译和热重载&#xff0c;如果使用typescript我们需要自己进行配置。 方法一&#xff08;推荐&#xff09; 使用bun运行环境&#xff08;快&#xff09;。注&#xff1a;一些不是使用js&#xff0c;ts代码编写的第三方…...

ORB-SLAM3源码学习:LoopClosing.cc:LoopClosing::NewDetectCommonRegions检测共同区域

前言 在ORB-SLAM2中校验闭环候选关键帧时&#xff0c;需要满足时序上连续3次成功校验才能通过。这就需要检测至少3个新进来的关键帧&#xff0c;这种方法牺牲了召回率来提升精度。由于必须严格的满足至少连续的三个条件这使得闭环的条件更加严格&#xff0c;即使存在真实的闭环…...

前端React Router从入门到进阶实战

React Router 是 React 应用中的一个重要库&#xff0c;它用于实现客户端的路由管理&#xff0c;能够将 URL 路径与 React 组件关联起来&#xff0c;从而实现页面之间的导航。React Router 不会像传统的多页面应用那样重新加载页面&#xff0c;而是通过组件切换来呈现不同的视图…...

关于华硕Armoury Crate(奥创中心)安装程序失败、卡进度条问题解决方案

关于华硕Armoury Crate(奥创中心&#xff09;安装失败解决方案 清理旧版本文件 如果之前安装过Armoury Crate&#xff0c;可能有残留文件导致冲突&#xff1a; 利用官方的卸载工具&#xff0c;卸载旧版本&#xff1a; https://www.asus.com.cn/supportonly/armoury%20crate/…...

【WPF】 数据绑定机制之INotifyPropertyChanged

INotifyPropertyChanged 是 WPF 中的一个接口&#xff0c;用于实现 数据绑定 中的 属性更改通知。它的主要作用是&#xff0c;当对象的某个属性值发生更改时&#xff0c;通知绑定到该属性的 UI 控件更新其显示内容。 以下是有关 INotifyPropertyChanged 的详细信息和实现方法&…...

QPushButton的基础用法

概述 本文将详细介绍 QPushButton 的概念、常规用法、样式表以及一些特殊用法&#xff0c;帮助您深入理解和高效应用 QPushButton。当前Qt版本为6.8。 1. QPushButton 的基本概念 1.1 概述 QPushButton 是 Qt 中最常用的按钮控件之一&#xff0c;它表示一个可以被点击的按钮…...

股指期货有哪些优势?

股指期货&#xff0c;作为一种重要的金融衍生品&#xff0c;以其独特的交易方式和多样的优势&#xff0c;吸引了众多投资者的关注。本文将详细解析股指期货的定义、优势以及特点&#xff0c;帮助投资者更好地理解和把握这一市场。 一、股指期货的定义 股指期货&#xff0c;顾…...

STM32完全学习——FATFS0.15移植SD卡

一、下载FATFS源码 大家都知道使用CubMAX可以很快的将&#xff0c;FATFS文件管理系统移植到单片机上&#xff0c;但是别的芯片没有这么好用的工具&#xff0c;就需要自己从官网下载源码进行移植。我们首先解决SD卡的驱动问题&#xff0c;然后再移植FATFS文件管理系统。 二、SD…...

使用 Spring 状态机构建灵活的状态管理系统

引言 在软件开发中&#xff0c;状态机是一种非常重要的工具&#xff0c;尤其适用于需要处理复杂状态转换的场景。无论是订单管理系统中的订单状态、工作流引擎中的任务流转&#xff0c;还是审批流程的管理&#xff0c;状态机都能有效地帮助我们组织和管理不同的状态及其之间的…...

[SMARTFORMS] 添加设置图标

本地图片存放位置 使用事务码SE78进入表格图形管理页面&#xff0c;将导入图标到SAP系统 选择需要上传的图片地址&#xff0c;输入名称&#xff0c;描述和图片类型&#xff0c;点击导入按钮 完成上述操作以后&#xff0c;图标已导入到SAP系统中 提示Tips&#xff1a;如何将图标…...

网络世界的“交通规则”——TCP/IP(一)

一、非可靠传输的协议——UDP 1.1 UDP的报文格式 &#xff08;1&#xff09;UDP长度&#xff1a;表示整个UDP数据包的长度&#xff08;报头载荷&#xff09;&#xff1b; &#xff08;2&#xff09;校验和&#xff1a;用于验证UDP数据包在传输过程中有没发生比特翻转&#xff…...

Excel中公式和函数的区别

Excel中公式和函数的区别 概念讲解例子公式函数 详细介绍函数面板最后再次进行演示操作文档 概念讲解 公式是用户自己编写的表达式&#xff0c;而函数是由Excel预定义的操作。公式可以包含各种数学运算符和逻辑表达式&#xff0c;函数则是执行特定任务的工具。公式可以引用其他…...

Node.js应用程序遇到了内存溢出的问题

vue 项目 跑起来&#xff0c;一直报错&#xff0c;内存溢出 在 文件node_modules 里 .bin > vue-cli-service.cmd 在依赖包这个文件第一行加上这个 node --max-old-space-size102400 "%~dp0\..\vue\cli-service\bin\vue-cli-service.js" %* node --max-old-s…...

MySQL关联关系理论与实践

MySQL 是一种关系型数据库管理系统&#xff0c;以其高性能、灵活性和易用性在开发者中广受欢迎。在 MySQL 中&#xff0c;数据存储以表格形式存在&#xff0c;表与表之间的关联关系构成了关系型数据库的核心。本篇文章将介绍 MySQL 关联关系的理论基础和常见实践&#xff0c;包…...