- 博客(37)
- 收藏
- 关注
原创 边界值的概念
边界值是指对于输入等价类和输出等价类而言稍高于其边界值及稍低于其边界值的一些特定情况。边界值分析法是常用的的黑盒测试方法,因为大量的错误是发生在输入或输入范围边界上,而不是在输入的范围内部。找到测试数据的边界点,也就是有效等价类和无效等价类的边界点,对边界点数据专门进行测试。
2023-12-01 12:58:44 707
原创 @ControllerAdvice
ControllerAdvice是Spring3.2中新增的注解,它被定义为一个Controller增强器,可以用来对Controller中使用@RequestMapping注解的方法进行逻辑处理。统一的异常处理:可以结合@ExceptionHandler注解使用,当异常抛到controller层时,可以对异常进行统一的处理,规定返回的json格式或者跳转到指定的错误页面等。统一的前置处理:可以结合@ModelAttribute注解使用,表示其注解的方法将会在目标Controller方法执行之前执行。
2023-12-01 12:55:51 335
原创 MyBatis 的注解实现方法
SelectProvider、@InsertProvider、@UpdateProvider 和 @DeleteProvider:用于指定动态 SQL 语句的提供器类或方法。例如:@Update("UPDATE users SET name=#{name}, age=#{age} WHERE id=#{id}")。例如:@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")。例如:@Param("id") String id。
2023-11-25 17:00:03 426
原创 #{} 和 ${} 之间的区别
</span><span class="mord">‘</span><span class="mord cjk_fallback">:这是在许多语言(如</span><span class="mord mathnormal" style="margin-right:0.09618em;">y
2023-11-21 16:14:06 100
原创 Mybatis的xml
5.加载映射器:最后需要将MyBatis的配置文件和Mapper接口的XML文件加载到Java程序中。MyBatis是一个基于Java的持久层框架,它通过XML配置文件来实现SQL语句的映射和执行。3.配置数据源和事务管理器:在MyBatis的配置文件中,通过和标签来配置数据源和事务管理器。2.编写Mapper XML文件:在Mapper接口对应的XML文件中,通过。4.映射器配置:在MyBatis的配置文件中,通过标签来配置映射器。
2023-11-14 16:21:59 43
原创 注入的几种方式和优缺点
构造方法注入是通过在类的构造方法中添加参数,参数类型为需要注入的Bean对象的类型。构造方法注入的优点是完全符合单一职责设计原则,一个构造方法只能针对一个对象进行依赖注入。Setter方式注入是通过使用@Autowired注解标注set方法来从Spring容器中获取Bean对象,并将其赋值给类的属性。注入对象可被修改,因为set方法是一个普通方法,可以被重复调用,存在被修改的风险。对象注入主要有三种方式:属性注入、构造方法注入和Setter方式注入。与属性注入相同,无法注入一个不可变的对象。
2023-11-07 20:43:00 193
原创 实现储存bean功能的原因
提供更多的功能:Spring框架本身提供了很多功能,而每个功能都有其特定的注解,这使得开发者可以根据需要选择使用不同的注解来实现不同的功能。总之,Spring提供这么多注解是为了简化开发过程、提高代码的可读性和可维护性、提供更多的功能以及便于自定义和控制。便于自定义和控制:Spring框架提供了很多可扩展的注解,这使得开发者可以根据自己的需要自定义和控制注解的行为。提高代码的可读性和可维护性:通过使用有意义的注解,可以让代码读者更容易理解代码的目的和用途。
2023-11-04 11:21:43 40
原创 Bean的相关注解
Component:这是Spring中最基本的注解,用于将普通的Java类声明为Spring组件。@ComponentScan:这个注解用于指定Spring自动扫描的包路径,以查找带有@Component、@Service、@Repository等注解的类。这些注解都可以用来在Spring容器中存储和管理Bean,通过使用这些注解,我们可以更方便地将普通的Java类集成到Spring应用中。@Configuration:这个注解用于标记配置类,通常用于定义Bean和配置Spring。
2023-11-04 11:20:25 56
原创 测试与开发区别
阶段:测试贯穿于软件生命周期的整个阶段,包括需求分析、设计、编码、集成和发布等阶段。人员:测试通常由专门的测试人员完成,他们使用特定的测试工具和方法来执行测试。目的:测试的目的是发现软件中的问题,即识别错误和漏洞。调试则是定位和解决错误的过程,即修复软件中的问题。预期结果:测试从已知条件开始,使用预定义的过程,并且有预期结果。总体而言,调试和测试都是软件开发过程中重要的环节,但它们的目的、人员、预期结果、过程和阶段都有所不同。过程:测试可以预先计划,可以制订测试用例和计划,进度可以度量。
2023-10-18 17:24:50 128
原创 Linux基本操作指令
Linux基本命令可以分为目录操作、文件操作、查看登录用户、文件内容查看、系统管理类命令、日期时间管理类命令。4.touch:创建一个新文件或更新已有文件的时间戳。2.pwd:显示当前工作目录的绝对路径。3.ls:列出当前目录中的文件和子目录。1.who:显示当前登录系统的用户列表。2.w:显示当前登录用户的进程信息列表。4.mkdir:创建目录。5.rmdir:删除目录。1.cp:复制文件或目录。2.mv:移动文件或目录。3.rm:删除文件或目录。1.cd:切换目录。
2023-10-12 22:22:46 38
原创 Cookie和session
创建会话:在用户请求中获取cookie里面的sessionId字段,如果sessionId在当前服务器上不存在,则创建新的HttpSession对象,并生成一个sessionId(一串很长的十六进制数,保证唯一性),将这个sessionId作为键,将HttpSession对象作为值,保存到服务器内存中的“哈希表”结构中。获取会话:获取请求中的cookie里面的sessionId字段(也就是会话的身份标识),判定这个sessionId是否在当前服务器上存在(也就是在这个“哈希表”中是否有)。
2023-09-24 21:52:45 75
原创 Servlet的生命周期
service:收到http请求时调用,每次收到请求,都会执行service处理每个请求。init:在HttpServlet实例化之后被进行调用,进行一些初始化操作。1.webapp刚开始被加载的时候,调用servlet中的init方法。3.webapp每次要结束的时候,调用destory方法。destory:当HttpServlet不再使用时调用。2.每次收到请求时,都会调用service方法。
2023-09-19 17:44:14 42
原创 HTTPS加密流程
3.客户端解析证书:由于客户端操作系统中内置了所有权威证书机构的名称和公钥,由此解析出证书信息,并通过证书中提供的签名计算方法函数计算出信息摘要,然后与服务器发来的解析证书数字签名后所得的信息摘要进行对比,如果对比结果一致,表示证书有效,否则如果发现异常会弹出一个警告框提示证书存在问题。4.客户端发送密钥信息给服务器:在对比结果一致的情况下,客户端便可以再次通过机构的公钥解析得到服务器的公钥,并利用对称加密生成一个密钥,然后利用服务器的公钥对密钥进行加密,并发送给服务器。
2023-09-17 14:46:15 39
原创 HTTP协议基本格式
请求报头(header)/响应报头(header)在tools将https打开,全部勾选,然后在右侧进行观察,右上为请求,右下为响应。请求正文(body)/响应正文(body)使用fiddler抓包工具,
2023-09-11 16:58:43 43
原创 数据链路层
我们从物理层了解到,物理层发送的数据,叫做比特流,是连续的,但我们换个角度想想用户不可能靠着一堆比特流,就像010101010101连续不断的来看我们的数据吧,所以就像我们说话,要把话讲清楚,就得把话分开,所以我们这里要把数据变成一段一段的,这样我们才知道我们说的话,什么时候是开始,什么时候是停下来的,这就叫封装成帧。(2).数据链路 (data link):除了物理线路外,还必须有通信协议来控制这些数据的传输。(1).链路 (link) :是一条无源的点到点的物理线路段,中间没有任何其他的交换结点。
2023-09-10 12:13:57 33
原创 NAT机制
作用:NAT能够将私有IP对外通信时转为全局IP。很多学校,家庭,公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全 局IP;全局IP要求唯一,但是私有IP不需要;在不同的局域网中出现相同的私有IP是完全不影响的;3.不方便直接访问局域网内的设备。优缺点:纯软件实现(核心)
2023-09-10 12:11:29 44
原创 Ip协议
时间单位并不是秒(s),而是IP数据报能被传多少次来衡量的,每传一次TTL就减一,直到IP数据报送到为止,如果TTL为0时,IP数据报没有送到,则IP数据报会被认为丢失了。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的(同一个包被拆分,他们的标识是一样的)4bit表示最大的数字是15,因此IP头部最大长度是60字节,最小的长度是20字节。4位版本号:当前IP协议的版本,IP协议的版本号有2种,IPV4和IPV6。***8位服务类型:***有四位是有效的,另外四位是保留位。
2023-09-09 14:02:46 38
转载 Tcp网络协议
第三次握手:Client 收到确认后,检查 ACK 是否为 J+1,ACK 是否为1,如果正确则将标志位 ACK 置为1,ACK=K+1,并将该数据包发送给 Server,Server 检查 ACK 是否为 K+1,ACK 是否为1,如果正确则连接建立成功,Client 和 Server 进入 ESTABLISHED 状态,完成三次握手,随后 Client 与 Server 之间可以开始传输数据了。其它大部分情况下,HTTP 都是用 TCP,因为要求传输的内容可靠,不出现丢失的情况。
2023-09-06 17:15:40 61 1
转载 UDP的报文结构及注意事项
UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;UDP本身是无连接,不可靠,面向数据报的协议,如果要基于传输层UDP协议,来实现一个可靠传输,应该如何设计?UDP用于对高速传输和实时性要求较高的通信领域,例如,早期的QQ,视频传输等。UDP大小是受限的,如果要基于传输层UDP协议,传输超过64K的数据,应该如何设计?应用层交给 UDP 多长的报文, UDP 原样发送,既不会拆分,也不会合并;16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度;
2023-09-05 17:24:17 103 1
原创 网络基本概念
局域网通常挨得很近,它是目前应用最广泛的一类网络。2)信息的传输速率比较高,其范围自1Mbps 到10Mbps ,已达到100Mbps。而广域网运行时的传输率一般为2400bps 、9600bps 或者38.4kbps 、56.64kbps。WAN由两个以上的LAN构成,这些LAN间的连接可以穿越30mile *以上的距离。大型的WAN可以由各大洲的许多LAN和MAN组成。最广为人知的WA N 就是Internet,它由全球成千上万的LAN和WAN 组成。1)网络所覆盖的地理范围比较小。
2023-09-02 13:56:52 69 1
原创 File,Inputstream,OutputStream
public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。public File[ ] listFiles()︰返回一个FiLe数组,表示该FiLe目录中的所有的子文件或目录。public String[ ] list()︰返回一个String数组,表示该FiLe目录中的所有子文件或目录。public string getName():返回由此File表示的文件或目录的名称。
2023-09-01 21:29:59 86 1
原创 HashMap,Hashtable以及concurrentHashmap之间的区别
而ConcurrentHashMap的锁策略在于为每一个哈希桶都分配一把锁(在哈希桶的头结点),这样就只有多线程在同一个哈希桶内进行修改时会发生锁冲突,因为链表结构前后数据会有关联.,所以锁冲突大大降低了。HashTable和ConcurrentHashMap是线程安全的,其中HashTable在多线程中不推荐使用,而后者则是多线程使用哈希表的最优解,这两者key不允许为null。带来的缺点在于:1.在多个线程修改变量中会发生锁冲突,即使不在一个哈希桶里。3.size属性同步时也会发生锁冲突,造成效率慢。
2023-08-31 14:05:15 36
原创 锁策略
自旋锁:获取锁失败,立即再次尝试获取锁,无线循环,一旦锁被释放,能第一时间感知到,从而获取到锁. 第一次获取锁失败,第二次尝试获取锁将在极短的时间内到来.假设有三个线程A B C. A先尝试获取锁,获取成功.B尝试获取锁,获取失败,阻塞等待.C最后尝试获取锁,获取失败,阻塞等待,互斥锁:就是synchronized这样的锁,提供了加锁解锁两个操作,如果一个线程加锁了,另一个线程也尝试加锁,就会阻塞等待。挂起等待锁:没有申请到锁的时候,线程被挂起,加入到阻塞队列中等待,当锁被释放后,有机会获取到锁.
2023-08-30 17:07:07 57 1
原创 synchronzied
所以如果一个线程A调用一个实例对象的非静态 synchronized 方法,而线程B需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占用的锁是当前类的锁,而访问非静态 synchronized 方法占用的锁是当前实例对象锁。3.修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。1.修饰实例方法,作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁。
2023-08-29 20:59:25 42 1
原创 死锁的成因和解决方案
加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)两个及两个以上的线程在争夺资源的过程中,由于竞争资源或由于通讯批次通信而造成的一种阻塞现象。3.请求和保存(一个线程尝试获取多把锁,在获取第二把锁的过程中,会保持对第一把锁的状态)4.循环等待(t1尝试获取locker2,必须在t2执行完,释放之后才能获取到)1.互斥使用(一个线程获取到一把锁之后,别的线程不可获取到)2.不可抱占(锁只能由拥有者释放,而不能被其他线程抱走)加锁顺序(线程按照一定的顺序加锁)
2023-08-29 20:51:10 31 1
原创 线程池总结
核心线程数的设计需要依据任务的处理时间和每秒产生的任务数量来确定,例如:执行一个任务需要0.1秒,系统百分之80的时间每秒都会产生100个任务,那么要想在1秒内处理完这100个任务,就需要10个线程,此时我们就可以设计核心线程数为10;最大线程数的设计除了需要参照核心线程数的条件外,还需要参照系统每秒产生的最大任务数决定:例如:上述环境中,如果系统每秒最大产生的任务是1000个,那么,最大线程数=(最大任务数-任务队列长度)*单个任务执行时间;任务队列长度一般设计为:核心线程数/单个任务执行时间*2即可;
2023-08-28 23:58:34 123
原创 单利模式的写法
这种设计模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一对象的方式,可以直接访问,不需要实例化该类的对象。这种类型的设计模式属于创建者模式,它提供了一种访问对象的最佳方式。优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时被创建。
2023-08-26 20:15:24 31
原创 线程安全的原因及其解决方案
(二)站在系统的角度看:一条语句对应多个指令,线程调度可以发生任何时刻(线程调度不会切割指令),所以线程调度不确定性导致指令执行顺序不确定,导致问题。原因:(一)站在开发者的角度看:①多个线程之间操作同一个数据②至少有一个线程修改这个数据(不是读操作而是写操作)(三)线程不安全表现为三个部分:①原子性被破坏②内存可见性问题③代码重排序问题。加锁和解锁就是确保不是多个线程同时使用操作同一个数据,导致线程不安全。解决方案:锁(理论是数据,多个线程共用的数据)
2023-08-26 20:12:43 24
原创 多线程(状态及其转换)
BOLCKED WAITING TIME_WAITING(这几个进程都表示等着其他事情)RUNNABLE(可工作的,又分为正在工作和即将开始工作)TERMINSTED(工作结束)
2023-08-24 20:34:31 32 1
原创 进程和线程
在80年代,线程的概念开始出现,线程被设计成进程的一个执行路径,同一个进程中的线程共享进程的资源,因此系统对线程的调度所需的成本远远小于进程。线程可以看做轻量级的进程,同一个进程内的线程共享进程的地址空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小。影响关系:一个进程崩溃后,在保护模式下其他进程不会被影响,但是一个线程崩溃可能导致整个进程被操作系统杀掉,所以多进程要比多线程健壮。包含关系:一个进程至少有一个线程,线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
2023-08-20 20:46:09 29 1
原创 进程
定义:进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行的程序的实例,包括程序计数器、寄存器和程序变量的当前值。2.进程是操作系统进行资源分配和调度的一个独立单位(CPU除外,线程是处理器任务调度和执行的基本单位);3.每个进程拥有独立的地址空间,地址空间包括代码区、数据区和堆栈区,进程之间的地址空间是隔离的,互不影响。1.进程依赖于程序运行而存在,进程是动态的,程序是静态的;
2023-08-20 20:43:51 27 1
转载 原码反码和补码
一、机器数和真值在学习原码、反码和补码之前,需要先了解机器数和真值的概念。1、机器数一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1.比如,十进制中的数 +2 ,计算机字长为8位,转换成二进制就是0000 0010。如果是 -2 ,就是 1000 0010 。那么,这里的 0000 0010 和 1000 0010 就是机器数。2、真值机器数的第一位是符号位,后边才是真正的数值,所以机器数的形式值就
2023-01-03 23:44:44 82
原创 三子棋游戏实现
1.首先先了解游戏的构成包括开始界面和游戏界面,那么首先定义一个函数作为游戏的主框架。2.在这个框架中对于游戏进行定义包括菜单以及提示语以do……while循环实现3.在menu函数中打印开始界面4.在test() 函数中,do……while循环嵌套switch循环,定义game()函数,实现游戏玩法这两个函数分别定义棋盘以及打印棋盘5.对于init 实现空格6.对于print实现棋盘的打印7.开始定义人机下棋,回到game函数使用玩家函数和电脑函
2022-11-08 21:52:18 656
原创 数组间元素的冒泡排序
一、1.首先定义一个数组并将其初始化2.确定循环次数3.确定一个函数进行传参二、1.由于不需要返回值函数用void进行接收2.确定基本原理,每一趟会进行一个数字的交换,也就是说一趟过后会有一个数到它该去的地方因此要使用两个for循环进行嵌套对于i,最后一个数不需要再进行循环所以次数应该是 总次数-1,而对于j,它的范围在随着i的改变而改变,是一个变量,所以应-i最后开始进行冒泡排序,输入一个整型变量,如果符合要求进行交换,然后打印,不符合要求,直接打印。运行
2022-11-08 10:13:05 52
原创 【无标题】
1.大家好,我是凌乱,今天是我来到CSDN的第一天,希望在这里可以得到自己内心所想2.目前的目标是学习之后可以自己写代码,完成数据分析和程序设计3.首先跟着鹏哥一起学习,到后期自行学习可以促进个人发展的编程知识4.一周大概学习4天5.腾讯
2022-10-13 22:23:21 77
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人