Java Bean Validation 不适用Spring的情况下自定义validation注解
Java Bean Validation(也称为 JSR 380,为 Bean Validation 2.0 规范)提供了一套基本的注解,用于定义和验证 Java Bean 的属性。例如:
@NotNull:属性不能为空
@Size:字符串、集合或数组的大小有约束
@Min 和 @Max:数值的最小值和最大值
@Pattern:字符串必须匹配正则表达式
等等
这些注解是由 Bean Validation 规范定义的,可以通过例如 Hibernate Validator 的实现来使用。
0. Maven 依赖
<dependency><groupId>jakarta.validation</groupId><artifactId>jakarta.validation-api</artifactId></dependency><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId></dependency>
1. 定义一个注解接口
@Constraint(validatedBy = RegexValidator.class)
@Target({ ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface RegexValidation {String message() default "Invalid value";String pattern();Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
解析
类注解
@Constraint(validatedBy = RegexValidator.class)
@Target({ ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface RegexValidation {
@Constraint(validatedBy = RegexValidator.class):
标记这个注解作为一个验证注解。
validatedBy 属性指定了用于实际验证的类,这里是 RegexValidator.class。这意味着会有一个 RegexValidator 类来实现对这个注解的验证逻辑。
@Target({ ElementType.FIELD, ElementType.ANNOTATION_TYPE }):
这个元注解指定了 @RegexValidation 可以应用的程序元素类型。
ElementType.FIELD:表示这个注解能用于字段上。
ElementType.ANNOTATION_TYPE:表示这个注解可以用在其他注解上(元注解)。
@Retention(RetentionPolicy.RUNTIME):
这个元注解指定了 @RegexValidation 的保留策略。
RetentionPolicy.RUNTIME:表示注解将在运行时保留,可以通过反射进行读取。
定义注解的属性
String message() default "Invalid value";
message():
定义验证失败时的默认错误消息。
default "Invalid value":提供了一个默认值 "Invalid value"。
String pattern();
pattern():
定义一个字符串类型的属性,用于存储正则表达式模式。
没有默认值,所以这是一个必须属性,使用注解时必须提供。
Class<?>[] groups() default {};
groups():
用于分组验证,这使得注解可以在不同的验证组中使用。
默认是一个空数组。
Class<? extends Payload>[] payload() default {};
payload():
提供了负载信息的一种方式,可以用于传递元数据给约束。
默认是一个空数组。
整个注解定义总结
@RegexValidation 注解是一个自定义的验证注解,允许你对字段进行正则表达式匹配验证。该注解需要一个 pattern 属性来指定要匹配的正则表达式,并且通过 message 属性自定义验证失败时的错误信息。
2. 定义一个验证器
public class RegexValidator implements ConstraintValidator<RegexValidation, String> {private Pattern pattern;@Overridepublic void initialize(RegexValidation constraintAnnotation) {this.pattern = Pattern.compile(constraintAnnotation.pattern());}@Overridepublic boolean isValid(String string, ConstraintValidatorContext context) {if (string == null || string.isBlank()) {return true;}Matcher matcher = pattern.matcher(string);StringBuilder invalidChars = new StringBuilder();while (matcher.find()) {invalidChars.append(matcher.group());}if (invalidChars.length() > 0) {context.disableDefaultConstraintViolation();context.buildConstraintViolationWithTemplate(String.format("Invalid characters found: \"%s\"", invalidChars)).addConstraintViolation();return false;}return true;}
}
解析:
RegexValidator 类的作用是基于自定义注解 @RegexValidation 对字符串进行正则表达式匹配验证。其核心逻辑是初始化时编译正则表达式,然后验证时检查输入字符串是否完全匹配该正则模式,若存在不匹配字符则记录并返回验证失败。此过程实现了灵活且详细的输入验证,非常适合用于需要复杂输入约束的场景。
3. 定义一个组合注解类
@Constraint(validatedBy = {})
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@NotBlank(message = "Name must not be blank")
@Length(min = 3, max = 256, message = "Name length must be between 3 and 256 characters")
@SafeHtml
@RegexValidation(pattern = "[\\x{0001f300}-\\x{0001f64f}]|[\\x{0001f680}-\\x{0001f6ff}<>#%]")
public @interface LongName {String message() default "Invalid name";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}
解析
这个注解结合了多个验证器来对目标字段进行综合验证。逐行解析这个注解的定义,有助于理解它是如何工作的,以及它在实际使用中可以提供哪些功能。注解定义部分
@Constraint(validatedBy = {})
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {}):这一行表明这是一个验证注解。
validatedBy 属性指定了需要用哪个验证器类来实现这个注解的验证逻辑。在这里,它是一个空数组 {},表示不指定特定的验证器类。实际上,验证的逻辑由注解内部包含的其他注解来实现。
@Target({ ElementType.FIELD }):该元注解描述了 @LongName 可以被应用到程序元素的类型上。
ElementType.FIELD 表示这个注解只能用在字段上。
@Retention(RetentionPolicy.RUNTIME):该元注解描述了 @LongName 的生命周期。
RetentionPolicy.RUNTIME 表示这个注解将在运行时保留,因此可以通过反射机制读取注解信息。
验证注解部分
@NotBlank(message = "Name must not be blank")
@Length(min = 3, max = 256, message = "Name length must be between 3 and 256 characters")
@SafeHtml
@RegexValidation(pattern = "[\\x{0001f300}-\\x{0001f64f}]|[\\x{0001f680}-\\x{0001f6ff}<>#%]")
@NotBlank(message = "Name must not be blank"):表示被注解的字段不能为空白字符串。
如果验证失败,会显示消息 "Name must not be blank"。
@Length(min = 3, max = 256, message = "Name length must be between 3 and 256 characters"):验证字符串长度需要在 3 到 256 个字符之间。
如果长度不符合,会显示消息 "Name length must be between 3 and 256 characters"。
@SafeHtml:表示被注解的字段必须是安全的 HTML 内容。这个注解通常会用来防止跨站脚本(XSS)攻击。
@RegexValidation(pattern = "[\\x{0001f300}-\\x{0001f64f}]|[\\x{0001f680}-\\x{0001f6ff}<>#%]"):自定义一个正则表达式验证:只能包含特定的 Unicode 范围字符和某些标点符号。
应用的正则表达式模式为 "[\\x{0001f300}-\\x{0001f64f}]|[\\x{0001f680}-\\x{0001f6ff}<>#%]"。
组合注解定义的属性部分
public @interface LongName {String message() default "Invalid name";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}
String message() default "Invalid name";:
提供默认的错误消息,尽管这个信息对组合注解本身没有太大意义,因为每个具体注解都有自己的错误消息。
Class<?>[] groups() default {};:
用于分组验证。
Class<? extends Payload>[] payload() default {};:
用于传递支付信息。
总结
@LongName 是一个组合注解,它结合了多个标准验证注解(例如 @NotBlank, @Length, @SafeHtml and @RegexValidation)的功能。这个组合注解对于需要进行多种综合验证的场景非常有用,使代码更加简洁和可读。同时,组合注解可以减少重复代码,提高开发效率。
4. 实体类字段中注解的使用
public class User {@LongNameprivate String name;// getters 和 setters
}
name 字段将会受到四个不同注解的联合验证:@NotBlank, @Length, @SafeHtml, 和 @RegexValidation。这简化了代码,将多重验证集中在一个地方声明。此外,组合注解提高了代码的可读性和维护性。
5. Spring 注解的优势
Spring 框架的优势
Spring 框架在Bean Validation的基础上进行了很多增强和扩展,为开发者提供了更多的便利和功能:
更强的依赖注入和配置管理:
Spring 框架提供了功能强大且易于使用的依赖注入容器,帮助你轻松管理对象的创建和依赖。
自动校验:
Spring MVC 和 Spring Data 可以自动与 Bean Validation 集成。例如,你可以在控制器方法中直接使用 @Valid 注解,使得请求参数在进入控制器方法之前就被验证。
@PostMapping(“/users”)
public ResponseEntity createUser(@Valid @RequestBody User user) {
// 如果 user 无效,Spring 会自动返回 400 错误代码
return ResponseEntity.ok(userService.save(user));
}
简化的配置:
Spring Boot 通过自动配置大大简化了 Bean Validation 的集成,可以快速上手,并且减少了繁琐的配置过程。
国际化 (i18n) 支持:
Spring 提供了强大的国际化支持,可以轻松地为不同的地区和语言配置验证消息。
高级功能和扩展:
通过自定义注解和验证器类,Spring 框架可以更灵活地满足复杂的业务需求。例如,可以将自定义验证逻辑注入到服务中来实现高级验证逻辑。
@Component
public class CustomValidator implements ConstraintValidator<CustomConstraint, String> {
@Override
public void initialize(CustomConstraint constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {return "specialValue".equals(value);
}
}
与其他Spring模块的深度集成:
Spring 框架与 Spring Security、Spring Data、Spring Cloud 等其他模块紧密集成,这意味着你的验证逻辑可以更加一致和集中管理。
相关文章:
Java Bean Validation 不适用Spring的情况下自定义validation注解
Java Bean Validation(也称为 JSR 380,为 Bean Validation 2.0 规范)提供了一套基本的注解,用于定义和验证 Java Bean 的属性。例如: NotNull:属性不能为空 Size:字符串、集合或数组的大小有约…...
【算法学习笔记】30:埃氏筛(Sieve of Eratosthenes)和线性筛(Linear Sieve)
测试题目:AcWing 868. 筛质数 埃氏筛(Sieve of Eratosthenes) 如果 i i i是素数,每次把 i i i的倍数都筛掉,存在重复筛选,时间复杂度 n ⋅ l o g ( l o g n ) n \cdot log(logn) n⋅log(logn)。 #includ…...
风控业务——评分模型
本文主要讲述了金融机构风控模型的重要性及其应用。首先,开头概述了风控模型的整体建模流程,包括特征工程和建模方法。接着,本文强调了贷前、贷中、贷后三个阶段中风控模型的应用,如信用评分、行为评分和催收评分。同时还提到了信…...
jupyter notebook练手项目:线性回归——学习时间与成绩的关系
线性回归——学习时间与学习成绩的关系 第1步:导入工具库 pandas——数据分析库,提供了数据结构(如DataFrame和Series)和数据操作方法,方便对数据集进行读取、清洗、转换等操作。 matplotlib——绘图库,p…...
DDD - 微服务设计与领域驱动设计实战(上)_统一建模语言及事件风暴会议
文章目录 Pre概述业务流程需求分析的困境统一语言建模事件风暴会议什么是事件风暴(Event Storming)事件风暴会议 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对…...
《自动驾驶与机器人中的SLAM技术》ch7:基于 ESKF 的松耦合 LIO 系统
目录 基于 ESKF 的松耦合 LIO 系统 1 坐标系说明 2 松耦合 LIO 系统的运动和观测方程 3 松耦合 LIO 系统的数据准备 3.1 CloudConvert 类 3.2 MessageSync 类 4 松耦合 LIO 系统的主要流程 4.1 IMU 静止初始化 4.2 ESKF 之 运动过程——使用 IMU 预测 4.3 使用 IMU 预测位姿进…...
day07_Spark SQL
文章目录 day07_Spark SQL课程笔记一、今日课程内容二、Spark SQL函数定义(掌握)1、窗口函数2、自定义函数背景2.1 回顾函数分类标准:SQL最开始是_内置函数&自定义函数_两种 2.2 自定义函数背景 3、Spark原生自定义UDF函数3.1 自定义函数流程&#x…...
【LC】2270. 分割数组的方案数
题目描述: 给你一个下标从 0 开始长度为 n 的整数数组 nums 。 如果以下描述为真,那么 nums 在下标 i 处有一个 合法的分割 : 前 i 1 个元素的和 大于等于 剩下的 n - i - 1 个元素的和。下标 i 的右边 至少有一个 元素,也就是…...
Docker 容器通信的网络模式详解
Docker 的网络模式是容器化技术中非常重要的一部分,它决定了容器之间以及容器与外部世界如何通信。Docker 提供了多种网络模式,每种模式都有其特定的使用场景和优势。本文将深入探讨 Docker 的网络模式,包括桥接模式、主机模式、覆盖网络模式…...
Apache和PHP:构建动态网站的黄金组合
在当今的互联网世界,网站已经成为了企业、个人和机构展示自己、与用户互动的重要平台。而在这些动态网站的背后,Apache和PHP无疑是最受开发者青睐的技术组合之一。这一组合提供了高效、灵活且可扩展的解决方案,帮助您快速搭建出强大的网站&am…...
一个简单的html5导航页面
一个简单的 HTML5 导航页面的示例代码: html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><ti…...
积木仪表盘 出现 “没有权限,请联系管理员分配权限“ 解决方法
目录 前言1. 问题所示2. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 原先写过报表的错误!但错误解决方式不一样:jmreport测试数据库出现 权限不足,此功能需要分配角色 解决方法 1. 问题所示 出现 没有权限,请联系管理员分配权限 的…...
C++语言的循环实现
C语言中的循环实现 引言 在程序设计中,循环是一个至关重要的概念。它允许我们在满足某种条件时重复执行某段代码,从而实现复杂的逻辑和算法。C作为一种强大的编程语言,提供了多种循环结构来满足不同的需求。本文将深入探讨C中的循环实现&am…...
高级java每日一道面试题-2025年01月13日-框架篇[Spring篇]-Spring 是怎么解决循环依赖的?
如果有遗漏,评论区告诉我进行补充 面试官: Spring 是怎么解决循环依赖的? 我回答: 在Java高级面试中,Spring框架如何解决循环依赖是一个重要且常见的问题。以下是对Spring解决循环依赖的详细解释: 循环依赖的定义与类型 循环依赖是指两个或多个Bea…...
.Net Core Record 类型
public class Person { public string id {get;init;} public string code {get;init;} public string name {get;init;} } //Person 属性不可单独赋值,相当于使用record定义 public record Person string id,string code,string name) //record类…...
GitLab CI/CD使用runner实现自动化部署前端Vue2 后端.Net 7 Zr.Admin项目
1、查看gitlab版本 建议安装的runner版本和gitlab保持一致 2、查找runner 执行 yum list gitlab-runner --showduplicates | sort -r 找到符合gitlab版本的runner,我这里选择 14.9.1版本 如果执行出现找不到下载源,添加官方仓库 执行 curl -L &quo…...
重邮+数字信号处理实验七:用 MATLAB 设计 IIR 数字滤波器
一、实验目的 1 、加深对窗函数法设计 FIR 数字滤波器的基本原理的理解。 2 、学习用 Matlab 语言的窗函数法编写设计 FIR 数字滤波器的程序。 3 、了解 Matlab 语言有关窗函数法设计 FIR 数字滤波器的常用函数用法。 4 、掌握 FIR 滤波器的快速卷积实现原理。…...
CES 2025:INAIR 推出“另类”AR电脑,重新定义移动计算体验
在2025年国际消费类电子产品展览会(CES)上,INAIR公司凭借其创新的AR电脑产品吸引了众多目光。这款设备不仅融合了增强现实(AR)技术与传统个人电脑的功能,还通过独特的设计理念为用户带来了前所未有的移动计算体验。本文将详细介绍INAIR AR电脑的特点、技术创新及其对未来…...
了解 ASP.NET Core 中的中间件
在 .NET Core 中,中间件(Middleware) 是处理 HTTP 请求和响应的核心组件。它们被组织成一个请求处理管道,每个中间件都可以在请求到达最终处理程序之前或之后执行操作。中间件可以用于实现各种功能,如身份验证、路由、…...
数据结构与算法之链表: LeetCode 234. 回文链表 (Ts版)
回文链表 https://leetcode.cn/problems/palindrome-linked-list/description/ 描述 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表如果是,返回 true ;否则,返回 false 示例 1 输入:head [1,2,2,1]…...
DVWA靶场CSRF漏洞通关教程及源码审计
目录标题 CSRFlow源码审计 medium源码审计 high源码审计 impossible源码审计 CSRF low 先修改密码 看到地址栏 复制在另一个网页打开 成功登录 源码审计 没有任何过滤措施,很危险,并且采用了不安全的md5加密 <?phpif( isset( $_GET[ Change ] )…...
支持Google Analytics快捷添加的CMS:费用与部署形式详解
CMS 的费用和部署形式是选择平台的重要参考因素,不同的业务需求需要不同的解决方案。本文将从费用和部署形式两个角度,详细分析支持 Google Analytics 快捷集成的 CMS 和工具,帮助您更好地了解这些平台的特点。 1. BigCommerce 费用ÿ…...
Kibana操作ES基础
废话少说,开干!!!!!!!!!!!!截图更清晰,复制在下面 #库操作#创建索引【相当于数据库的库】 PUT /first_index#获…...
如何在Ubuntu上安装和配置Git
版本控制系统(VCS)是软件开发过程中不可或缺的工具之一,它帮助开发者跟踪代码变更、协作开发以及管理不同版本的项目。Git作为当前最流行的分布式版本控制系统,因其高效性和灵活性而广受青睐。本文将指导你如何在Ubuntu操作系统上…...
基于springboot+vue+微信小程序的宠物领养系统
基于springbootvue微信小程序的宠物领养系统 一、介绍 本项目利用SpringBoot、Vue和微信小程序技术,构建了一个宠物领养系统。 本系统的设计分为两个层面,分别为管理层面与用户层面,也就是管理者与用户,管理权限与用户权限是不…...
HTB:Driver[WriteUP]
目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用smbclient尝…...
Require:利用MySQL binlog实现闪回操作
1,闪回原理 【binlog】MySQL binlog以event的形式,记录了MySQL server从启用binlog以来所有的变更信息,能够帮助重现这之间的所有变化。MySQL引入binlog主要有两个目的:一是为了主从复制;二是某些备份还原操作后需要重…...
黑马linux笔记(03)在Linux上部署各类软件 MySQL5.7/8.0 Tomcat(JDK) Nginx RabbitMQ
文章目录 实战章节:在Linux上部署各类软件tar -zxvf各个选项的含义 为什么学习各类软件在Linux上的部署 一 MySQL数据库管理系统安装部署【简单】MySQL5.7版本在CentOS系统安装MySQL8.0版本在CentOS系统安装MySQL5.7版本在Ubuntu(WSL环境)系统…...
FFmpeg入门
在音视频处理领域,有一款神器级的工具横扫开发者圈,那就是 FFmpeg。它被誉为“音视频处理的瑞士军刀”,凭借强大的功能和开源的特性成为众多开发者和媒体从业者的首选。今天,我们就来聊聊 FFmpeg 的入门使用,带你轻松开…...
如何将 sqlserver 数据迁移到 mysql
文章目录 前言一、导出SQL Server 数据二、转换数据格式为MySQL兼容格式三、导入数据到MySQL数据库五、使用ETL工具六、通过 navicat 工具七、总结 前言 将 SQL Server 数据迁移到 MySQL 是一个常见的数据库迁移任务,通常涉及以下几个关键步骤:导出 SQL…...
【leetcode 13】哈希表 242.有效的字母异位词
原题链接 题解链接 一般哈希表都是用来快速判断一个元素是否出现集合里。 当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。 数组 set (集合) map(映射) 如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景…...
git - 用SSH方式迁出远端git库
文章目录 git - 用SSH方式迁出远端git库概述笔记以gitee为例产生RSA密钥对 备注githubEND git - 用SSH方式迁出远端git库 概述 最近一段时间,在网络没问题的情况下,用git方式直接迁出git库总是会失败。 失败都是在远端, 显示RPC错误。 但是git服务器端…...
21天学通C++——9.5复制构造函数
浅复制 复制类对象时只是单纯的复制所有的值,如指针只会复制指针的大小,而不会再开辟同一空间大小的内存,即两个指针指向同一片内存空间。 伪代码: class MyString { private:char*buffer; public:MyString(const char* initStri…...
GPT 系列论文精读:从 GPT-1 到 GPT-4
学习 & 参考资料 前置文章 Transformer 论文精读 机器学习 —— 李宏毅老师的 B 站搬运视频 自监督式学习(四) - GPT的野望[DLHLP 2020] 來自猎人暗黑大陆的模型 GPT-3 论文逐段精读 —— 沐神的论文精读合集 GPT,GPT-2,GPT-3 论文精读【论文精读】…...
【python】OpenCV—Local Translation Warps
文章目录 1、功能描述2、原理分析3、代码实现4、效果展示5、完整代码6、参考 1、功能描述 利用液化效果实现瘦脸美颜 交互式的液化效果原理来自 Gustafsson A. Interactive image warping[D]. , 1993. 2、原理分析 上面描述很清晰了,鼠标初始在 C,也即…...
elasticsearch集群部署
一、创建 elasticsearch-cluster 文件夹 创建 elasticsearch-7.6.2-cluster文件夹 修改服务es服务文件夹为node-001 修改config/elasticsearch.yml 配置文件 # Elasticsearch Configuration # # NOTE: Elasticsearch comes with reasonable defaults for most settings. # …...
python调用window库全屏截图生成bmp位图学习
import io import time import struct import ctypes s time.time() gdi32 ctypes.windll.gdi32 user32 ctypes.windll.user32# 定义常量 SM_CXSCREEN 0 SM_CYSCREEN 1# 缩放比例 zoom 1 screenWidth int(user32.GetSystemMetrics(SM_CXSCREEN) * zoom) screenHeight i…...
Wireshark使用
1.抓包过滤器--BPF语法 类型Type:主机(host)、网段(net)、端口(port) 方向Dir:源地址(src)、目标地址(dst) 协议Proto:各种…...
FLASK 上传文件
HTML form enctype"multipart/form-data" 编码类型说明application/x-www-form-urlencoded表单数据编码为名称/值对。 这是标准编码格式。multipart/form-data表单数据编码为消息,页面上每个控件都有单独的部分。text/plain表单数据以纯文本编码&#x…...
卷积神经网络
卷积神经网络 随着输入数据规模的增大,计算机视觉的处理难度也大幅增加。 64 64 3 64 \times 64 \times 3 64643 的图片特征向量维度为12288,而 1000 1000 3 1000 \times 1000 \times 3 100010003 的图片数据量达到了300万。随着数据维度的增加&am…...
SparrowRTOS系列:链表版本内核
前言 Sparrow RTOS是笔者之前写的一个极简性RTOS,初代版本只有400行,后面笔者又添加了消息队列、信号量、互斥锁三种IPC机制,使之成为一个较完整、堪用的内核,初代版本以简洁为主,使用数组和表作为任务挂载的抽象数据…...
【redis初阶】环境搭建
目录 一、Ubuntu 安装 redis 二、Centos7 安装 redis 三、Centos8 安装 redis 四、redis客户端介绍 redis学习🥳 一、Ubuntu 安装 redis 使用 apt 安装 apt install redis -y 查看redis版本 redis-server --version 支持远程连接…...
OpenCV相机标定与3D重建(54)解决透视 n 点问题(Perspective-n-Point, PnP)函数solvePnP()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 根据3D-2D点对应关系找到物体的姿态。 cv::solvePnP 是 OpenCV 库中的一个函数,用于解决透视 n 点问题(Perspective-n-Po…...
shell脚本回顾1
1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容,不存在则创建一个文件将创建时间写入。 一、 ll /tmp/size.log &>/dev/null if [ $? -eq 0 ];then cat /tmp/size.log else touch /tmp/size.log echo date > /tmp/size.log fi二、 if …...
HarmonyOS命令行工具
作为一个从Android转过来的鸿蒙程序猿,在开发过程中不由自主地想使用类似adb命令的命令行工具去安装/卸载应用,往设备上推或者拉去文件,亦或是抓一些日志。但是发现在鸿蒙里边,华为把命令行工具分的很细,种类相当丰富 …...
V少JS基础班之第四弹
一、 前言 第四弹内容是操作符。 本章结束。第一个月的内容就完成了, 是一个节点。 下个月我们就要开始函数的学习了。 我们学习完函数之后。很多概念就可以跟大家补充说明了。 OK,那我们就开始本周的操作符学习 本系列为一周一更,计划历时6…...
从前端视角看设计模式之创建型模式篇
设计模式简介 "设计模式"源于GOF(四人帮)合著出版的《设计模式:可复用的面向对象软件元素》,该书第一次完整科普了软件开发中设计模式的概念,他们提出的设计模式主要是基于以下的面向对象设计原则ÿ…...
网络应用技术 实验七:实现无线局域网
一、实验简介 在 eNSP 中构建无线局域网,并实现全网移动终端互相通信。 二、实验目的 1 、理解无线局域网的工作原理; 2 、熟悉无线局域网的规划与构建过程; 3 、掌握无线局域网的配置方法; 三、实验学时 2 学时 四、实…...
Kotlin 循环语句详解
文章目录 循环类别for-in 循环区间整数区间示例1:正向遍历示例2:反向遍历 示例1:遍历数组示例2:遍历区间示例3:遍历字符串示例4:带索引遍历 while 循环示例:计算阶乘 do-while 循环示例…...
B+树的原理及实现
文章目录 B树的原理及实现一、引言二、B树的特性1、结构特点2、节点类型3、阶数 三、B树的Java实现1、节点实现2、B树操作2.1、搜索2.2、插入2.3、删除2.4、遍历 3、B树的Java实现示例 四、总结 B树的原理及实现 一、引言 B树是一种基于B树的树形数据结构,它在数据…...