自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 个人博客系统测试报告

2.通过模拟博客实现的简单的博客系统,该系统没有实现用户的注册功能,提前在数据库中保存用户的相关信息,通过查询数据库用户的信息进行校验,并且在前端页面所显示的个人头像也是固定的。博客的标题和时间都是完全的显示,但是由于可能存在内容较长的博客,所以在显示所有博客内容的时候,只是在前端显示内容的前100个字,所有的博客按照时间的降序进行排序。在博客列表页面点击"查看全文"按钮,页面跳转到与之对应的博客详情页,该页面根据数据库存储的内容,显示出该博客文章的作者、发布时间、标题以及全部的博客内容。

2023-10-11 20:26:12 138

原创 博客系统自动化测试

针对个人博客项目进行了测试,个人博客系统主要由四个页面构成:登录页、博客列表页、博客详情页、博客编辑页;主要系统功能包括:用户的登录注销、查看全部博客、编辑发布博客、查看博客详情、强制功能。现在使用selenium3和junit5以及WebDriver驱动器来完成博客系统的部分自动化测试。

2023-10-11 20:22:16 99

原创 My Batis

使用${}读取时,是可以完成相应的要求的,但是${}会存在SQL注入,并且使用${}的前提是可以被穷举的,所以此时两个方法都不合适。${} 的使用场景:当业务需要进行传递SQL命令时,只能使用${},不能是哦也能够#{},但是使用了${},那么传递的参数一定要被穷举,否则不能被使用。在xml中实现取数据时,此时的id和Param里面的要对应,并且Param里面的要和数据库对应。传递的是一个userinfo对象,在xml中取其中的参数也是用#{}进行读取。结论:#{}虽然是安全的,但是不能完全替代${}

2023-10-11 18:39:19 54

原创 Spring AOP

把切面想象成公司的老板,如老板定义这个公司的方向。

2023-10-10 11:07:49 34

原创 自动化测试selenium

①css选择器;②xpath选择器两个谁更好?css选择器更好一点,平常都使用css选择器,效率更高。webDriver提供了一系列的对象定位方法。

2023-10-07 20:28:03 38

原创 java-ee Spring更简单的读取和存储对象

如果类名的首字母是大写,第二个字母是小写,那么getBean里面的名称就是类名的第一个字母小写,其余字母大小写不变;2.注入的对象是不可变的,因为构造方法只加载一次;当一个类中多个Bean使用相同的名字,程序并不会报错,但是第一个Bean之后的对象不会在被存储到容器中(即按照代码的先后顺序执行)1.配置扫描路径:配置一下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解下能被正确的识别并保存到spring中。这个方法里面就解释了bean的命名规则,并且这个方法使用的是JDK中的。

2023-10-05 15:14:28 21

原创 java-ee Spring

所以此时想要再次修改轮胎的大小时,直接修改tset里面的构造方法即可,不需要因为底层代码的变动而修改全部代码,所以说Ioc实现了解耦。依赖注入和控制反转都是从不同的角度描述同一件事情,就是指通过引入Ioc容器,利用依赖关系注入的方式,实现对象之间的解耦。可以发现,修改了最底层的代码,上面的所有代码有需要发生变化。下面这个代码是模拟实现Ioc的,实际上的Ioc并不是程序员的业务需求,不需要程序员编写。此时轮胎大小是固定的,每个人对轮胎的大小需求就不一样,所以就不能让轮胎的大小是固定的。传统的构造汽车的方法。

2023-10-02 20:50:47 21

原创 java-ee JVM

当Application ClassLoader这个加载器收到了类加载的请求,它先不会去执行这个请求即不会自己尝试去加载这个类,而是把这个请求委派给父类Extension ClassLoader这个加载器,此时这个Extension这个加载器也不会自己尝试加载这个类,也是把这个请求委派给父类Bootstrap ClassLoader,这个加载器也是如此。根据对象存活周期的不同将内存划分为新生代和老年代。当这个内存需要进行垃圾回收时,将不是垃圾的复制到另外一块区域上,然后把使用的这一块内存进行垃圾回收处理。

2023-10-01 15:07:54 57

原创 javaee-HTTPS

当客户端收到当前公钥(pub2)时,通过这个公钥(pub2)对自己的对称密钥(key)进行加密,发送给服务器,此时中间攻击人通过自己的密钥(pri2)对该密文解密得到了客服端的对称密钥(key),并且将该密钥再次通过当时保留的服务器的公钥(pub1)进行加密发送回去给服务器,服务器可以通过自己保留的密钥(pri1)将该密文解密获取到客户端的对称密钥(key),此时中间攻击人获取到了客户端的对称密钥,当客户端和服务器再使用这个密钥key加密传输的数据内容时,中间攻击人也能对加密的内容进行解密,也是不安全的。

2023-09-24 10:21:05 99

原创 javaee-HTTP协议

Header:请求的属性,冒号分割的键值对,每个属性之间使用\n分隔,遇到空行表示Header部分结束(注意:这个Accept-Language:本质上是一行,只是这个文本自动进行换行了)Header:请求的属性,冒号分割的键值对,每个属性之间使用\n分隔,遇到空行表示Header部分结束。body:此时为服务器返回了一个html页面,则html页面里的内容就是body中的内容。body正文:此处的请求方法是get,一般没有正文。表示服务器主机的地址和端口号,描述了访问目标。

2023-09-23 10:55:24 107

原创 java-ee TCP

如当主句B接收到数据1-1000,但是数据1001-2000发生丢失时,主机B会一直发送确认应答(1001),让主机A发送1001-2000的数据,当主机A发送数据到5000时,此时连续接收到三次同样的确认应答机制时,会将丢失的数据重新发送,当主机B接收到数据1001-2000的数据,因为主机A发送的数据到了5000,所以此时主机B的确认应答就是5001.如主机A发送的数据编号由1-1000,主机B接收到数据之后,将返回一个ACK,并且确认序列号为1001,即告诉主机A即将要发送的数据从哪里开始。

2023-09-18 17:15:22 105

原创 java-ee三次握手/四次挥手

四次挥手,ACK和FIN是不同时机触发的,ACK是由内核完成的会在收到FIN的时候第一时间返回,FIN是应用程序代码控制的,在调用到Socket的Close方法的时候,才会触发FIN。建立连接一定是客户端主动发起的,断开连接可能是客户端也可能是服务端。三次握手,ACK和SYN是同一时机触发的,都是由内核完成。SYN:同步报文段,一方要向另一方申请建立连接。握手:通信双方进行一次网络交互。TCP是如何实现可靠性的?

2023-09-17 18:40:39 38

原创 java-ee网络原理1

(比如上网买一个快递,快递起始位置是福建,目的地是广西,假设从福建发货要走这一条路线:福建-广东-广西,首先快递先从福建-广东,其次在从广东-广西,即两个相邻节点指点的传输)到达目的主机后每层协议在剥掉相应的首部,根据首部中的"上层协议字段"将数据交给对应的上层协议处理。①分层之后,层次之间耦合程度比较低,上层不需要理解下层的细节,下层不需要了解上层;(接收方接收数据,要把数据从下到上依次交给对应的层次协议,进行分析(分用))(发送方发送数据,要把数据从上到下依次交给对应的层次协议,进行封装)

2023-09-17 18:14:37 70

原创 java-ee UDP/TCP

/respond.getBytes()响应结果内容的起始位置,respond.getBytes().length响应结果内容的长度。,第一个参数是数据报的内容,第二个参数是想要发送数据报内容的起始位置,第三个参数是想要发送的数据报长度,第四个参数是指定目的主机的端口号和ip。//requestPacket.getData()获取到数据包的内容,从0位置开始,到这个数据包的长度。//计算的响应结果放到响应的数据包中,构造响应要指定将这个数据报发送给谁。//构造发送数据报,要指定目的主机的ip和端口号。

2023-09-16 17:19:07 116

原创 java-ee线程池

ExecutorService是一个接口,不能够直接实例化,通过Executors这个类的静态方法来实现实例化。newSingleThreadExecutor:创建中包含单个线程的线程池。③DiscardOldestPolicy:丢弃最古老的任务,即队首的线程。②CallerRunsPolicy:添加的线程自己负责添加执行这个任务。threadFactory:线程工厂,用来创建线程的一个辅助类。newFixedThreadPool:创建固定线程数量的线程池。线程池的优点:减少每次启动、销毁线程的损耗。

2023-09-15 07:19:27 100

原创 测试概念1

star -> 需求分析 -> 计划 -> 设计 -> 编码 -> 测试 -> end。当前仅当软件需求的规格说明正确并存在,程序和规格说明之间不匹配就是错误。需求分析 -> 计划 -> 设计 -> 编码 -> 测试 -> 运行维护。甲方提出来的要求或者没有甲方时终端用户使用产品时必须完成的任务。特点:瀑布模型的每一个阶段只执行一次,是线性顺序进行的。缺点:风险管理的技能水平提高,需要人员和资金的投入。优点:每个阶段的工作明确并且每个阶段的产出也清晰。缺点:测试介入的晚风险发现的晚。

2023-09-13 15:53:46 113 1

原创 javaEE多线程3

针对锁进行编号,如果需要同时获取多把锁,约定加锁顺序,务必是先对小的编号进行加锁,后对大的编号进行加锁。自旋锁:是轻量级锁的一个典型实现,一旦锁被释放就能立即能拿到锁,但是消耗CPU的资源。①一个线程一把锁,如果是可重入锁,则不会发生死锁;挂起锁:是重量级锁的一个典型实现,锁被释放不能立马拿到锁,不消耗CPU的资源。③自旋锁是轻量级锁的一种典型实现,挂起锁是重量级锁的典型实现。不可重入锁:允许一个线程多次获取同一把锁,但是产生死锁。②两个线程两把锁,就算是可重入锁,必然也会发生死锁。

2023-09-12 21:57:04 46 1

原创 java-ee阻塞队列

阻塞队列是一种特殊的队列,是一种线程安全的数据结构,并且也遵守“先进先出的”原则。①当队列为空时,继续出队就会发生阻塞,直到有其他线程往队列里面添加元素。②当队列为满时,继续入队就会发生阻塞,直到有其他线程从队列中取走元素。BlockingQueue是一个接口,不能被实例化。take():是取走队列里面的元素。put():是向队列里面添加元素。此时生产者和消费者是同步的。

2023-09-10 21:20:18 31 1

原创 javaEE多线程2

在thread1线程加锁后,执行了instance = new Singleton()这句代码,此时instance的值不在是null,thread2线程的instance的值也将被修改,当thread1线程释放锁时,由于instance的值不再是null,所以thread2线程将不再执行instance = new Singleton()这句代码。在上面的代码中,饿汉模式的线程是安全的,因为getInstance()这个方法里面只是读取了instance这个实例,并没有对其进行修改。

2023-09-10 09:00:00 141 1

原创 javaEE多线程

②run()方法是一个类中的普通方法,是线程的入口,不需要程序员手动调用。start()方法内部会调用Java本地的方法,真正启动线程,并执行run()方法中的代码。当另外的一个线程对内存变量进行修改的时候,原来的线程由于代码的优化而感知不到内存变量发生的改变即内存可见性。比如“++”操作不是原子的,因为“++”操作的CPU指令有:load:读取内存的变量 Add:使变量执行++操作 save:将变量保存回内存中。②wait是Object的方法,sleep是Thread的方法。③修改操作不是原子的。

2023-09-09 15:02:57 124 1

原创 java接口

此时的两栖动物就可以直接实现IAmphibious这个接口,同时也要重写这个接口中的抽象方法。继承了IRunning和ISwimming的接口功能,同时也可以有自己的接口功能。成员方法:接口的方法默认为:public abstract,并且只能有抽象方法。例如:狗可以跑、猫可以跑、人可以跑,所以可以定义一个“跑”的接口。接口中的方法都是抽象方法,所以一个类在实现一个接口时,就要。一个类可以实现多个接口,实现的两个接口之间用逗号隔开。接口:多个类的公共规范,是一种引用数据类型。鼠标类:实现USB接口。

2023-09-08 18:32:29 165 1

原创 javaEE线程

同一个进程里的多个线程之间,一个线程阻塞可能影响整个进程,并且影响其他的线程。③进程有独立的内存空间和文件描述符表,同一个进程中的多个线程之间共享同一份内存空间和文件描述符表。run方法是一个特殊的方法,只能被自动调用,在myThread里面的其它普通方法,必须要手动调用。Runnable是一个接口,这个接口里面的方法都是抽象方法,所以要重写抽象方法。②进程包含线程,一个进程可以包含多个线程,每个进程至少存在一个线程。run方法重写父类的方法,是线程的入口方法。匿名内部类创建Runnable子类对象。

2023-09-07 18:16:27 22 1

原创 java抽象类

原因:抽象类存在的最大意义就是被继承,继承这个抽象类实现重写,而被private、final、static修饰的方法不能被重写。若子类继承抽象类不重写父类的抽象方法,那么这个子类也是抽象类,必须使用abstract修饰。抽象类:如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。若想要使用,只能通创建抽象类的子类,然后让子类重写重写抽象类中的抽象方法。2.被abstract修饰的方法,没有方法体,即可以不写具体的实现。④抽象类存在的最大意义就是被继承,所以抽象类必须被继承。

2023-09-07 15:45:00 22 1

原创 java多态

注意:当我们发生向上转型之后,此时通过父类的引用,只能访问父类自己的成员,不能访问子类特有的成员,比如:wangwang() 这个成员方法。理论上赋值等号的两边应该为同一类型,否则赋值失败。①父类中被static、private、final修饰的方法、构造方法都不能重写。向上转型:创建一个子类对象,把它当作父类对象来使用。此时实参传的是Dog类型的,形参用Animal类型来解释。此时子类和父类中的eat()方法就构成了重写。②子类的访问修饰限定权限要大于等于父类的权限。③子类必须对父类的方法进行重写。

2023-09-07 09:00:00 88 1

原创 java继承

此时Dog和Cat继承了Animal这个类,子类可以复用父类中的成员,在Dog类和Cat类中的name和age就是从父类继承过来的。从上面的代码中,并没有发现基类的构造方法和子类的构造方法,是因为系统提供了一个默认的构造方法,此时我们也可以自己写上显示的构造方法。此时在子类中写了调用基类的构造方法,但是发现中间并没有采用super。除了可以继承父类中的成员变量,也可以继承父类中的成员方法。super.func():在子类中访问父类的成员方法。从代码中可以发现,狗和猫的类中都有相同的成员变量。

2023-09-06 17:48:01 150 1

原创 进程、进程调度

进程每次打开一次文件,都会产生一个“进程描述符”,一个进程会打开很多文件,就会产生一组文件描述符,把这一组文件描述符放到一个顺序表的结构里面,就是文件描述符表。进程在离开CPU时就要把运行中间的结果“存档”,在进程回来到CPU上时,就从上次“存档”的结果开始运行。每一个进程都有唯一一个进程标识符,相当于进程的id。该进程已经准备好,随时可以上CPU。统计每个进程在CPU上执行了多少次。当前这个进程使用的内存是哪一部分。是程序的一次执行过程,是。该进程还不能上CPU。先执行优先级高的进程。

2023-09-06 16:44:11 17 1

原创 java类和对象

原因:因为用户自己定义了一个有参的构造方法,所以编译器会优先使用用户自己定义的构造方法,并且不再生成无参的构造方法,但是在实例化时没有给值说明调用无参的构造方法,所以此时编译器报错。通过上述代码发现,每次想要给一个对象进行设置姓名和年龄的时候,总需要采用“对象名+·"去实现,在代码实现上有些繁琐,此时可以"将给姓名和年龄赋值"放在一个方法里面。在 Demo1 demo1 = new Demo1() 这句代码中,实例化对象此时会调用对象的构造方法。行为:吃饭、睡觉……人:属性:姓名、年龄……

2023-09-05 16:18:43 101 1

原创 java引用类型

当我们创建一个数组的时候,实际是int[] array = new int[] {1,2,3,4,5},new创建的对象都是在堆上保存的,而在栈上array1存放了对象的地址。当将array1赋值给array2时,实际时将对象的地址赋值给了array2,说明。new即创建了一个对象并给它分配了地址,并且将该产生的地址赋值给我了array2,所以原先array2里面所存的地址会被修改,array是引用变量,对象是{1,2,3,4},array中存放的并不是{1,2,3,4},而是对象的地址。

2023-09-04 21:50:02 118 1

原创 java数组

/申请了10个空间大小的数组并且没有初始化,里面的元素都为0。//申请了4个空间并初始化的数组。数组在内存中是一段连续的空间,数组的下标从0开始。可以通过下标访问数组的元素。字符类型的数组里面元素默认存放的是"/u0000"③采用Arrays:该类包含用于操作数组的各种方法。int[]:数据中元素的类型、array:数组名。布尔类型的数组里面元素默认存放的是false。int x :表示数组中每个元素的类型变量。数组:是用来存放相同类型元素的集合。

2023-09-04 12:02:45 16 1

原创 内存和外存(硬盘)的区别、客户端和服务端、请求和响应

例如:我去奶茶店点了一杯奶茶,老板立马给我做了一杯奶茶,此时我就是客户端,老板就是服务端,我想老板发起的请求是做一杯奶茶,老板立即响应我的请求给我做了一杯奶茶。客户端发起的数据就是请求,服务端返回给客户端的数据就是响应。④内存的数据断电后会丢失,外存断电后还在。①内存的运行速度快,外存的运行速度慢。谁主动谁就是客户端,谁被动就是服务端。②内存的空间小,外存的空间大。③内存的成本高,外存的成本低。

2023-09-03 21:15:00 50

原创 java-猜数字游戏

系统自动自动生成一个随机数(1-100),然后由用户输入一个猜测的数字,如果输入的数字比该随机数小,提示"猜小了";如果输入的数字比该随机数大,提示"猜大了";如果输入的数字和该随机数一样,提示"猜对了"。从代码中可以发现,使用的nextInt是第二个,系统生成随机数采用java自带的工具。左闭右开[0,100)注意:生成的随机数是。

2023-09-03 17:00:00 442

原创 java从键盘输入Scanner

使用Scanner输入整型、字符串类型、浮点数类型,并且使用结束要将该工具关闭scanner.close。从运行结果可以看出,使用scanner.next读取字符串时,遇到空格就不在读取后面的数据。从上面代码可以看出,当先输入年龄,再输入姓名的时候,系统直接跳到了输入工资这条语句。读取输入的浮点数数据:scanner.nextFloat()读取输入的字符串数据:scanner.nextLine()读取输入的整型数据:scanner.nextInt()将回车读取,在进行读取用户输入的姓名。

2023-09-03 11:02:52 474

原创 java移位运算符

当右移1位时,最右侧位不要,此时a的值为正数,所以在最左侧补0:000 0101,此时值为:5;当左移1位时,最左侧位不要,在最右侧补0:0001 0100,此时值为:20;即10*2^1 = 20。特列:-1右移仍然是-1(-1的补码:1111 1111)注意:左移是丢弃的是符号位,所以正数左移可能会变成负数。10的八位二进制表示形式为:0000 1010。左移相当于乘法,左移几位相当于乘以2的几次方。右移相当于除法,右移几位相当于除以2的几次方。当数值左移、右移时,先将数值转化为其。

2023-09-01 09:05:47 30 1

原创 java数据类型

此时会出现编译错误,虽然int和float都是占4个字节,但是float可以表示小数,而int只能表示整数,float能表示的范围比int广。一共有32个比特位,第一位是符号位,剩下31位是数值位,所以int能表示的范围是-2^31~2^31-1。解释:在java里面char之能用来表示字符,所以一共有16位比特位表示,没有符号位,所以char表示的范围为。整型:byte(1个字节)、short(2个字节)、int(4个字节)、long(8个字节)解释:一个int占4个字节,4byte=32bit。

2023-08-31 19:31:25 16

原创 java第一课

①.源文件(扩展名为:*.java)、②.类、③.方法。类存在于源文件中,方法存在于类中,语句存在于方法中。JDK包含了JRE、JVM,JRE包含了JVM。JDK:java开发工具包,提供给程序员用的。包含数字、字母、下划线、美元符号等。JRE:java运行时环境。JVM:java虚拟机。

2023-08-30 17:27:23 18

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除