- 博客(79)
- 收藏
- 关注
原创 Listener和AJAX
1.概念:AJAX(Asynchronous JavaScript And XML):异步的JavaScript的XML2.AJAX作用:①与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据使用了AJAX和服务器进行通信,就可以使用HTML+AJAX来替换JSP页面了②异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用校验,等等...
2024-02-09 13:04:35
784
原创 会话跟踪技术和Filter
1.会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应2.会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便同一次会话的多次请求间共享数据3.HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享4.实现方式:①客户端会话跟踪技术:Cookie②服务端会话跟踪技术:Session。
2024-02-09 12:56:16
932
原创 JSP学习
4.JSP在被访问时,由JSP容器(Tomcat)将其转换为Java文件(Servlet),在由JSP容器(Tomcat)将其编译,最终对外提供服务的其实就是这个字节码文件。一种动态的网页技术,其中既可以定义HTML、JS、CSS等静态内容兼容,还可以定义Java代码的动态内容。②<%=...%>:内容会放到out.print()中,作out.print()的参数。3.复杂度高:运行需依赖于各种环境,JRE,JSP容器,JavaEE...3.表现层:接受请求,封装数据,调用业务逻辑层,响应数据。
2024-02-02 18:29:57
367
原创 Request(请求)&Response(响应)
String[] getParameterValues(String name):根据名称获取参数值(数组)req.getRequsetDispatcher("资源B路径").forward(req,resp);Map<String,String[]> getParameterMap():获取所有参数Map集合。String getParameter(String name):根据名称获取参数值(单个值)1.请求转发(forward):一种在服务器内部的资源跳转方式。
2024-02-02 15:19:27
553
原创 HTTP和Servlet
②初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。2.Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet。③请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法请求进行处理。①加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象。
2024-02-02 15:18:42
890
原创 JavaScript学习
它的用法类似于var,但是所声明的变量,只在let关键字所在的代码块内有效,且不允许重复声明。(1)string:按照字符串的字面值,转为数字,如果字母值不是数字,则转为NaN,一般使用parseInt。一旦声明,常量的值就不能该变了。1.JavaScript是一门跨平台、面向对象的脚本语言,来控制网页行为的,它能使网页可交互。5.ECMAScript6(ES 6)是最新的JavaScript版本(发布于2015年)②===:判断类型是否一样,如果不一样,直接返回false,一样再去比较其值。
2024-02-02 15:15:49
337
原创 HTML和CSS的学习
(1)get(默认值):浏览器会将数据直接附在表单的action URL之后。①超文本:超越了文本的限制,比普通文本更强大。2.rgb(值1,值2,值3):值的取值范围:0-255 rgb(255,0,0)1.HTML是一门语言,所有的网页都是用HTML这门语言编写出来的。2.表单项(元素):不同类型的input元素、下拉列表、文本域等。(2)_blank:在空白页面打开(一般用于跳转外部网站):定义下拉列表,定义列表项。①src:规定显示图像的URL(统一资源定位符)
2024-01-27 14:11:39
886
原创 MyBatis的学习
openSession():默认开启事务,进行增删改操作后需要使用sqlSession.commit();建议:将来都使用@Param注解来修改Map集合中默认的键名,并使用修改后的名称来获取值,这样可读性更高!注意:数据库的表的名称 和 实体类的属性名称 不一样 则不能自动封装数据。(1)#():执行SQL时,会将#()占位符替换为?(1)框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。when相当于case;①起别名:对不一样的列名起别名,让别名与实体类的属性名一样。
2024-01-27 14:11:04
904
原创 MaVen的使用
1.通过设置坐标的依赖范围(scope),可以设置对应jar包的作用范围:编译环境、测试环境、运行环境。②提供了一套标准化的构建流程(编译,测试,打包,发布……②default:核心工作,例如编译,测试,打包,安装等。②如果没有则去中央仓库中下载对应的jar包到本地仓库。②在弹出的面板中搜索对应坐标,然后双击选择对应坐标。②中央仓库:由Maven团队维护的全球唯一的仓库。③远程仓库(私服):一般由公司团队搭建的私有仓库。①本地仓库:自己计算机上的一个目录。本地仓库->远程仓库->中央仓库。
2024-01-27 14:10:13
349
原创 JDBC的学习
如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?boolean next():(1)将光标从当前位置向前移动一行(2)判断当前行是否为有效行。如:int getint(参数);:不需要再传递sql。PreparedStatement对象:setXxx(参数1,参数2):给?返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回0。
2024-01-27 14:09:28
775
原创 MySQL读写分离
代表全部的readHost与stand by writeHost 参与select语句的负载均衡,简单的说,当双主从模式(M1->S1,M2->S2),并且M1与M2互为主备,正常情况下,M2,S1,S2都参与select语句的负载均衡;一个主机Master1用于处理所有写请求,它的从机Slave1和另一台主机Master2还有它的从机Slave2负责所有读请求。#mysql服务器ID,保证整个集群环境中唯一,取值范围:1 - 232-1,默认为1。#在作为从数据库的时候,有写入操作也要更新二进制文件。
2023-12-21 21:17:33
826
原创 MySQL分库分表
开启之后, MyCat会自动统计SQL语句的执行情况;mysql -h 127.0.0.1 -P 9066 -u root -p 查看MyCat执行的SQL, 执行效率比较低的SQL , SQL的整体执行情况、读写比例等;MyCat中的逻辑库的概念,等同与MySQL中的database概念,需要操作某个逻辑库下的表时,也需要切换逻辑库(use xxx)。在业务系统中,有一张表(日志表),业务系统每天都会产生大量的日志数据,单台服务器的数据存储及处理能力是有限的,可以对数据库表进行拆分。
2023-12-21 21:16:54
1051
原创 MySQL日志和主从复制
慢查询日志记录了所有执行时间超过参数long_query_time设置值并且扫描记录数不小于min_examined_row_limit的所有的SQL语句的日志,默认未开启。错误日志是MySQL中最重要的日志之一,它记录了当mysql启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。1.主从复制是指将主数据库中的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。②MySQL的主从复制。上述是8.0.23中的语法。
2023-12-21 21:16:21
939
原创 MySQL管理
-add-drop-table 在每个表创建语句前加上drop table 语句,默认开启;不开启(--skip-add-drop-table)-d,--database=name 指定数据库名称,只列出指定的数据库相关操作。-r,--result-file=name 将输出的文本格式日志输出到指定的文件。-t,-no-create-info 不包含数据表的创建语句。-e,--execute=name #执行SQL语句并退出。-n,--no-create-db 不包含数据库的创建语句。
2023-12-21 21:15:03
824
原创 InnoDB引擎
③Change Buffer:更改缓冲区(针对于非唯一二级索引页),在执行DML语句时,如果这些数据Page没有在Buffer Pool中,不会直接操作磁盘,而会将数据变更存在更改缓冲区Change Buffer中,在未来数据被读取时,再将数据合并恢复到Buffer Pool中,再将合并后的数据刷新到磁盘中。下面是InnoDB架构圈,左侧为磁盘结构。当业务操作的时候直接操作的是内存缓冲区,如果缓冲区当中没有数据,则会从磁盘中加载到缓冲区,增删改查都是在缓冲区的,后台线程以一定的速率刷新到磁盘。
2023-12-21 21:14:14
791
原创 触发器和锁
1.介绍:全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。two.InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。InnoDB的数据是基于索引组织的,行锁是通过索引上的索引项加锁来实现的,而不是对记录加的锁。
2023-12-16 18:32:18
37
原创 存储过程和存储函数
1.存储过程是事先经过编译并1存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对提高数据处理的效率是有好处的。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其声明的BEGIN...END块中。用户自定义变量是用户根据需要自己定义的变量,用户变量不能提前声明,在用的时候直接用“@变量名”使用就可以。loop实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其来实现简单的死循环。-- 查看指定变量的值;
2023-12-16 18:30:51
44
原创 MySQL视图
当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。1.视图是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。2.通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。CASCADED:级联,一旦选择了这个选项,除了会检查创建视图时候的条件,还会检查所依赖视图的条件。
2023-12-16 18:29:04
31
原创 SQL优化
1.Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后噪排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫FileSort排序。没有not null约束:InnoDB 引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加。页可以为空,也可以填充一半,也可以填充100%。2.InnoDB引擎就麻烦了,它执行count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。
2023-12-16 18:28:33
132
原创 MySQL索引
表示select的类型,常见的取值有simple(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(SELECT/WHERE之后包含了子查询)等。②对于B+Tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加数的高度,导致性能降低;select查询的序列号,表示查询执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;
2023-12-08 22:37:10
36
原创 MySQL存储引擎
如果应用对事务的完整性有比较高的要求,正在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择。所有跨存储引擎的功能也在这一层实现,如过程、函数等。2.MyISAM:如果应用是以读操作和插入操作为主,只要很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。xxx.ibd:xxx代表的是表名,InnoDB引擎的每张表都会对应这样一个表空间文件,存储该表的表结构(frm、sdi)、数据和索引。
2023-12-08 22:34:46
20
原创 多表关系和事务
1.事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销请求,即这些操作要么同时成功,要么同时失败。3.幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了“幻影”。②关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。2.注意:MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。
2023-12-08 22:34:04
33
原创 函数和约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFRENCES 主表名(主表字段名) ON UPDATE 行为 DELETE 行为;ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名);[CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)其他使用应该结合相对应的操作来进行。
2023-12-08 22:32:32
38
原创 数据库相关概念和SQL(DDL、DML、DQL、DCL)
一:数据库-存储数据的仓库,数据是有组织的进行存储-DateBase(DB)二:数据库管理系统-操纵和管理数据库的大型软件-DateBaase Management System(DBMS)三:SQL-操纵关系型数据库的编程语言,定义了一套操作关系数据库的统一标准-Structured Query Language(SQL)---------------------------------------------------------------------------------------
2023-12-08 22:30:36
166
原创 Java动态代理
1.对象如果嫌身上干的事太多的话,可以通过代理来转移部分职责。2.对象有什么方法想被代理,代理就一定要有对应的方法。一:程序为什么需要代理?3.通过接口来派代理。
2023-12-01 22:39:26
22
原创 Java注解(Annotation)
③比如要解析成员方法上的注解,则应该获取到该成员方法的Methond对象,再通过Methond对象解析其上面的注解。②比如要解析类上面的注解,则应该先获取类的Class对象,再通过Class对象解析其上面的注解。2.@注解(...):其实就是一个实现类的对象,实现了该注解以及Annotation接口。2.注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处。就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容解析出来。⑥LOCAL_VARIABLE 局部变量。
2023-12-01 22:38:54
30
原创 Java反射
... parameterTypes) 获取类的某个成员方法(只能获取public修饰的)Class c = 对象.getClass();getDeclareField(String name) 获取类的某个成员变量(只要存在就能拿到)getField(String name) 获取类的某个成员变量(只能获取public修饰的)getDeclaredMethods() 获取类的全部成员方法(只要存在就能拿到)getDeclareFields() 获取类的全部成员变量(只要存在就能拿到)
2023-12-01 22:38:13
26
原创 Java单元测试
②为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(必须:公共、无参、无返回值)①可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立。如果测试失败,则是红色。@BeforeEach 用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次。@AfterEach 用来修饰一个实例方法,该方法会在每一个测试方法执行之后执行一次。@Before 用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次。
2023-12-01 22:37:43
35
原创 Java网络编程
Socket(String host , int port) 根据指定的服务器IP、端口号与服务端建立连接,连接通过,就获得可客户端Socket。·不事先建立连接,数据按照包发,一包数据包含:自己的IP、程序端口,目的地IP、程序端口和数据(限制在64KB内)等。2.不事先建立连接;accept() 阻塞等待客户端的连接请求,一旦与某个客户端成功连接,则返回服务端这边的Socket对象。·发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不返回确认,故是不可靠的。
2023-12-01 22:37:12
99
原创 关于Java进程和悲观锁、乐观锁
1.并发:进程中的线程是由CPU负责调度执行的,但CPU能同时处理线程数量有限,为了保证全部线程都能往前执行,CPU会轮询为系统的每个线程服务,由于CPU切换的速度很快,给我们的感觉这些线程在同时执行,这就是并发。Timed Waiting(计时等待) 同Waitin状态,有几个方法(sleep,wait)有超时参数,调用他们将进入Time Waiting状态。1.一开始不上锁,认为是没有问题的,大家一起跑,等要出现线程安全问题的时候才开始控制。1.也就是线程从生到死的过程中,经历的各种状态及状态转换。
2023-12-01 22:36:36
22
原创 Java线程池
用户每发起一个请求,后台就需要创建一个新线程来处理,下次新任务来了肯定又要创建新线程处理的,而创建新线程的开销是很大的,并且请求过多时,肯定会产生大量的线程出来,这样会严重影响系统的性能。newSingleThreadExecutor() 创建只有一个线程的线程池对象,如果该线程出现异常而结束,那么线程池会补充一个新线程。参数七:handler:指定线程池的任务拒绝策略(线程都在忙,任务队列也排满了的时候,新任务来了该怎么处理)——忙不过来了咋处理?——临时工空闲多久被开除。——负责招聘员工的(hr)
2023-12-01 22:35:40
31
原创 Java线程同步
Lock锁是JDK5开始提供的一个新的操作锁定,通过它可以创建出锁对象进行加锁和解锁,更灵活、更方便、更强大。加锁:每次只允许一个线程加锁,加锁后才能进入访问,访问完毕后自动解锁,然后其他线程才能再加锁进来。对于当前同时执行的线程来说,同步锁必须是同一把(同一个对象),否则会出bug。①建议使用共享资源作为锁对象,对于实例方法建议使用this作为锁对象。①同步方法其实底层也是有隐式锁对象的,只是锁的范围是整个方法代码。②如果方法是实例方法:同步方法默认用this作为的锁对象。3.线程同步的常见方案。
2023-12-01 22:35:05
24
原创 Java多线程
Thread(Runable target, String name) 封装Runnable对象成为线程对象,并指定线程名称。public static Thread currentHread() 获取当前执行的线程对象。④线程执行完毕后、通过FutureTask对象的get方法去获取线程任务执行的结果。③调用线程对象的start()方法启动线程(启动后还是执行run方法的)getName() 获取当前线程的名称,线程名称默认是Thread-索引。join() 让调用当前这个方法的线程先执行完!
2023-12-01 22:34:34
20
原创 Java的日志技术
③logback-access:有Tomcat和Jetty等Servlet容器集成,以提供HTTP访问日志的功能(可选,以后再接触)③:创建Logback框架提供的Logger对象,然后用Logger对象调用其提供的方法就可以记录系统的日志信息。①可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中)info 输出重要的运行信息,数据连接,网络连接,IO操作等等,使用很多。②程序中的日志,通常就是一个文件,里面记录的是程序运行过程中的各种信息。
2023-12-01 22:34:01
34
原创 Java中特殊文件
store(OutputStream os, String comments) 把键值对数据,通过字节输出流写出到属性文件里去。对于使用程序把数据写出到XML文件中去,不建议使用dom4j做,推荐直接把程序里的数据拼接成XML格式,然后用IO流写出去!setProperty(String key, String value) 保存键值对数据到Properties对象中去。2.核心作用:Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容。
2023-12-01 22:33:29
25
原创 File和IO流
刷新流,就是将内存中缓存的数据立即写到文件中区生效(刷新流后,流还存在,还可以添加数据,添加后再次刷新,添加的数据又会出现在文件区中)}catch(异常类名 变量名){异常的处理代码;2.解决思路:先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了。1.封装了Java提供的对文件、数据进行操作的代码,对外提供了更简单的方式来对文件进行操作,对数据进行读写等。(任何文件的底层都是字节,字节流做复制,是一字不漏的转移完全部字节,只要复制后的文件格式一致就没问题!
2023-11-24 13:05:18
235
原创 Stream
2.优势:Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。1.Stream也叫Stream流,是JDK8开始新增的一套API(java.util.stream.*),可以用用于操作集合或者数组的数据。收集Stream流:就是把Stream流操作后的结果转回到集合或者数组中去返回。1.终结方法指的是调用完成后,不会返回新的Stream了,没法继续使用流了。把流处理后的结果收集到一个指定的集合中去。
2023-11-17 18:56:50
37
原创 Map系列的遍历方式与Map系列集合及集合的嵌套
如果键存储的是自定义类型的对象,也可以通过重写HashCode和equals方法,也可以保证多个对象内容一样时,LinkedHashMa集合就能认为是重复的。·如果键存储的是自定义类型的对象,可以通过重写HashCode和equals方法,这样可以保证多个对象内容一样时,HashMa集合就能认为是重复的。实际上:原来学的Set系列集合的底层就是基于Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。2.原理:TreeMap跟TreeSet集合的底层原理是一样的,都是基于红黑树实现的排序。
2023-11-17 18:50:09
651
原创 Collections工具类与Map集合
--------------------------------------------------------------------------------------------------------------------------------Map集合。3.Map集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键都只能找到自己对应的值。1.先学习Map的常用方法是因为Map是双列集合的祖宗,它的功能是全部双列集合都可以继承过来使用的。对List集合中的元素进行升序排序。
2023-11-17 18:45:20
33
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人