【测试工具JMeter篇】JMeter性能测试入门级教程(四):JMeter中BeanShell内置方法使用
一、什么是BeanShell
- BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
- BeanShell是一种松散类型的脚本语言(这点和JS类似);
- BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大小为175k。
- BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。
二、JMeter中有哪些BeanShell
-
定时器: BeanShell Timer
-
前置处理器:BeanShell PreProcessor
-
采样器: BeanShell Sampler
-
后置处理器:BeanShell PostProcessor
-
断言: BeanShell断言
-
监听器: BeanShell Listener
三、BeanShell元件所支持的变量
为什么要说这个?因为不同的Beanshell 支持的变量不一样,直接使用会报错。如下图,可以通过元件知道支持什么变量。
- BeanShell 取样器
SampleResult、ResponseCode、ResponseMessage、IsSuccess、Label、FileName、ctx、vars、props、log - BeanShell 预处理程序
ctx、vars、props、prev、sampler、log - 后置处理器:BeanShell PostProcessor
ctx、vars、props,prev、log - BeanShell断言
Read/Write: Failure、FailureMessage、SampleResult、vars、props、log
ReadOnly: ResponseData、ResponseCode、ResponseMessage、ResponseHeaders、RequestHeaders、SampleLabel、SamplerData、ctx - BeanShell 定时器
ctx、vars、props、log、prev - BeanShell 监听器
ctx、vars、props
方法类适用的元件:
方法名 | 适用元件 | 说明 |
---|---|---|
SampleResult | BeanShell 取样器、BeanShell断言 | 需要import对象 |
ResponseCode | BeanShell 取样器、BeanShell断言 | |
ResponseMessage | BeanShell 取样器、BeanShell断言 | |
IsSuccess | BeanShell 取样器 | |
Label | BeanShell 取样器 | |
FileName | BeanShell 取样器 | |
ctx | 所有元件 | |
vars | 所有元件 | |
props | 所有元件 | |
log | 除了监听器 | |
prev | BeanShell 预处理程序、后置处理器、定时器 | |
sampler | BeanShell 预处理程序 | |
Failure | BeanShell断言 | |
FailureMessage | BeanShell断言 | |
ResponseData | BeanShell断言 | |
ResponseHeaders | BeanShell断言 | |
RequestHeaders | BeanShell断言 | |
SampleLabel | BeanShell断言 | |
SamplerData | BeanShell断言 |
四、BeanShell的内置方法
beanshell常用API - 链接
每个方法里有说明对应的API,适用元件、适用例子,其中适用例子都是自己调试过的,可以直接复制粘贴使用。
1. log
JavaDoc
适用元件:除了监听器,其他元件都可使用。
log表示org.apache.log.Logger类,日志信息写入到jmeter.log文件。
- log.info("响应状态码" + ResponseCode);
- log.debug("调试信息");
- log.warn("警告信息");
- log.error("出错信息");
log.info("这里的信息会保存在jmeter.log文件中,并打印显示在jmeter的实时运行日志");System.out.println("这里的信息会输出到jmeter的控制台(黑框里)");
日志显示位置:
2. vars
JavaDoc
适用元件:所有元件
vars是于操作Jmeter变量,它是org.apache.jmeter.threads.JMeterVariables类的实例,提供对当前变量的读写。
所有的JMeter变量都是java字符串,如果需要把一些变量存放到一个JMeter变量中,需要先把它转换成字符串。
常用方法:
-
vars.get(String key); 从jmeter中获得变量值,如:vars.get("key"); 注意,需要用双引号,不能这样vars.get("${key}");
-
vars.put(String key,String value); 数据存到jmeter变量中,如vars.put("key","123456"); //变量名需要用双引号
-
vars.putObject("SAVED_ARRAY",[]); 赋值一个对象
-
vars.getObject(String key); 获取一个对象
读取object,
- 使用场景:读取JDBC request里的result variable names
- 如:vars.getObject("sql_order_ids").get(2).get("id"));
注意:vars接收的值必须是字符串类型, 若传递其他类型,包括null,都会报错;如果想使用数字,数字等类型,方法是做类型转换;例如:
vars.put("key1", "" + 1);
vars.put("key2", (String)1);
vars.put("key3", [2, 3, 4].toString());
vars.put("key4", (String)[1,2]);
vars.put("key4", "" + [2, 3, 4]);
vars.put("key5", "" + true);
vars.put("key6", true.toString());//列表字符串转为列表
String EsIdString = "13073895, 13082623, 16731457, 23075394, 20659718, 13082429, 13082482, 16731621, 16731576";
String[] ESsplist = EsIdString.split(", ");
List EsIdList = Arrays.asList(ESsplist);
int EsIdLen=EsIdList.size();vars.putObject("EsIdList",EsIdList);
vars.put("EsIdLen",""+EsIdLen);
3. props
适用元件:所有元件
作用:读写jmeter属性。注,只会在内存里创建、更新,不会在本地文件中创建、更新
props与vars对比差异
1、props是java.util.Properties的实例,与vars作用大致相同,区别的是 vars 是对变量进行读写操作, 而 props 主要是对属性进行读写操作。ps:侠义的属性指的是jmeter.properties、user.properties、jmeter.properties文件里的变量。
2、vars 只能在当前线程组内使用,props 可以跨线程组使用 ,因为属性可以跨线程组但是变量不行;
3、vars 只能保存 String 或者 Object,props 继承了 Hashtable 的类,所以拥有与 vars 类似的 get 和 put 方法,另外还继承了 Hashtable 的其他方法 ;
//判断某项属性是否存在,返回布尔值
props.containsKey("PROPERTY_NAME") //判断某项值是否存在,返回布尔值
props.contains("PROPERTY_VALUE")//删除某个值
props.remove("PROPERTY_NAME")//所有属性以字符串形式表示
props.toString()
常用方法:
- props.get(String) 可以获取Jmeter中已经生成的属性(静态变量);
- 如:props.get("START.HMS"); 注:START.HMS为属性名,在文件jmeter.properties中定义;
- 结合:测试计划 > 非测试原件 > 属性显示,查看当前jmeter环境存在的属性变量;
- props.put(String,String) 可以创建和更新JMeter属性。
- 如:props.put("PROP1","1234");
- 使用__P() 调用属性值,如:
${__P(PROP1,)}
获取全局属性的值。
4. ctx
JavaDoc
适用元件:所有元件
ctx是JMeter内置变量中最强大的变量。它代表org.apache.jmeter.threads.JMeterContext类,实际就是JMeter本身,它提供对采样器、执行结果、变量/属性等的读写。
- ctx 变量是JMeter JSR223功能最强大的内置变量之一,通过它可以轻松的访问当前线程的上下文;
- 在 JMeter 内部,ctx 映射为 org.apache.jmeter.threads 的 JMeterContext 类;
- 由于JMeterContext 不具有线程安全性,故仅适用于在单线程中使用;
常用方法:
- ctx.getVariables("变量名"):获取变量值(同vars.get()),空时,获取当前线程所有变量??
- ctx.setVariables("变量名", "变量值"):设置变量(同vars.put())
- ctx.getProperties("属性名"):获取属性值(同props.get())
- ctx.setProperties("属性名","属性值"):设置属性(同props.put())
- ctx.getPreviousResult():获取当前请求的请求结果(同prev)返回结果是SampleResult类型
- ctx.getCurrentSampler():获取当前采样器的请求信息,返回结果是Sampler类型
- ctx.getPreviousSampler():获取前一采样器请求信息,返回结果是Sampler类型
- ctx.getThreadNum():获取当前线程数,从0开始
- ctx.getThreadGroup():获取当前线程组
- ctx. getThread():获取当前线程
- ctx.getEngine():获取引擎
- ctx.isSamplingStarted():判断采样器是否启动
- ctx.isRecording():判断是否开启录制
- ctx.getSamplerContext():获取采样器上下文数据
使用示例1:
import org.apache.jmeter.samplers.SampleResult;//可以查看JavaDoc,ctx.getPreviousResult()返回值是SampleResult类型;
SampleResult result = ctx.getPreviousResult();// 获取取样器结果
String responseString = result.getResponseDataAsString();// 获取响应数据
String responseCode = result.getResponseCode();// 获取响应码
String RequestHeaders = result.getRequestHeaders();// 获取请求头
String ResponseHeaders = result.getResponseHeaders();// 获取响应头String request = ctx.getCurrentSampler().getPath(); //请求路径
String request = ctx.getCurrentSampler().getArguments().getArgument(0).getValue(); //获取json格式的请求参数log.info("获取取样器结果:"+responseString);
log.info("获取响应数据:"+responseCode);
log.info("获取响应码:"+RequestHeaders);
log.info("获取请求头:"+RequestHeaders);
log.info("获取响应头:"+ResponseHeaders);
使用示例2:
import org.json.*;
import org.json.JSONArray; //需要的Json jar包在文末的网盘
import org.json.JSONObject;
import java.util.*;
import org.apache.jmeter.samplers.SampleResult;SampleResult resultSampleResult = ctx.getPreviousResult();// 获取取样器结果
String responseString = resultSampleResult.getResponseDataAsString();// 获取响应数据
JSONObject responseJson = new JSONObject(responseString); //将String的response转为JSON对象
String now_follow_by = responseJson.getJSONArray("data").getJSONObject(0).getString("follow_by"); //获取当前跟进的规划师
5. SamplerData
适用元件:BeanShell断言
data和SamplerData就是sampler data(请求数据),其类型为byte[ ]
// byte与String类型转换 String s = new String(bytes);
String samplerData = new String(data); //String samplerData = new String(data,"UTF-8"); //有中文乱码处理
6. Label / SampleLabel
Label 适用元件:BeanShell 取样器
SampleLabel 适用元件:BeanShell断言
Label和SampleLabel是sampler的标题,其类型是String。
//LabelString Label_title=Label;
log.info(""+Label_title);//SampleLabel
String sampleLabel_title=SampleLabel;
log.info("Label_title:"+sampleLabel_title);
7. IsSuccess
适用元件:BeanShell 取样器
IsSuccess是一个反映采样器是否成功的java.lang.Boolean。如果设置为true,,否则,则为"失败"。
IsSuccess表示sampler的成功失败,其类型为boolean。
IsSuccess=true; //使采样器"通过"
IsSuccess=false;//使采样器"失败"
8. prev / SampleResult
JavaDoc
prev 适用元件:BeanShell 预处理程序、后置处理器、定时器
SampleResult 适用元件:BeanShell 取样器、BeanShell断言
prev和SampleResult是当前sampler的结果,其类型为SampleResult,它可以读写sampler的信息和控制sampler的行为。
prev常用方法
String RequestHeaders = prev.getRequestHeaders(); // 获取请求头
String ResponseHeaders = prev.getResponseHeaders(); // 获取响应头
String responseCode = prev.getResponseCode(); // 获取响应码
String responseData = prev.getResponseDataAsString(); // 获取响应数据
String ContentType = prev.getContentType() //获取取样器响应Content-Type首部字段的值域(包含参数)
log.info(RequestHeaders);
log.info(ResponseHeaders);
log.info(responseData);import org.apache.jmeter.samplers.SampleResult;
String samplerData= prev.getSamplerData(); //获取请求内容
log.info("getSamplerData=======:"+samplerData);//停止线程
prev.setStopThread(true);//使用场景:如果断言失败,后面的接口不需要再跑,直接是脚本停止
SampleResult常用方法
import org.apache.jmeter.samplers.SampleResult;
SampleResult resultSampleResult = ctx.getPreviousResult();// 获取取样器结果String responseData = SampleResult.getResponseDataAsString(); //获取响应数据
String responseCode = SampleResult.getResponseCode(); //获取响应码 HTTP: 200 、502、404等
String sampleLabel = SampleResult.getSampleLabel(); //接口名称
String url = SampleResult.getUrlAsString() ; //请求url
String samplerData = SampleResult.getSamplerData() ; //请求数据 ;请求url、请求body
String requestHeaders= SampleResult.getRequestHeaders() ; // 请求header
boolean status = SampleResult.isResponseCodeOK(); // HTTP 返回 200时为trueSampleResult.setSuccessful(false); //使请求失败
9. ResponseData
适用元件:BeanShell断言
ResponseData就是sampler response data(响应数据),其类型为byte []:
// String samplerData = new String(ResponseData); //byte与String类型转换 String s = new String(bytes);
String samplerData = new String(ResponseData,"UTF-8");//中文乱码处理
log.info("ResponseData"+samplerData);
10. ResponseCode/ResponseMessage
适用元件:BeanShell 取样器、BeanShell断言
ResponseCode、ResponseMessage 是响应报文的响应码和响应信息,其类型为String,可读可写;
log.info("响应码:"+ResponseCode);
log.info("请求头:"+ResponseHeaders);
11. Failure/FailureMessage/设置响应断言
适用元件:BeanShell断言
Failure和FailureMessage是BeanShell Assertion组件独有的内置变量,其作用是设置当前sampler的测试结果(成功或失败),Failure的类型是boolean,FailureMessage的类型是String。
结合if判断通过变量Failure=false或Failure=true来设置断言是否通过,当设置Failure=true时,还可以设置FailureMessage来设置失败原因。
变量说明:
- Failure = false; //断言成功 - 预期结果与实际结果一致
- Failure = true; //断言失败 - 预期结果与实际结果不一致
- FailureMessage = "断言失败描述";
使用示例1:对状态码断言
//状态码断言
log.info("状态码:" + ResponseCode);
if(ResponseCode.equals("200")){ Failure=false;
}
else{Failure=true;FailureMessage="响应状态码非200"; //指定失败原因
}
示例2:响应体包含特定字符
//获取响应数据
String response = prev.getResponseDataAsString();
log.info("响应体:" + response);
//响应数据包含
if(response.contains("登录成功")){Failure=false;
}
else{Failure=true;FailureMessage="响应数据不包含登录成功";
}
示例3:JSON响应体字段提取及断言
将String类型的响应体转为JSON对象并操作需要额外的jar包,可以使用org.json或gson,以json.jar为例,下载后将其放入JMeter/lib目录下,重启JMeter,添加BeanShell断言,如下:
//JSON响应断言
import org.json.*; //导入org.json包 //需要的Json jar包在文末的网盘
String response = prev.getResponseDataAsString(); //获取响应数据
JSONObject responseJson = new JSONObject(response); //转为JSON对象
String message = responseJson.getString("message");
log.info("响应message字段:" + message);
if(message.equals("成功")){Failure=false;
}
else{Failure=true;FailureMessage="响应message字段非成功";
}
json.jar百度下载 ,提取码:gard
12. FileName
适用元件:BeanShell 取样器
FileName是一个java.lang.String,它包含一个BeanShell脚本文件名(在BeanShell采样器的"脚本文件"节中输入的)。
13. Arguments对象
由于个人知识有限,没搞明白这个对象的原理,这里主要演示Arguments的使用场景:数据请求读取。
获取请求信息(在前置处理器使用):
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.config.Argument;//获取请求的 url
String url = sampler.getPath(); //json格式的请求数据
Arguments arguments = sampler.getArguments(); // 调用时注意sampler小写
String requestBody = arguments.getArgument(0).getValue();//表单格式的请求数据
Arguments arguments = sampler.getArguments();
String fileType =arguments.getArgument(0).getValue();
String fileName = arguments.getArgument(1).getValue();
简写(在后置处理器使用):
//不需要导入Arguments
String requestBody = sampler.getArguments().getArgument(0).getValue();; // 调用时注意sampler小写
//请求为表单
String fileType = sampler.getArguments().getArgument(0).getValue();
String fileName = sampler.getArguments().getArgument(1).getValue();
表单请求方式,获取请求的key和Value:
import org.apache.jmeter.config.Arguments;
import java.util.Map.Entry;Arguments args = sampler.getArguments();
Map map = args.getArgumentsAsMap();
log.info("==============:"+args.getClass().toString());
Iterator itor = map.entrySet().iterator();
while(itor.hasNext()){Entry entry = (Entry) itor.next();log.info("==========key:"+entry.getKey()); log.info("========Value:"+entry.getValue());
}
循环读取请求参数(表单请求的)
import org.apache.jmeter.config.Argument;
import org.apache.jmeter.config.Arguments;Arguments argz = ctx.getCurrentSampler().getArguments();
for (int i = 0; i < argz.getArgumentCount(); i++) {Argument arg = argz.getArgument(i);String a = arg.getValue();log.info("Value:"+a);vars.put("EMAIL",a);
}
五、经典实例
最好用一个我刚好在调的一个BeanShell应用结尾:
场景:在压力测试下,有这样的场景:有4个线程组1、2、3、4,比例分配依次是10%、20%、30%、40%,如果总并发需要分别尝试1000、2000、3000、4000就要都分别修改,可不可以只修改总并发一个地方,实现方式可参考如下:
1. setUp Thread Group里设置总并发
2. 分别配置线程组1、2、3、4(${__P(threads1,)})
3. 运行结果如下
BeanShell是很强大的,但是得对Java的基础知识有些基本了解才能很好地运用。同时运用的好,可以解决我们在测试过程中碰到的好些问题。
相关文章:
【测试工具JMeter篇】JMeter性能测试入门级教程(四):JMeter中BeanShell内置方法使用
一、什么是BeanShell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似);BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简…...
JavaScript 键盘控制移动
如果你想通过 JavaScript 实现键盘控制对象(比如一个方块)的移动,下面是一个简单的示例,展示如何监听键盘事件并根据按下的键来移动一个元素。 HTML 和 CSS: <!DOCTYPE html> <html lang"en">…...
如何预防服务器后台爆破攻击
服务器后台爆破(Brute Force Attack)是一种通过反复尝试用户名和密码组合,以非法获取系统访问权限的攻击方式。这种攻击不仅会消耗服务器资源,还可能导致合法用户被锁定或敏感数据泄露。为了有效预防服务器后台爆破攻击࿰…...
AI 写作(一):开启创作新纪元(1/10)
一、AI 写作:重塑创作格局 在当今数字化高速发展的时代,AI 写作正以惊人的速度重塑着创作格局。AI 写作在现代社会中占据着举足轻重的地位,发挥着不可替代的作用。 随着信息的爆炸式增长,人们对于内容的需求日益旺盛。AI 写作能够…...
【HarmonyOS】鸿蒙应用使用lottie动画
【HarmonyOS】鸿蒙应用使用lottie动画 一、lottie动画是什么? https://airbnb.design/lottie Lottie是由Airbnb团队开发的一个适用于iOS、Android、React Native、Web和Windows的开源动画库,用于解析使用Bodymovin导出为JSON的Adobe After Effects动…...
SQL面试题——腾讯SQL面试题 合并连续支付订单
合并连续支付订单 现有一张用户支付表:user_pay包含字段订单ID,用户ID,商户ID,支付时间,支付金额。如果同一用户在同一商户存在多笔订单,且中间该用户没有其他商户的支付记录,则认为是连续订单,请把连续订单进行合并,时间取最早支付时间,金额求和。 +----------+------…...
【docker】10. 容器操作案例
容器操作案例 容器基本操作 • 通过 nginx 镜像文件创建容器 • 容器的列举(包含正在运行的容器) # 发现此时 e7c33d9f5c61 这个容器运行的状态为 Up,即运行状态 rootLAPTOP-H2EI4I6A:~# docker container ls CONTAINER ID IMAGE COMMAND CREATED …...
postman测试
当然,以下是针对你提供的API层和Service层代码中涉及到的各个接口,如何使用 Postman 进行详细测试的指南。这个指南将帮助你理解如何配置 Postman 来测试这些接口,包括请求的构造、认证的处理、以及如何解读响应。 目录 准备工作接口测试指…...
【攻防实验】溯源与取证分析实验
溯源与取证分析实验 溯源取证分析作为网络攻防过程中重要环节,准确找到攻击者的入侵线索(尤其是攻击突破口、攻击IP地址、域名、工具等信息),对于企业或者团队安全运营团队来说都是必备技能。常规攻击取证过程中往往会结合流量、Web访问日志、终端系统或…...
【测试工具JMeter篇】JMeter性能测试入门级教程(七):JMeter断言
一、前言 在 JMeter 中,断言元件(Assertion)用于验证测试结果是否符合预期。断言元件可以检查服务器的响应数据,以确保它们符合期望的模式或值,从而验证性能测试脚本的正确性。断言元件通常在每个请求的响应中添加&am…...
Linux 常用命令
目录 一、ls 指令 二、pwd命令 三、cd 指令 1、cd 目录名 2、cd .. 返回上级目录 3、cd ~ 进入用户家目 4、cd - 返回最近访问目录 5、cd相对路径&&cd绝对路径 四、touch指令 五、mkdir指令 1、mkdir 目录名 创建一个目录 2、mkdir -p 递归创建多…...
汽车IVI中控OS Linux driver开发实操(二十八):回声消除echo cancellation和噪声消除Noise reduction
概述: 在当今高度互联的世界中,清晰的实时通信比以往任何时候都更重要。在远程团队会议期间,没有什么能像回声一样打断对话。当说话者听到他们的声音回响时,可能会分散注意力,甚至无法理解对话。即使是很小的回声也会产生很大的影响,仅仅25毫秒的振幅就足以造成声音干扰…...
003-SpringBoot整合Pagehelper
SpringBoot整合Pagehelper 一、引入依赖二、配置 application.yml三、配置 MybatisPlusConfig四、Controller五、ServiceImpl 一、引入依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</ar…...
零基础学安全--shell练习
目录 用shell写一个计算器 测试 一些小问题 n阶乘数 测试 拓展 写⼀个Shell脚本去筛选出eth0⽹卡的ipv4地址,并赋值⼀个变量输出 测试 无限重启 用shell写一个计算器 read -p "请输入数字a: " number1 read -p "请输入操作符…...
【专题】计算机网络之运输层(传输层)
1. 运输层协议概述 1.1 进程之间的通信 (1) 运输层的作用 运输层提供进程间的逻辑通信。 运输层的屏蔽作用: 运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),使应用进程看见的就是好像在两个运…...
【leetcode100】旋转图像
1、题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],…...
软件工程——期末复习(1)
名词解释: 名词解释--人月 答案:人月是软件开发工作量的单位,1人月表示1个程序员1个月的工作时间所开发的代码量。 请解释软件缺陷、错误和失败,并简单举例说明。 答案:缺陷(defect)指系统代…...
HTML5系列(3)--多媒体标签详解
前端技术探索系列:HTML5 多媒体标签详解 🎥 开篇寄语 👋 前端开发者们, 在前三篇文章中,我们探讨了 HTML5 的语义化和表单特性。今天,让我们深入了解 HTML5 的多媒体能力,看看如何构建强大的…...
Spring Boot 3.4.0 发布:功能概览与示例
Spring Boot 3.4.0 带来了许多增强功能,使现代应用开发更加高效、便捷和强大。以下是最新功能的完整概述,以及一些帮助您快速入门的代码示例。 1. 应用程序版本管理 Spring Boot 引入了 spring.application.version 属性,方便开发者设置和访…...
【Vue3】【Naive UI】<n-upload>标签
【Vue3】【Naive UI】标签 基本设置 【VUE3】【Naive UI】<NCard> 标签 【VUE3】【Naive UI】<n-button> 标签 【VUE3】【Naive UI】<a> 标签 【VUE3】【Naive UI】<NDropdown> 标签…...
7.代理模式(Proxy Pattern)
古朗月行 代理模式JDK动态代理代码示例原码分析 cglib动态代理代码示例源码分析 JDK cglib动态代理对比ClassLoader类的生命周期: 参考资料 唐 李白 小时不识月,呼作白玉盘。 又疑瑶台镜,飞在青云端。 仙人垂两足,桂树何团团。…...
【效果】回到顶部功能实现
实现效果: 相关代码: <template><div class"cats" :style"{ top: catsTop }" ref"cats" click"catTop"></div> </template> 样式: /* 回到顶部 - 小猫咪 */ .cats {posi…...
项目搭建+修改
一 : 在列表成功回调函数,追加数据中,添加修改的按钮 for (let x of res) {//追加数据$("#table").append(<tr><td><input type"checkbox" class"ck" value"\${x.uid}"></td><td>\${x.uid}</td>…...
GD库如何根据颜色生成纯色背景图
GD库是一个用于图像处理的PHP扩展模块,它提供了一系列函数来创建、编辑和操作图像。要使用GD库根据颜色生成纯色背景图,可以按照以下步骤进行: 一、检查并安装GD库 检查GD库是否已安装: 可以通过运行phpinfo();或在命令行中使用p…...
Python 网络爬虫入门全知道
一、引言 在当今数字化时代,网络上的数据量呈爆炸式增长。无论是进行数据分析、市场调研,还是开发智能应用,获取网络数据都变得极为重要。而 Python 网络爬虫就是一把打开网络数据宝库的利器。它能够自动地从网页中抓取我们需要的信息&#…...
MATLAB期末复习笔记(下)
目录 五、数据和函数的可视化 1.MATLAB的可视化对象 2.二维图形的绘制 3.图形标识 4.多子图绘图 5.直方图的绘制 (1)分类 (2)垂直累计式 (3)垂直分组式 (4)水平分组式 &…...
基于大数据爬虫数据挖掘技术+Python的网络用户购物行为分析与可视化平台(源码+论文+PPT+部署文档教程等)
#1024程序员节|征文# 博主介绍:CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老…...
【go】只读通道和只写通道
文章目录 概述1. 通道的方向2. 为什么会有只读通道和只写通道?3. 总结 概述 在 Go 中,只读通道和只写通道的概念通过通道的方向来实现。Go 语言允许你在函数参数中指定通道的方向,从而限制通道的使用方式,这样可以确保代码的清晰…...
带Burst AOT Settings移植问题
报错 burst问题 Burst AOT Settings 是 Unity 的 Burst Compiler 的一部分,用于预编译程序集(AOT,Ahead-Of-Time Compilation),以便在不支持 JIT(即时编译)的平台上运行,例如 iOS 和…...
Debezium日常分享系列之:Debezium Engine
Debezium日常分享系列之:Debezium Engine 依赖打包项目在代码中输出消息格式消息转换消息转换谓词高级记录使用引擎属性异步引擎属性数据库模式历史属性处理故障 Debezium连接器通常通过部署到Kafka Connect服务来运行,并配置一个或多个连接器来监视上游…...
运行 GreatSQL 时为什么要求关闭透明大页
在大部分运维规范中,一般都会要求在运行 GreatSQL/MySQL 的环境中要关闭透明大页,那么到底什么是透明大页,为什么要关闭,打开有什么风险吗? 在此之前,我也是有点懵的,本文试着回答这个疑问&…...
【Rive】Rive在Android上的简单应用
1 前言 Rive 是一款强大的矢量图编辑器,可以设计图形、也可以制作动画。Rive 提供了矩形、圆形、三角形、多边形、星形、钢笔、文字等工具来绘制各式各样的矢量图形;提供了平移、旋转、缩放等工具对矢量图形进行各种变换;提供了骨骼、约束、时…...
Base 崛起,SynFutures 或成生态系统中最具潜力应用
10月份的 Unchained Crypto 采访中,Solana 联合创始人 Anatoly 表示,通过观察活跃地址数、TVL、DeFi 版块、Meme 热潮和开发者生态等多个关键指标,察觉到 Base 势头正猛,成为以太坊生态最强劲的 L2。 11月下旬,小狐狸创…...
探索Go语言中的循环双向链表
简介 循环双向链表将双向链表的灵活性与循环结构相结合,使得每个节点都有一个指向前一个节点和后一个节点的指针,并且最后一个节点的Next指针指向头节点,形成一个闭环。本文将深入探讨如何在Go语言中实现和操作这种数据结构。 循环双向链表…...
Leetcode617.合并二叉树(HOT100)+Leetcode79. 单词搜索(HOT100)
链接 代码: class Solution { public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if(!root1)return root2;if(!root2)return root1;root1->valroot2->val;root1->left mergeTrees(root1->left,root2->left);root1->right merg…...
亚马逊云(AWS)使用root用户登录
最近在AWS新开了服务器(EC2),用于学习,遇到一个问题就是默认是用ec2-user用户登录,也需要密钥对。 既然是学习用的服务器,还是想直接用root登录,下面开始修改: 操作系统是࿱…...
使用Docker在Ubuntu 22.04上部署MySQL数据库的完整指南
使用Docker在Ubuntu 22.04上部署MySQL数据库的完整指南 在现代应用开发中,使用Docker来部署数据库已成为一种流行的做法。本文将详细介绍如何在Ubuntu 22.04系统上使用Docker部署最新版本的MySQL数据库,包括关键注意事项、详细步骤、闭坑指南以及总结。…...
算法笔记:力扣15、三数之和
思路: 实现代码 class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result new ArrayList<>(); Arrays.sort(nums); // 先对数组进行排序 for (int i 0; i < nums.length - 2; i) { /…...
perf list PMU 缓存事件
事件标识事件解释PMU事件路径l1d_cacheL1数据缓存的访问次数,L1缓存是CPU内部最快的缓存,位于距离CPU核心非常近的位置。armv8_pmuv3/l1d_cache/l1d_cache_lmiss_rd表示从L1数据缓存读取数据时发生缓存未命中的次数。armv8_pmuv3/l1d_cache_lmiss_rd/l1d…...
使用C#开发VTK笔记(一)-VTK开发环境搭建
一.使用C#开发VTK的背景 因为C#开发的友好性,一直都比较习惯于从C#开发程序。而长期以来,都希望有一个稳定可靠的三位工程数模的开发演示平台,经过多次对比之后,感觉VTK和OpenCasCade这两个开源项目是比较好的,但它们都是用C++编写的,我用C#形式开发,只能找到发布的C#组…...
2024Selenium自动化常见问题!
"NoSuchElementException"异常: 确保使用了正确的选择器来定位元素。可以使用id、class、XPath或CSS选择器等。 可以尝试使用find_elements方法来查找元素列表,并检查列表的长度来判断元素是否存在。 使用显式等待(WebDriverWait…...
考研英语翻译与大小作文
名词动化词 1 持有 harbor2 2 反映 mirror 3 缩短 bridge 4 使用 harness 5 掩饰 mask/veil 6 修改 tailor 7 汇集 pool 8 控制 curb 9 想象 picture 10 激发 trigger 拉丁…...
详解Rust异步编程
文章目录 多线程编程与异步编程对比并发模型对比分析异步编程基础概念及用法 Rust的异步编程通过async/await语法和Future特性提供了一种高效的方式来处理并发任务,尤其在I/O密集型操作中表现出色。async/await异步编程模型性能高,还能支持底层编程&…...
Vue + Element UI 实战技巧:如何实现 el-table 重新加载数据后折叠所有展开行
在 Vue 中使用 Element UI 的 el-table 组件时,如果你想要在数据重新加载后折叠所有行的展开状态,你可以通过维护一个数据属性来追踪哪些行是展开的,并在数据更新时重置这个属性。 以下是一个简单的示例来说明如何实现这个功能: …...
linux静态链接和动态链接
静态链接的特点 程序独立性高 静态链接是在程序编译时,将所有需要的目标文件以及它们所依赖的库文件中的代码和数据链接成一个可执行文件。一旦链接完成,这个可执行文件就包含了运行所需的全部内容,不依赖外部的库文件。例如,一个…...
计算机网络学习资料全攻略
计算机网络是计算机科学中一个非常重要的分支,它涉及到数据在计算机系统之间的传输和通信。随着互联网的快速发展,对计算机网络知识的掌握变得越来越重要。本文将为您提供一份全面的计算机网络学习资料指南,帮助您从基础到高级逐步深入学习。…...
第七课 Unity编辑器创建的资源优化_UI篇(UGUI)
上期我们学习了简单的Scene优化,接下来我们继续编辑器创建资源的UGUI优化 UI篇(UGUI) 优化UGUI应从哪些方面入手? 可以从CPU和GPU两方面考虑,CPU方面,避免触发或减少Canvas的Rebuild和Rebatch,…...
Go的简单问题问答
基础问题回答 Go 的主要特点是什么? 简洁:语法简化,减少复杂性。并发:内置 Goroutine 和 Channel,支持轻量级并发。静态类型:强类型语言,编译时检查错误。跨平台:编译生成独立的二进…...
SVN迁移至Git,保留commit提交记录
SVN迁移至Git 如何将 SVN 仓库迁移到 Git 并保留提交记录一、生成userinfo.txt二. 使用 git svn clone 命令迁移 SVN 到 Git2.1. 基本命令格式2.2. 示例:从 SVN 克隆到 Git参数说明:2.3 执行的过程遇到的窗口2.4. 迁移过程 三. 将 Git 仓库推送到远程 Gi…...
一站式指导:在Neo4j与PostgreSQL间实现高效数据同步
作者:后端小肥肠 🍇 我写过的文章中的相关代码放到了gitee,地址:xfc-fdw-cloud: 公共解决方案 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: 数据同步的艺术&#…...