Spring Boot集成Jetty、Tomcat或Undertow及支持HTTP/2协议
目录
一、常用Web服务器
1、Tomcat
2、Jetty
3、Undertow
二、什么是HTTP/2协议
1、定义
2、特性
3、优点
4、与HTTP/1.1的区别
三、集成Web服务器并开启HTTP/2协议
1、生成证书
2、新建springboot项目
3、集成Web服务器
3.1 集成Tomcat
3.2 集成Jetty
3.3 集成Undertow
一、常用Web服务器
在Spring Boot应用中,选择合适的Web服务器是至关重要的。常见的Web服务器有Jetty、Tomcat和Undertow。它们各自具有不同的特点和优势,下面将进行详细的比较。
1、Tomcat
Tomcat是Apache基金会下的一个开源项目,是一个实现了Java Servlet和JavaServer Pages (JSP)技术的Web服务器。它支持最新的Java EE标准,并提供了丰富的特性,如会话管理、安全性和集群部署等。Tomcat在大型企业级应用中广泛使用。
2、Jetty
Jetty是一个轻量级的Java Web服务器,具有高效的事件处理机制和多线程模型。它支持多种协议,如HTTP/2、WebSocket和HTTP/1.1。Jetty的启动速度快,适用于小型到中型应用。
3、Undertow
Undertow是WildFly应用服务器中的嵌入式Web服务器,后来被独立出来成为了一个单独的项目。它是一个高性能的异步事件驱动的Web服务器,支持HTTP/2、WebSocket和Java Servlet 4.0。Undertow具有低延迟、高吞吐量和优秀的扩展性。对于大多数Spring Boot应用来说,Undertow是一个很好的选择。
总结:
- Jetty更轻量级。这是相对Tomcat而言的。由于Tomcat除遵循JavaServlet规范之外,自身还扩展大量JEE特性以满足企业级应用的需求,所以Tomcat是较重量级的,而且配置较Jetty复杂许多。并且Jetty更灵活,体现在其可插拔性和可扩展性,更易于开发者对Jetty本身进行二次开发,定制一个适合自身需求的WebServer。
- 在高并发系统中,Tomcat 相对来说比较弱。在相同的机器配置下,模拟相等的请求数,Undertow 在性能和内存使用方面都是最优的。并且 Undertow 新版本默认使用持久连接,这将会进一步提高它的并发吞吐能力。所以,如果是高并发的业务系统,Undertow 是最佳选择。
二、什么是HTTP/2协议
HTTP/2是HTTP协议的第二个主要版本,于2015年发布,用于在Web服务器和客户端之间传输数据。以下是关于HTTP/2的详细介绍:
1、定义
HTTP/2(超文本传输协议第2版,最初命名为HTTP 2.0),简称为h2(基于TLS/1.2或以上版本的加密连接)或h2c(非加密连接)。它是HTTP协议自1999年HTTP 1.1的改进版RFC发布后的首个更新,主要基于SPDY协议。多数主流浏览器已经在2015年底支持了该协议。
2、特性
- 多路复用:HTTP/2允许同时发送多个请求和响应,而不是像HTTP/1.1一样只能一个一个地处理。这样可以减少延迟,提高效率,提高网络吞吐量。
- 二进制传输:HTTP/2使用二进制协议,与HTTP/1.1使用的文本协议不同。二进制协议可以更快地解析,更有效地传输数据,减少了传输过程中的开销和延迟。
- 头部压缩:HTTP/2使用HPACK算法对HTTP头部进行压缩,减少了头部传输的数据量,从而减少了网络延迟。
- 服务器推送:HTTP/2支持服务器推送,允许服务器在客户端请求之前推送资源,以提高性能。
- 改进的安全性:HTTP/2默认使用TLS(Transport Layer Security)加密传输数据,提高了安全性。
- 兼容HTTP/1.1:HTTP/2可以与HTTP/1.1共存,服务器可以同时支持HTTP/1.1和HTTP/2。如果客户端不支持HTTP/2,服务器可以回退到HTTP/1.1。
3、优点
- 解析效率高:二进制数据更易于机器处理,提高了解析效率。
- 紧凑性好:减少了冗余字符和格式化问题,使得数据更加紧凑。
- 低错误率:避免了HTTP/1.1中容易因空格、大小写、换行符等问题导致的错误。
- 减少请求次数:服务器推送功能允许服务器在响应客户端请求时,提前发送额外的资源,减少了客户端的请求次数和等待时间。
4、与HTTP/1.1的区别
- 连接管理:HTTP/1.1中,每个请求都需要单独建立和维护连接;而HTTP/2允许同时在同一连接中发送多个请求和响应。
- 头部传输:HTTP/1.1中,头部字段需要在每个请求和响应中重复发送;而HTTP/2对头部进行了压缩,减少了重复的数据传输。
- 服务器推送:HTTP/1.1中,服务器无法主动推送额外的资源给客户端;而HTTP/2使服务器能够主动推送额外的资源给客户端。
- 安全性:HTTP/1.1中,加密是可选的;而HTTP/2默认使用TLS加密传输数据。
总的来说,HTTP/2在性能、安全性和可用性方面都有显著的改进,可以使Web应用更加快速、高效和可靠。
三、集成Web服务器并开启HTTP/2协议
1、生成证书
虽然HTTP/2理论上可以在非加密连接上使用,但实际上所有主流浏览器都要求HTTP/2必须基于TLS(HTTPS)。这意味着HTTP/2几乎总是与SSL/TLS一起使用。
keytool
是 Java Development Kit (JDK) 的一部分,用于管理密钥和证书。以下是一些常见的 keytool
命令示例,用于生成证书:
keytool -genkeypair -alias wisely -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 365 -storepass pass1234 -keypass pass1234
-genkeypair
: 生成密钥对。
-alias
: 密钥的别名。
-keyalg
: 密钥算法,这里使用 RSA。
-keysize
: 密钥长度,2048 位是推荐的安全长度。
-keystore
: 指定密钥库文件名。
-validity
: 证书有效期,单位是天。
-storepass
: 密钥库的密码。
-keypass
: 密钥的密码。
>keytool -genkeypair -alias wisely -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 365 -storepass pass1234 -keypass pass1234
您的名字与姓氏是什么?[Unknown]: budong
您的组织单位名称是什么?[Unknown]: budong
您的组织名称是什么?[Unknown]: budong
您所在的城市或区域名称是什么?[Unknown]: hangzhou
您所在的省/市/自治区名称是什么?[Unknown]: zhejiang
该单位的双字母国家/地区代码是什么?[Unknown]: CN
CN=budong, OU=budong, O=budong, L=hangzhou, ST=zhejiang, C=CN是否正确?[否]: y正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 365 天):CN=budong, OU=budong, O=budong, L=hangzhou, ST=zhejiang, C=CN
2、新建springboot项目
新建springboot项目,把生成的
文件文件放在resources目录下。部分代码如下:mykeystore.jks
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class TestController {@RequestMapping("/hello")public String hello() {return "Hello Tomcat!";}
}
3、集成Web服务器
3.1 集成Tomcat
(1)配置pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>webserver</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.5.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>
(2)配置application.yml
server:port: 8443servlet:context-path: /server1ssl:key-store: classpath:keystore.jkskey-store-password: pass1234key-store-type: JKSkey-alias: wiselykey-password: pass1234http2:enabled: true
(3)启动服务
服务启动后,在浏览器输入:https://127.0.0.1:8443/server1/test/hello
可以看到hello请求协议类型是h2,即HTTP/2。
如果使用Google浏览器,Network默认不显示Protocol,在表头这一行右键,选择需要显示的列。
3.2 集成Jetty
(1)配置pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>webserver2</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.5.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><!-- Jetty Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency><!-- HTTP/2 相关依赖 --><dependency><groupId>org.eclipse.jetty.http2</groupId><artifactId>http2-server</artifactId></dependency><!--<dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-alpn-server</artifactId></dependency>--><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-alpn-java-server</artifactId></dependency><!-- 可选依赖,根据需求添加 --><!-- <dependency><groupId>org.eclipse.jetty.http2</groupId><artifactId>http2-client</artifactId></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-alpn-client</artifactId></dependency> --></dependencies>
</project>
(2)配置application.yml
server:port: 8443servlet:context-path: /server2ssl:key-store: classpath:keystore.jkskey-store-password: pass1234key-store-type: JKSkey-alias: wiselykey-password: pass1234http2:enabled: truejetty:threads:acceptors: 4selectors: 8
(3)启动服务
服务启动后,查看日志输出,打印出(ssl, alpn, h2, http/1.1),则表示h2启用成功。
在浏览器输入:https://127.0.0.1:8443/server2/test/hello
可以看到hello请求协议类型是h2,即HTTP/2。
(4)高级配置
除了可以在配置文件中配置Jetty参数外,还可以在配置类中通过编程方式进行配置。例如,你可以设置Jetty的线程池大小、SSL配置等。
import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
import org.eclipse.jetty.server.*;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class JettyConfig {@Bean@Autowiredpublic ConfigurableServletWebServerFactory configurableServletWebServerFactory(ServerProperties serverProperties) {JettyServletWebServerFactory factory = new JettyServletWebServerFactory();factory.addServerCustomizers(server -> {if (serverProperties.getSsl() != null && serverProperties.getSsl().isEnabled()) {ServerConnector connector = (ServerConnector) server.getConnectors()[0];int port = connector.getPort();SslContextFactory sslContextFactory = connector.getConnectionFactory(SslConnectionFactory.class).getSslContextFactory();HttpConfiguration httpConfiguration = connector.getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration();// 配置SSL上下文工厂和HTTP/2连接工厂ConnectionFactory[] connectionFactories = new ConnectionFactory[]{new SslConnectionFactory(sslContextFactory, "alpn"),new ALPNServerConnectionFactory("h2", "h2-17", "h2-16", "h2-15", "h2-14"),new HTTP2ServerConnectionFactory(httpConfiguration)};// 创建新的ServerConnector并设置到服务器上ServerConnector serverConnector = new ServerConnector(server, connectionFactories);serverConnector.setPort(port);server.setConnectors(new Connector[]{serverConnector});}});return factory;}
}
把配置文件中的server.http2.enable=true开关注释掉,并重启服务。可见h2协议也开启了。
3.3 集成Undertow
(1)配置pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>webserver3</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.5.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><!-- Undertow服务器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId></dependency></dependencies>
</project>
(2)配置application.yml
server:port: 8443servlet:context-path: /server3ssl:key-store: classpath:keystore.jkskey-store-password: pass1234key-store-type: JKSkey-alias: wiselykey-password: pass1234http2:enabled: true
(3)启动服务
服务启动后,在浏览器输入:https://127.0.0.1:8443/server3/test/hello
可以看到hello请求协议类型是h2,即HTTP/2。
把配置文件中的server.http2.enable=true开关注释掉,并重启服务,请求接口看到协议类型是http/1.1
相关文章:
Spring Boot集成Jetty、Tomcat或Undertow及支持HTTP/2协议
目录 一、常用Web服务器 1、Tomcat 2、Jetty 3、Undertow 二、什么是HTTP/2协议 1、定义 2、特性 3、优点 4、与HTTP/1.1的区别 三、集成Web服务器并开启HTTP/2协议 1、生成证书 2、新建springboot项目 3、集成Web服务器 3.1 集成Tomcat 3.2 集成Jetty 3.3 集成…...
ISO 15118,最新版,汽车充电桩相关标准,1~22子标准
ISO 15118 是一项国际标准,主要规定了电动汽车(EV)与充电桩(EVSE)之间的通信协议,涵盖了充电过程中的信息交换、安全认证、充电控制等内容。以下是其主要内容: 1. 通信协议 V2G通信:…...
信息系统项目管理师考试介绍和学习资料分享
信息系统项目管理师考试是评估考生在信息系统项目管理领域的专业知识和技能的重要考试。以下是对信息系统项目管理师考试的详细介绍: 拥有软考信息系统项目管理师高级证的作用: 提高求职竞争力: 信息系统项目管理师证书是国家级证书&#…...
基于 Spring AI 的 HIS 系统智能化改造
【Spring AI 的背景与现状】 Spring AI 是 Spring 生态里整的一个新活儿,专门给开发者提供搞 AI 驱动的应用的工具和框架。虽然 Spring AI 已经鼓捣了挺长时间,但截至现在(2025年2月),它还没正式发布。不过࿰…...
visual studio 2022安装教程及下载(附安装包)visual studio 2022下载安装教程图文详情
文章目录 前言一、visual studio 2022下载二、visual studio 2022安装教程三、软件设置四、安装完成 前言 Visual Studio 2022 作为强大的集成开发环境,深受开发者青睐。但初次安装,其复杂步骤易让人摸不着头脑。为帮大家顺利安装,本文将详细…...
Nginx+PHP+MYSQL-Ubuntu在线安装
在 Ubuntu 上配置 Nginx、PHP 和 MySQL 的步骤如下: 1. 更新系统包 首先,确保系统包是最新的: sudo apt update sudo apt upgrade2. 安装 Nginx 安装 Nginx: sudo apt install nginx启动并启用 Nginx 服务: sudo…...
【Excel】 Power Query抓取多页数据导入到Excel
抓取多页数据想必大多数人都会,只要会点编程技项的人都不会是难事儿。那么,如果只是单纯的利用Excel软件,我还真的没弄过。昨天,我就因为这个在网上找了好久发好久。 1、在数据-》新建查询-》从其他源-》自网站 ,如图 …...
spring boot 2.7 + seata +微服务 降级失败问题修复
文章引流 一个简单而使用的API管理工具 版本号 spring boot 2.7.17 spring-cloud-dependencies 2021.0.8 spring-cloud-circuitbreaker-resilience4j 2.1.7 spring-cloud-starter-alibaba-seata 2021.1 jdk 1.8原因分析 未配置属性 feign.circuitbreaker.enabledtrue # 未…...
Ubuntu 22.04 安装Nvidia驱动加速deepseek
一键安装22.04 nvidia 驱动 nvidia 官网下载驱动我的环境是NVIDIA RTX A5000nvidia 文档参考没有安装驱动之前确认自己的型号 lspci | grep -i vga (如数字2231) 参考docker 支持nvidia ,注释了需要的取消注释即可 42行-92行一定要重启服务器…...
【Java项目】基于Spring Boot的校园博客系统
【Java项目】基于Spring Boot的校园博客系统 技术简介:采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介:校园博客系统是一个典型的管理系统,主要功能包括管理员:首页、个人中心、博主管理、文章分类管理、文章信息…...
centos7 离线安装docker
1.下载docker Index of linux/static/stable/x86_64/ 2.安装docker tar -zxvf docker-19.03.9.tgz cp -p docker/* /usr/bin 创建docker服务配置文件docker.servicevim /etc/systemd/system/docker.service [Unit] DescriptionDocker Application Container Engine Docume…...
基于Rook的Ceph云原生存储部署与实践指南(上)
#作者:任少近 文章目录 1 Ceph环境准备2 rook部署ceph群集2.1 Rook 帮助地址2.2 安装ceph2.3 获取csi镜像2.4 Master参加到osd2.5 设置默认存储 3 Rook部署云原生RBD块存储3.1 部署storageclass资源3.2 部署WordPress使用RBD3.3 WordPress访问 4 Rook部署云原生RGW…...
微服务合并
有的团队为了节约机器成本、有的团队为了提升研发效率、有的团队为了降低人均服务数 微服务合并,可以从多个角度入手 代码重构融合:人工拷贝代码、解决冲突,然后分阶段实施迁移重构。代码合并打包:将多个代码仓库,拉取…...
Linux中子线程会继承父线程对相关变量的可见性
在 Linux 的 POSIX 线程模型中,当父线程修改全局变量后创建子线程,子线程一定会看到修改后的最新值。这是由线程的内存共享机制和线程创建时序保证的,具体原理如下: 关键机制解析 内存共享本质: 所有线程共享相同的全局数据段修改操作直接作用于物理内存,无副本存在cint …...
道可云人工智能每日资讯|深圳将设立人工智能和机器人产业基金
道可云元宇宙每日简报(2025年2月26日)讯,今日元宇宙新鲜事有: 上海青浦发布国际产业协作元宇宙平台 近日,“2025出海企业与跨境专业服务论坛”在上海青浦区徐泾镇举行。论坛上重磅发布三大全球化服务平台,…...
5.11 PEFT重参数化方法:低秩分解的微调革命
PEFT重参数化方法:低秩分解的微调革命 一、重参数化技术全景图 mindmap root((重参数化方法)) LoRA "低秩矩阵分解" "参数冻结策略" AdaLoRA "动态秩调整" "重要性采样" QLoRA "量化低秩分解" "NF4量化策…...
vscode 版本
vscode官网 Visual Studio Code - Code Editing. Redefined 但是官网只提供最新 在之前的版本就要去github找了 https://github.com/microsoft/vscode/releases 获取旧版本vscode安装包的方法_vscode 老版本-CSDN博客...
自然语言处理NLP深探
1. NLP 的定义、特点、具体工作、历史和流派 定义:自然语言处理(Natural Language Processing,NLP)是计算机科学与人工智能领域的一个重要分支,旨在让计算机理解、处理和生成人类自然语言,实现人与计算机之间用自然语言进行有效通信。特点 交叉性:涉及计算机科学、语言学…...
【leetcode hot 100 15】三数之和
一、两数之和的扩展 class Solution {public List<List<Integer>> threeSum(int[] nums) {// 将得到的结果存入Set中,保证不重复Set<List<Integer>> set new HashSet<>();// 模拟两数之和,作为第一个循环中的内容for(in…...
提示学习(Prompting)
提示学习(Prompting)是一种利用预训练语言模型(Pre-trained Language Models, PLMs)来完成特定任务的方法。它的核心思想是通过设计特定的提示(Prompt),将任务转化为预训练模型能够理解的形式&a…...
wav格式的音频压缩,WAV 转 MP3 VBR 体积缩减比为 13.5%、多个 MP3 格式音频合并为一个、文件夹存在则删除重建,不存在则直接建立
🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 问题一:wav格式的音频压缩为哪些格式,网络传输给用户播放…...
TDengine 中的数据库
数据库概念 时序数据库 TDengine 中数据库概念,等同于关系型数据库 MYSQL PostgreSQL 中的数据库,都是对资源进行分割管理的单位。 TDengine 数据库与关系型数据库最大区别是跨库操作,TDengine 数据库跨库操作除了少量几个SQL 能支持外&…...
react覆盖组件样式,不影响其他地方相同类名的组件
less module 配合 :global(){} less文件 /* ButtonComponent.less */ .customButton {// 覆盖第三方按钮库的类名(如 .ant-btn):global(.ant-btn) {background: #1890ff;// 通过父选择器限定作用域&:hover {background: #40a9ff;}} } tsx文件 //…...
ProtoBuf
protobuf 序列化 序列化:本质就是将结构化的数据转成为字符串(在网络HTTP中遇到过)protobuf:就是将结构化的数据进行序列化的一种方式。 特点 • 语⾔⽆关、平台⽆关:即 ProtoBuf ⽀持 Java、C、Python 等多种语⾔…...
算法day2 dfs搜索2题
一 PERKET 当我们拿到这个题目的时候,确实郁闷到底该怎么做,首先我们看这个题目 题目中给我们提供了这么多个调料,这个调料有酸度和苦度,这些都是它的属性,但是我们是选择这个调料,那么就是对于一个调料有…...
【数据分析】通过拟水平法,实现混合正交表
拟水平法是一种将高水平正交表转换为低水平正交表的方法,适用于实验中某些因素的水平数少于正交表水平数的情况。通过拟水平法,可以充分利用现有的正交表资源,减少实验次数。 1. 拟水平法的基本思想 拟水平法的核心是将高水平正交表中的某些水平“合并”或“拆分”,使其适…...
利用node.js搭配express框架写后端接口(一)
Node.js 凭借其高效的非阻塞 I/O 操作、事件驱动架构以及轻量级的特点,成为了开发高性能服务器应用的热门选择。Express 框架作为 Node.js 上最流行的 Web 应用框架之一,以其简洁的 API 和丰富的中间件生态系统,极大地简化了 Web 后端开发流程…...
python-leetcode-最长公共子序列
1143. 最长公共子序列 - 力扣(LeetCode) class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:m, n len(text1), len(text2)dp [[0] * (n 1) for _ in range(m 1)]for i in range(1, m 1):for j in range(1, n …...
【前端基础】Day 1 HTML
总结: 1. Web标准的构成 2. 基本标签 目录 1. Web标准的构成 2. 基本标签 2.1快捷键 2.2.1标题标签 2.2.2段落和换行标签 2.2.3文本格式化标签 2.2.4div和span标签 2.3.1 图像标签和路径 2.3.2路径 2.3.3超链接标签 2.4注释标签 2.5特殊字符 1. Web标准…...
Python解决“比赛配对”问题
Python解决“比赛配对”问题 问题描述测试样例解决思路代码 问题描述 小R正在组织一个比赛,比赛中有 n 支队伍参赛。比赛遵循以下独特的赛制: 如果当前队伍数为 偶数,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,…...
前端设计稿转代码工具深度评测:从效率革命到落地困境
前端设计稿转代码工具深度评测:从效率革命到落地困境 ——2025年主流工具横向对比与技术破局路径 一、工具演进史:从"机械翻译"到"AI设计师" 前端设计稿转代码工具经历了三个阶段进化:早期基于规则匹配的代码生成器(2015-2020)、智能布局识别工具(…...
【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡
【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡 开发背景 接下来我们直接打开我们的项目开始进一步操作, 实战开发 导入项目 我把得到的项目解压到本地,我们开…...
管理后台环境配置
1. 后端配置及启动 a. 软件安装 Java sdk 1.8 maven 3.6 intellij IDEA 2024 Visual C Redistributable mongodb mysql wsl (管理员:wsl --install) redis curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/shar…...
STM32寄存器控制引脚高低电平
一. 引子 最近在学习32代码的过程当中,虽然在学习IMX6ULL开发板的过程中接触过很多寄存器,最近在返回去看32的时候,在研究代码的时候发现自己对于寄存器的有些特性理解的不够深刻,所以下来的时候去查了资料,以及问了一…...
vue 设置生产 开发 测试环境
在 Vue.js 中,可以通过配置不同的环境变量来区分生产、开发和测试环境的请求。一般情况下,我们使用 webpack 或 Vite 进行构建,它们都支持环境变量的配置。 以下是如何在 Vue 项目中配置不同环境的请求: 1. 配置 .env 文件 在项…...
《模拟器过检测教程:Nox、雷电、Mumu、逍遥模拟器 Magisk、LSposed 框架安装与隐藏应用配置》
一、夜神模拟器 (Nox) 过检测 使用版本:7.0.6.2(20250209) 1. 准备工作 将需要用到的应用放入文件夹: C:\Users\Administrator.DESKTOP-I5V50SS\Nox_share\Download 2. 安装面具鸭(Magisk) 在模拟器下…...
Three.js包围盒
目录 前言 包围矩形Box2 包围盒Box3 包围球Sphere Box3方法.setFromPoints() 几何体方法.computeBoundingBox() 几何体居中方法center() Box3方法.expandByObject() Box3方法.expandByScalar() Box3方法.getSize() Box3方法.getCenter() Sphere方法.getBoundingSp…...
JBoltAI_SpringBoot 资源管理:打造一站式 AI 资源管理平台
在 AI 项目开发中,资源管理一直是个让人头疼的问题。各种模型、数据库、嵌入资源等,如果没有一个统一的管理平台,很容易让开发者陷入混乱。今天,就给大家介绍一个超级实用的资源管理功能 ——JBoltAI_SpringBoot 资源管理…...
Vue2+Element实现Excel文件上传下载预览【超详细图解】
目录 一、需求背景 二、落地实现 1.文件上传 图片示例 HTML代码 业务代码 2.文件下载 图片示例 方式一:代码 方式二:代码 3.文件预览 图片示例 方式一:代码 方式二:代码 一、需求背景 在一个愉快的年后ÿ…...
迪米特法则
迪米特法则 迪米特法则又叫最少知识原则。 只和你的直接朋友交流,不和 ‘陌生人’ 说话。 含义:如果两个软件实体无需直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度ÿ…...
【Swift 算法实战】判断数组中是否存在重复元素
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
机器学习数学基础:35.效度
效度全攻略:从理论到实践的深度剖析 一、效度(Validity)入门:揭开精准测量的面纱 效度,简单来说,就是测量工具能否准确命中目标的“命中率”。想象你手中有一把枪(测量工具)&#…...
excel单、双字节字符转换函数(中英文输入法符号转换)
在Excel中通常使用函数WIDECHAR和ASC来实现单、双字节字符之间的转换。其中 WIDECHAR函数将所有的字符转换为双字节,ASC函数将所有的字符转换为单字节 首先来解释一下单双字节的含义。单字节一般对应英文输入法的输入,如英文字母,英文输入法…...
重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞??收藏评论 整合 Elasticsearch 8.x (二)使用Repository 1. 环境准备 1.1 项目依赖1.2 Elasticsearch 配置 2. 使用Repository的基本步骤 2.1 创建实体类2.2 创建 Reposit…...
Jenkinsfile流水线构建教程
前言 Jenkins 是目前使用非常广泛的自动化流程的执行工具, 我们目前的一些自动化编译, 自动化测试都允许在 Jenkins 上面. 在 Jenkins 的术语里面, 一些自动化工作联合起来称之为流水线, 比如拉取代码, 编译, 运行自动化测试等. 本文的主要目的是引导你快速熟悉 Jenkinsfile …...
比创达电子科技-EMC干货之防静电技术
EMC干货之防静电技术 什么是静电放电 两个具有不同静电电位的物体,由于直接接触或静电场感应引起两物体间的静电电荷的转移,静电电场的能量达到一定程度后,击穿其间介质而进行放电的现象就是静电放电,简称为ESD(Electro Static Discharge)。 静电产生的原…...
PDF扫描档智能方向识别:多模型投票机制的实践测试 救活古典书籍
2025-02-22 20:10物联全栈123 尊敬的诸位!我是一名物联网工程师。关注我,持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与 AI 的无尽可能 RAG知识库搭建的过程中,扫描档pdf的支持和准确率一直是个大家都不愿主动提起的事情…...
算法教程:岛的最大面积
算法教程:岛的最大面积 我们将首先讨论问题和解决方案,然后使用可视化工具(上一篇博客中进行了介绍)来更好地理解搜索过程。 问题描述 我们将要演练的具体问题是问题 Leetcode:岛屿的最大面积。在 Leetcode 上找到的直接问题描述是: 给你一个 m x n 二进制矩阵网格。岛…...
18439二维前缀和
18439二维前缀和 ⭐️难度:中等 📖 📚 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int m scanner.nextInt();int q s…...
information_schema.processlist 表详解
information_schema.processlist 表(或 SHOW PROCESSLIST; 命令)用于查看 MySQL 当前所有的连接进程,帮助管理员监控数据库活动并排查性能问题。以下是该表的字段及其具体含义: 🔹 information_schema.processlist 字段…...