一些笔记uaniu

块级标签:独占一行;行级标签:不会独占一行

简单通用,结构稳定

创建表格标签 <table></table>;行标签 <tr></tr>;单元格标签 <td></td>;标题标签 <th></th>

<table border="1" height="100%" width="100%">设置表格宽高

td 设置边框,边框之间会有空隙。给table 设置 boder-collapse

表格行(rowspan)、列合并(colspan)

<audio src="路径"> </audio>

​ css 代码保存在外部通过代码导入到 html 代码中

边框颜色:border-color

边框粗细:border-width

边框样式:border-style

border简写: border:width style color;

z-index:num; num值越大,优先级越高,就会显示在最上面

颜色沿直线过度:从上至下、从左至右等

圆形或椭圆形渐变,颜色从一个起点朝所有方向混合

变形是一些效果的集合,如:平移、旋转、缩放、倾斜等

transition 呈现的时一种动画转换过程,如渐现、渐弱、动画快慢等。 transition 通过一些CSS的简单动作触发样式 平滑过渡

指定浏览器的过渡速度,以及过渡周期的操作进展情况

通过给过渡添加一个函数来指定动画的快慢方式

伪类触发::hover,    :active,    :focus,    :checked

媒体查询:通过 @media 属性判断设备尺寸、方向等

JavaScript触发:通过 JavaScript 脚本触发

JavaScript 是一种基于对象和事件驱动的、具有安全性能的脚本语言JavaScript 的特点

向HTML页面添加交互行为脚本语言,语法和Java类似解释性语言,边执行边解释

JavaScript组成:ECMAScript + DOM + BOM

​ 变量就是一个助记符号,帮助我们记忆计算机内存地址

​ js的数据类型由变量当前值进行判断(弱类型)

var catName="皮皮"; var x,y,z = 10;

JavaScript 区分大小写,特别是变量的命名、语句关键字等

typeof 运算符返回值如下

Boolean:true 或false

number:整数或浮点数

object:JavaScript 中的对象、数组和null

+= 、-=、*=、/= 赋值运算符

== 和 === 双等只要求相等,三等号需要

用于一般比较,=用于严格比较,在比较的时候可以转换数据类型,=严格比较,只要类型不匹配就返回false。举例说明:"1" == true类型不同,""将先做类型转换,把true转换为1,即为 "1" == 1;此时,类型仍不同,继续进行类型转换,把"1"转换为1,即为 1 == 1;此时,"" 左右两边的类型都为数值型,比较成功!如果比较:"1" === true 左侧为字符型,右侧为bool布尔型,左右两侧类型不同,结果为false;如果比较:"1" === 1 左侧为字符型,右侧为int数值型,左右两侧类型不同,结果为false;如果比较: 1 === 1 左侧为int数值型,右侧为int数值型,左右两侧类型相同,数值大小也相同,结果为true;如果比较: 1 === 2 左侧为int数值型,右侧为int数值型,左右两侧类型相同,但数值大小不同,结果为false;简而言之就是 "" 只要求值相等; "=" 要求值和类型都相等

位运算

字符串对象.方法名();

lenght 属性:返回字符串的长度;

charAt(index):返回在指定位置的字符

indexOf(str, index):自 index 后查找 str 首次出现的位置;如果字符串不存在则返回 -1

substring(index1, index2):返回位于index1和index2之间的字符串,包含index1,不包含index2

split(str):将字符串分割为字符串数组

直接赋值 var fruit= new Array("apple", "orange", "peach","banana");

修改数组内容 var arr= [1,2,3]; arr[1]= 5;

删除数组元素 splice(index, num, "替换值")

方法

join():把数组的所有元素放入一个字符串,通过一个分隔符进行分隔

sort():对数组排序

pop():删除数组末尾的元素

push():向数组末尾添加一个或多个元素,并返回新的长度

alert():在浏览器页面弹窗输出

prompt();弹窗显示输入框

prompt("提示信息", "输入框默认展示信息")

定义函数parameter:传入参数,相当于前提,可以有多个也可以不带

调用函数

函数调用一般和表单元素事件一起使用

调用格式 event_name= "function_name()";

控制窗口,通过操作对象上的属性和方法,达到控制窗口对象的目的

window.属性名 = "属性值";

history: 有关客户访问过的URL

back() 加载history对象前一个URL链接地址

forward() 加载history对象下一个URL链接地址

go() 加载history对象中的某个具体的URL链接地址

location:有关当前URL的信息

host 设置或返回主机名和当前URL的端口号

hostname 设置或返回当前URL的主机名

reload() 重新加载当前文档

replace() 用新的文档替换当前文档

confirm()方法弹出一个确认对话框

confirm() 与 alert()、prompt() 的区别

alert():一个参数,仅显示警告对话框的消息,无返回值,不能对脚本产生任何改变

prompt():两个参数,输入对话框,用来提示用户输入一些信息,单击 取消 按钮则返回null,单击 确定 按钮则返回用户输入的值,常用于收集用户关于特定问题而反馈的信息。

confirm():一个参数,确认对话框,显示提示对话框的消息、确定 按钮和 取消 按钮,单击 确定 按钮返回 true,单击 取消 按钮返回 false,因此与 if-else 语句搭配使用

var日期对象 = new Date();

实现整数返回范围为 2~99

setTimeout()

setInterval()

清除函数

clearTimeout()

clearInterval()

getAttribute("属性名");

setAttribute("属性名", "属性值");

附加属性: 添加标签中不存在的属性,方便编程调用

复制节点:cloneNode 的值默认为 false,只复制子节点;为true时复制内部所有节点以及属性值

字符串可以通过下标获取对应位置的元素,可以通过 length()方法获取字符串长度

字符串内部内容不可以更改

获取元素在数组内的下标;如果数组内没有该元素则返回 -1

截取 slice()

push()和pop()方法

push()向Array的末尾添加若干元素,pop()则把Array的最后一个元素删除掉:

unshift()和shift

如果要往Array的头部添加若干元素,使用unshift()方法,shift()方法则把Array的第一个元素删掉:

splice()

splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素:

concat()

concat()方法把当前的Array和另一个Array连接起来,并返回一个新的Array:

concat()方法并没有修改当前Array,而是返回了一个新的Array。

实际上,concat()方法可以接收任意个元素和Array,并且自动把Array拆开,然后全部添加到新的Array里:

JavaScript 的对象是一种无序的几何数据类型

访问属性是通过.操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用''括起来;访问这个属性也无法使用.操作符,必须用['xxx']来访问;

如果访问不存在的值,JavaScript并不会报错,而是返回undefined

如果in判断一个属性存在,这个属性不一定是对象自身的,它可能是继承得到的:

因为toString定义在object对象中,而所有对象最终都会在原型链上指向object,所以xiaoming也拥有toString属性。

要判断一个属性是否是自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法:

函数体内部的语句在执行时,一旦执行到return语句时就结束,并返回结果,如果没有return语句就返回undefined

匿名函数将函数赋值给了变量 abs,可以通过 abs 调用该函数

函数在传值的时候个数不受影响,函数内部不会接受多余的函数,但是传值过少则会返回错误的值

for of 可以直接取出对应下标的值

for in 则取出对应下标

rest 参数只能写在最后,前面用 ... 标识

如果前面的参数未传满,则前面的参数为 undefined,rest则接收一个空数组

未在任何函数体内定义的变量就具有全局作用域,JavaScript默认的全局对象是 window,全局作用域的变量会被绑定到window的属性上

减少名字冲突的一个办法是把自己所有的变量和函数全部绑定到一个全局变量中

可以实现同时对多个变量赋值

使用解构赋值时如果对应的属性不存在变量将赋值为 undefined

使用解构赋值来交换变量的值,不需要临时变量

直接使用sort()排序会按照ASCII码进行排序,如果是数字的话会自动识别成字符串按照首位数字的ASCII码进行排序

可以不带finally直接catch,也可以catch不带finally

主动抛出一个错误,让执行流程直接跳转到catch块。抛出错误使用throw语句

返回函数不要引用任何循环变量或者后续会发生变化的变量

返回的是一个函数体需要再进行调用才能获得最后的值

箭头函数相当于匿名函数,并且简化了函数定义,包含多行语句时就不能省略花括号以及里面的return语句

如果返回的是一个对象,需要注意写法

与 css 的后代选择器同理,在父元素内添加子元素的样式

支持加减乘除运算,不支持取余

使用 & 符号选择父标签并设置伪类,如果设置伪类不带 & 则无效

混合即是JavaScript内的函数,有带参和不带参两种形式

给混合名称带上小括号混合体就不会在css中出现,不带则会原样解析在css中

关键字: extend。直接指定对应的混合体

浏览器显示页面内容的屏幕区域

设置视口可以缩小网页的尺寸,保证网页在手机上正常显示

meta视口标签存在的目的是让布局视口的尺寸和理想视口的尺寸匹配。它是Apple发明的,其他手机和平板复制了它的大部分内容。桌面浏览器不支持它,也不需要它,因为它们没有理想视口的概念。meta视口标签应该被放在文档的head标签中

width:主要目的是把布局视口的尺寸设为一个理想的值。那个这个特定的值可以设置为一个具体的像素值。不过默认值为“device-width”,即让布局视口的宽度等于设备的宽度。这样可以灵活的变通,而不用考虑设备的尺寸变化。initial-scale:设置了页面的初始缩放程度。1代表100%,2表示200%,以此类推。minimum-scale和maximum-scale:设置缩放程度的最小值和最大值。容易出现的问题是修改了initial-scale的值,发现没有任何效果,原因是没修改maximum-scale的默认值。如果最大缩放程度为1,无论把initial-scale改为几都没用。

指布局视口的一个理想状态,只有当布局视口等于设备宽度时才是理想视口

媒体类型引入方式

@media方式 @media 媒体类型 { 选择器{ /样式代码写在这里…/ } }

@import中引入

媒体特性:“媒体类型(判断条件)+ CSS(符合条件的样式规则)”

媒体特征语法:@media 媒体类型 and (媒体特性)

关键字

and:同时满足才生效

@media screen and (max-width:1200px)

only:指定某种特定的媒体类型,可以用来排除不支持媒体查询的浏览器

not:排除某种指定的媒体类型,即排除符合表达式的设备

@media not print and (max-width:1200px){样式代码…}

对界面宽容度要求较高

采用 Flex 布局的元素

移动端点透问题

事件冒泡

插入原始 html 代码不能使用双大括号;需要使用 v-html 指令

<p>Using v-html directive: <span v-html="rawHtml"></span></p>

条件渲染指令,他根据表达式的真假来插入和删除元素

v-if='表达式' : 根据表达式结果的真假,缺点是否显示当前元素;true显示,false隐藏

toggle 简写 <button @click='fn()'>toggle

1、build:构建脚本目录

2、config:项目配置

3、node_modules:npm 加载的项目依赖模块

​ 4、src:这里是我们要开发的目录,基本上要做的事情都在这个目录里。里面包含了几个目录及文件:

1)assets:资源目录,放置一些图片或者公共js、公共css。这里的资源会被webpack构建;

2)components:组件目录,我们写的组件就放在这个目录里面;

5、static:静态资源目录,如图片、字体等。不会被webpack构建

9、.xxxx文件:这些是一些配置文件,包括语法配置,git配置等

Arrays类提供操作数组的方法,如:排序、查询

Arrays类的 sort() 方法:对数组进行升序排列

方法之间允许相互调用,不需要知道方法的具体实现,实现重用,提高效率

抽象类不能被实例化,但可以创建一个引用变量,其类型是一个抽象类,指向非抽象的子类实例

抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类

如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类

没有抽象构造方法,也没有抽象静态方法

抽象类中可以有非抽象的构造方法,创建子类的实例时能调用

接口的多种不同实现方式即为多态

多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术

我们在程序中定义的引用变量所指向的具体类型和通过该引用变量的方法调用在编程的时候并不确定,当处于运行期间才确定。就是这个引用变量究竟指向哪一个实例对象,在编译期间是不确定的,只有运行期才能确定,这样不用修改源码就可以把变量绑定到不同的类实例上,让程序拥有了多个运行状态,这就是多态。

instanceof 检测对象是否属于类

对象的身份是由创建的类来确定的

在创建对象时,如果使用父类的类型,Person tang = new TangDance(); 那么java会自动向上转型,如果要使用子类方法,需要手动向下转型 ((TangDance)tang).dance();

try-catch-finally 结构中 try 必须存在,catch和finally是可选的,但是二者必须存在其中一个

String getMessage();返回异常信息描述字符串,是printStackTrace()输出信息的一部分

Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws

在 try-catch 后加上final 表示是否异常都执行final里的语句块

enum 在 Java 中就是一个语法特殊一点的类

MALE , FEMALE 写法就是使用默认的无参构造方法建立两个对象,而且是静态的

构造方法都是 private 的,不准使用者在外部使用构造方法再建立对象

枚举创建后就应当禁止变更,只能重新创建

用法

除Character类外,其他包装类可将一个字符串作为参数构造它们的实例

Boolean类构造方法参数为String类型时,若该字符串内容为true(不考虑大小写),则该Boolean对象表示true,否则表示false

当Number包装类构造方法参数为String 类型时,字符串不能为null,且该字符串必须可解析为相应的基本数据类型的数据,否则编译不通过,运行时会抛NumberFormatException异常

包装类转换为基本类型:XXXValue()

toString() 以字符串形式返回包装对象表示的基本类型数据(基本类型->字符串)

parseXXX():把字符串转换为相应的基本数据类型数据(Character除外)(字符串->基本类型)

基本类型和包装类型的转换

装箱:基本类型转换为包装类的对象

拆箱:包装类对象转换为基本类型的值

Calendar 类

对 key 进行 hash 运算,得到一个数字值

调整一维数组的长度,上面创建的 Node 对象就存放在这个数组里面

(n - 1) & hash 通过 hash 值与数组的长度与运算计算数组下标

当前的键值对对象存放在数组的位置

内部是链表结构,在插入数据时速度较快

需要在列表头尾部添加删除元素时适用此方法

继承与InputStream 类,这是一个文件输入流,进行文件读操作的最基本的类

作用是将文件中的数据输入到内存中,用其进行读文件的操作

由于字节流的原因,无法读取中文字符

Java执行程序的过程:进程(JVM) -> 产生一个线程 -> 线程执行main()方法

一个进程中同时运行多个线程用来完成不同的工作

Java虚拟机本身不能创建线程,实际是由操作系统建立线程

每次创建线程,都是由操作系统来做,从用户态到核心态的一个转换,很消耗资源

线程资源共享也会带来性能问题

执行多线程时需要使用 start() 方法,直接调用则未实现多线程

定义MyThread类继承Thread类

重写Run()方法,编写线程执行体

创建线程对象,调用 start() 方法启动线程

启动线程直接调用run()方法就不属于多线程,而是只有主线程一个线程在执行

定义 MyRunnable 类实现 Runnable 接口

实现 Run() 方法,编写线程执行体

创建线程对象,调用 start() 方法启动线程

线程调度指按照特定机制为多个线程分配CPU的使用权

使用锁修饰的方法控制对类成员变量的访问

synchronized Java中最基本的互斥同步手段

尽量缩小锁的范围,提高效率

对象线程身上带有一个计数器,当计数器为0是未被上锁,为1是被上锁

Object类在 jdk 设计时就已经把这个计数器设计了,写的任何类都能直接继承

当对象线程执行一个带synchronized 方法时,计数器被置为1,其他线程执行方法时必须等他执行结束,他也必须等该方法执行完毕才能执行其他synchronized 方法

多个线程同时被阻塞,他们中的一个或者全部都在等待某个资源被释放,由于线程被无限制阻塞,,因此程序无法正常终止

A锁 B锁;线程1 线程2

​ 关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织

优点:

缺点:

​ 非关系型数据库严格来说不是一种数据库,应该是一种结构化存储方法集合,可以是文档或者键值对等

优点:

缺点;

若不设置条件限制则会影响额外数据

数值类型的值才能做运算

相同数据类型的值才能作比较

规定数据库中该列存放的数据类型

其中分为以下几种类型:

NULL 和 NOT NULL

表类型设置CREATE TABLE 表名(省略一些代码) ENGINE = InnoDB;

常见表类型:MyISAM、InnoDB 、HEAP、BOB、CSV等

使用MyISAM: 节约空间及相应速度

使用InnoDB: 安全性,事务处理及多用户操作数据表

InnoDB类型数据表只有一个*.frm文件,数据文件为上一级目录的 ibdata1 文件

MyISAM类型数据表对应三个文件:

*.frm -- 表结构定义文件

*.MYD -- 数据文件

*.MYI -- 索引文件

复制 student 表数据到 student_demo 表,只会复制数据,不会带主键以及自动增长等属性

​ 插入母表数据同时插入子表

通过 LAST_INSERT_ID() 函数来获取前面一次插入数据的 id 来作为子表的 id 插入

​ 从其他表查询数据插入到目标表

DELETE FROM 表名 [ WHERE condition ];

delete 只是在数据文件中吧删除字段进行标记

truncate 在物理文件上操作,彻底删除

使用 case 语法,对符合要求的 id 数量进行运算

查询合并行并求对应值

SELECT moneyType AS '操作裂类型', SUM(transactionBalance) AS '总金额' FROM transtable GROUP BY moneyType;

跨数据库查询

all 后面可以接上多个数值,mysql 会使用前面的值对其进行逐个比较

判断子查询条件是否满足查询要求

可以使用 NOT EXTST 来判断不存在

​ 合并多个查询结果

​ union 前面的查询语句决定列名的呈现

inner join 内连接;在表中至少有一个匹配时,则返回数据;on 后面跟条件

等值和非等值的连接查询

嵌套查询即是由多个子查询组成的,求解方式是由内向外执行

主查询和子查询使用了同一张表,给主查询赋别名与子查询对应列进行关联

在选择语句中使用子查询(子查询可以直接调用新定义的列)

在 from 中也可以使用子查询;需要给 from 语句设置一个别名,否则会报错

在 from子句使用子查询仅限于简单查询

order by 是放在语句的最后

与 select 语句查询得到结果,按照指定字段进行排序

与 DESC(降序) 或 ASC 搭配使用,默认为 ASC

order by colum_name1, column_namw2 可以接多个列名,逐个排序

select id, name from student order by 1, 2 这里的1,2指的是 id, name

WITH ROLLUP 运算符,自动在列最后生成一个存储聚合函数的和值,只能适用于聚合函数;且跟在 group by 条件后可以实现分类汇总,

作用:是为了保证数据的完整性而实现的摘自一套机制,它具体的根据各个不同的数据库的实现而有不同的工具(约束);

主键是最常见的索引类型

确保数据记录的唯一性

确定数据记录的唯一性

主键的值必须是唯一的且主键的值不能为空

默认情况下,mysql会自动尝试使用索引,不需要我们手动干预

作用:避免同一个表中某数据列中的值重复

被修饰的字段具有唯一性

字段值为空是不被检查,可以插入多个 NULL

可以同时设置对各字段为唯一索引

作用:快速定位特点数据

index 和 key 关键字都可设置常规索引

应加在查找字段

不宜添加过多的常规索引,影响数据的插入、删除和修改操作

删除index约束 drop index index_table_index on index_table;

​ Java里性能最高的网络编程框架

​ 简化数据层代码

​ 通过 xml 文档或者注解来配置和映射原始类型接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录

​ 使用 MyBatis,就只需要将 mybatis 的jar文件放置到类路径

​ 作用于系统的服务层,Spring是面向 Bean(即 Java 对象) 的编程,spring 把相互协作的关系称作是依赖关系

​ Spring 总共大约有20个模块,由1300 多个文件构成,这些组件被分别整合在 核心容器(Core Container)、AOP(Aspect Oriented Programming)和设备支持(Instrmentation)、数据访问及集成(Data Access、Integeration)、Web、报文发送(Messaging)、测试6个模块集合中。

核心容器:Spring-beans 和 Spring-core 模块是Spring 框架的核心模块,包含控制反转(Inversion of Control IoC)和依赖注入(Dependency Injection DI),核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,工厂模式的实现。BeanFactory 使用控制反转(IoC)思想将应用程序的配置和依赖性规范与实际的应用程序代码分开

Spring 上下文 Spring Context:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能

Spring-Expression 模块是统一表达式语言(unified EL)的扩展模块,可以查询、管理运行中的对象,同时也方便的可以调用对象方法,如操作数组、集合等。他的语法类似与传统的 EL,但提供了额外的功能,最出色的就是函数调用和简单字符串的模板函数

Spring-AOP:Spring-AOP 是 Spring 的另外一个核心模块,在Spring中,他是以 JVM 的动态代理技术为基础,然后设计出了一系列的 AOP 横切实现,比如前置通知、返回通知、异常通知。通过其配置管理特性,Spring AOP模块直接将切面的编程功能集成到了 Spring 框架中。所以,可以很容易的使 Spring 框架的任何对象执行 AOP

Spring Data Access(数据访问):由Spring-idbc、spring-tx、spring-orm、spring-jms 和 spring-oxm 5个模块组成 。spring-jdbc 模块是 Spring 提供的 JDBC 抽象框架的主要实现模块。用于简化 Spring JDBC

Spring-tx 模块是spring JDBC 事务控制实现模块,使用 spring框架,他对事务做了很好的封装,通过他的 AOP 配置,可以灵活的配置在任何一层

spring-Orm 模块是 ORM框架的支持模块,主要集成 hibernate、Java Persistence API(JPA) 和 Java Data Objects(JDO)用于资源管理、数据访问对象(DAO)的实现和事务策略

Spring-Jms 模块 (Java Messaging Service) 能够发送和接受信息

Spring-Oxm 模块主要提供一个抽象层以支撑 OXM (OXM 是 Object-to-XML-Mapping 的缩写,他是一个 O/M-mapper,将Java对象映射成 XML 数据,或者将 XML 数据映射成Java对象),例如:JAXB、Castor、XMLBeans、JiBX和 XStream 等

Web 模块:由Spring-web、Spring-webmvc、Spring-webscoket 和 Spring-webmvc-portlet 4个模块构成,Web上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作

报文发送:即 Spring-messaging 模块

Spring-messaging 是 spring4 新加入的一个模块,主要职责是为 Spring 框架集成一些基础的保温传送应用

单元测试:即 Spring-test 模块,Spring-test 模块主要是为测试提供支持

​ 需要 maven 项目进行环境搭建

创建 resource 文件夹,与 java 文件夹同级,并设置其为资源目录

配置文件加载

相对路径加载

相对路径加载(创建多个配置文件,分别加载)

总配置文件加载引入其他配置文件,再通过相对路径加载

​ spring 的核心概念就是 IoC 和 AOP

​ 不管是控制反转还是依赖注入,他们都可以这样理解:当某个Java实例(调用者)需要另一个Java实例(被调用者)时,在传统的程序设计过程中,通常有调用者来创建被调用者的实例。但是在依赖注入/控制反转模式下,创建被调用者的工作不再是有调用者来完成,而是由Spring容器来完成,然后注入调用者。

​ 要实现 控制反转与依赖注入需要 Bean对象满足 JavaBean 的创建规范

​ 如果没有 resources 资源目录需要手动创建

​ 即控制权的转移,将创建对象的方式反转 ,使用 spring 完成创建以及注入就是我们将控制权反转给程序

​ 在依赖注入模式下,创建被调用者的工作不由调用者来完成,因此称作依赖注入

​ 依赖注入通常有三种方式:

​ 1. 设置注入:IoC 容器使用属性的 setter 方法来注入被依赖的实例

​ 2. 构造注入:IoC 容器使用构造器来注入被依赖的实例

​ 3. 注解注入

Bean 对象的引用

注入Bean注解

​ 使用注解注入就不需要在 xml 文件配置 bean 文件,需要添加 <context:component-scan base-package="annspring"/> 标签,base-package 里面就是需要扫描注解的包文件

​ @Test 加在实现类上面,可以不用写main函数,直接执行该方法

​ @Component("name") 在不明确 Bean 属于三层架构的那一层时就使用此注解;带来名字可以直接通过名字获取 Bean,若不带名字就使用类名获取 Bean;还可以写成 @Component(value = "name")

​ @Repository("name") 位于持久层,用于标注数据访问组件,即 Dao 层组件;可以带参数,代表 Bean 的名称。若不带参数 Bean 的名称就是类名 (首字母小写) ,服务层和控制层注解也能不带参数

​ @Service("name") 服务层的注解

​ @Controller("name") 控制层注解

​ @Autowired + @Qualifier 自动装配

spring 创建对象

​ @Scope("singleton") 单例模式,只创建一个对象在 IoC 容器中,默认这种方式

​ @Scope("prototype") 多例模式,使用一次 spring就会创建一个对象

@Resource(name = "name") 注解参数

​ @Resource 按照名称去查找参数,@Autowired 按照参数类型查找参数。前者精确度更高

@Lazy(true/false) 懒加载

​ 当值为true时,spring初始化时不会创建这个对象,只有使用时才会创建

@PostConstruct

​ 构造方法被执行完后,开始执行这个注解方法,加载初始化资源

@PreDestroy

​ 在容器被销毁时执行这个方法,主要是为了正确释放资源

@Configuration 用来定义配置类,可以替换配置文件

​ 被此注解注解的类中应该有一个或多个被 @Bean 注解的方法

三层架构注解之间的关系

ApplicationContext :新版本的工厂类,加载配置文件的时候,就会将Spring管理的类都实例化。

​ ApplicationContext有两个实现类

ClassPathXmlApplicationContext :加载类路径下的配置文件

FileSystemXmlApplicationContext :加载文件系统下的配置文件

往容器里装东西(Java 对象)

开发者使用容器里已经被创建好的Java对象(Bean)

配置 Java Bean,生命周期和 IoC容器生命周期一样长;默认情况(即单例模式)

如果说 JavaBean 在被多线程共享时,产生线程安全问题,那么需要使用多例模式。我们使用一次JavaBean,spring框架就为我们创建一个新的对象,这个对象不会在IoC容器中存放,在spring启动的时候,也不会创建这个JavaBean对象,调用者自己管理这个JavaBean的生命周期

单例模式(单例模式可以不用加 scope 标签)

多线程共享这个对象,在IoC容器中只有一份

懒加载(单例模式下使用)

lazy-init="true" 直接加在 JavaBean 标签上;局部懒加载标签优先

default-laze-init="true" 全局懒加载,加在最外层的 Bean 标签上;

在sping启动的时候,不会马上创建对象,第一次使用的时候再去创建对象,创建好的对象同样放在IoC容器,供后面的使用者共享,加快系统启动

​ 非核心业务就叫切面

​ Aop是一种编程思想,是面向对象编程(OOP) 的一种补充,面向对象将程序抽象成各个层次的对象,而面向切片编程是将程序抽象成各个切面

​ AOP要达到的效果是,保证开发者不修改代码的前提下,去为系统中的业务添加某种通用功能。AOP 的本质是由AOP框架修改业务组件的多个方法的源代码。AOP 其实就是代理模式的典型应用(代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问)

按照AOP框架修改源代码的时机可以将其分为两类:

没有写代理类的源代码,代理类出自字节码层

AOP 框架在运行阶段对动态代理生成的代理对象在内存中以 JDK 动态代理,或 cGlib 动态地生成 AOP 代理类,比如 SpringAOP

动态代理模式就是让jvm动态的生成的代理类;动态代理需要设置拦截器

目标类导入进来 personDao实现类

事务导入进来 : Transaction类

invoke完成 :执行

1、开启事务

2、调用目标对象的方法

3、事务的提交

常用AOP之间的比较关系

1、拦截器的invoke方法是在什么时候执行的?

​ 当在客户端,代理对象调用方法的时候,进入到了拦截器的invoke方法

2、代理对象的方法体的内容是什么?

​ 拦截器的invoke方法的内容就是代理对象的方法的内容

3、拦截器中的invoke方法中的参数method是谁在什么时候传递过来的?

​ 代理对象调用方法的时候,进入了拦截器中的invoke方法,所以invoke方法中的参数method就是代理对象调用的方法

​ 存在问题

​ 1、在拦截器中除了能调用目标对象的目标方法以外,功能是比较单一的,在这个例子中只能处理事务

​ 2、拦截器中的invoke方法的if判断语句在真实的开发环境下是不靠谱的,因为一旦方法很多if语句需要写很多。

通过 contextListener 监听器的初始化方法,完成 IoC 容器的初始化

spring 框架依赖我们写的配置

可以加在类上,也可以加在方法上面。

​ 加在类上面表示所有数据操作的方法全开事务,力度较大影响并发。建议在需要开始事务的方法上加

​ 默认回滚 RuntimeException

tomcat 会接受我们输入的地址进行访问

对应 jsp 页面与对应的方法互相匹配

tomcat 启动单独时候会建立 servlet 对象,servlet 对象会去读取 mvc 的配置文件,配置文件我们设置了扫包

​ boot 项目的启动点

​ 自动扫包,默认扫包规则,从启动程序开始的包作为依据开始扫描(包括子包)

​ 完成自动配置,读取配置文件

​ 允许 Spring Boot 自动配置注解,开启注解后,Spring Boot 就能根据当前路径下的包或者类来配置 Spring Bean

​ 在SpringBootApplication上使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。

​ 可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作

​ 作用就是实现 Bean 的注入

​ Spring 项目必须要将 parent 设置为 SpringBoot 的parent,他包含了大量默认配置

​ springBoot 配置文件有两种格式,放置于 resources 资源目录下

浏览器收到响应结果后,会断开于tomcat的网络连接

修改后的程序需要在编译器重新运行代码才会生效

浏览器会缓存执行结果

404:地址有误;500:Java代码出现异常

浏览器发送请求会带上所有的请求参数

tomcat接收到请求会创建一个request(请求对象)的Java对象,浏览器发送的所有请求被封装在该对象中,在对象里内置了一个类似map的对象

request会被tomcat传入jsp中

request的生命周期很短,浏览器在接收到服务器响应后,这个对象就被当作垃圾回收

浏览器每发送一次请求都会建立一个全新的request对象,他是线程安全的

浏览器默认使用get方式提交请求,除非我们自行限制使用post

tomcat连接mysql:Tomcat8以上的数据库配置要使用maxTotal而不是maxActive,要使用maxWaitMillis而不是maxWait

request 对象常用方法

<%@ page language="java" contentType="text/html; charset=utf-8"%>

​ HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成,请求消息和响应消息都是由开始行(对于请求消息, 开始行就是请求行;响应消息则是状态行),消息报头,空行,消息正文(可选)组成

​ 每一个报头域都是由  名字+":"+空格+值  组成,消息报头域的名字大小写无关

​ 请求报头允许客户端向服务器传递请求的附加信息以及客户端自身的信息

referer: 该请求头指明请求从哪里来

​ 此请求头后面接的值为上一个页面的URL地址,通常用来做统计、防盗链

​ 响应报头允许服务器传递不能放在状态行中的附加响应消息,以及关于服务器的信息和对Request-URL所标识的资源进行下一步访问的信息

location(重定向):location 响应报头域用于重定向接收者到一个新位置

​ location响应报头域,常用在更换域名时

refresh:定时自动跳转到 [url]指定的页面(单位为秒),可以在页面通过meta标签实现,也可以在后台实现;不带 [url] 是指每 [content] 秒刷新一次页面

​ Servlet是Server与Applet的缩写,是服务端小程序的意思,使用Java编写的服务端程序可以生成动态的web页。servlet主要运行在服务器端,由服务器调用执行,是一种按照Servlet标志来开发的类。即:要实现web开发,需要实现Servlet标志

'file' -> 'new' -> 'project' -> 左侧选择 'Java Enterprise' -> 其他库和框架栏勾选 'Web Application' -> 'next' -> 键入项目名,更改路径 -> 'finish'

更改站点名(项目名): 'Edit Configurations' -> 'Deployment' -> 'Application context'

​ 即继承 HttpServlet类

​ 满足 Servlet 规范只是让我们的类能够满足接收请求的要求,接收到请求后需要对请求进行分析,以及进行业务逻辑处理,计算出结果,则需要添加代码,在规范中有一个叫service的方法,专门用来做请求处理的操作,业务代码可以写在该方法中

​ 在完成代码编写后,需要向服务器说明特定的请求对应特定的资源

​ servlet 没有 main() 方法,不能独立运行,他的运行完全由 Servlet 引擎来控制和调度。所谓生命周期,指的是 servlet容器何时创建servlet实例,何时调用其他方法进行请求的处理、何时销毁其实例的整个过程。

实例和初始化时机

当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会创建实例并进行初始化

就绪 / 调用 / 服务阶段

有请求到达容器时,容器调用 servlet 对象的 service() 方法,处理请求的方法在整个生命周期中可以被多次调用;HttpServlet的 service() 方法,会根据请求方式来调用 doGet() 或者 doPost() 方法。但是,这两个方法默认情况下会抛出异常,需要子类去 override

销毁时机

当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁

上述的生命周期可以通过 Servlet 中的生命周期方法来观察。在 Servlet 中有三个生命周期方法,不由用户手动调用,而是在特定的时机由容器自动调用,观察这三个生命周期方法即可观察到 Servlet 的生命周期

init方法,在Servlet实例创建之后执行(证明 Servlet有实例创建了),在整个生命周期内只执行一次

service方法,每次有请求到达某个 Servlet 方法时执行,用来处理请求(证明该Sevlet 进行服务了)。此方法可以多次调用

destroy方法,Servlet 实例销毁时执行(证明该 Servlet 的实例被销毁了),同一生命周期只执行一次

​ Servlet的生命周期,可以分为四部:servlet类加载 -> 实例化 -> 服务 -> 销毁

​ servlet工作流程:

​ 1. 客户端向servlet容器发出HTTP请求

​ 2. servlet 容器 接收 客户端的请求

​ 3. servlet 容器创建一个 HttpServletRequest 对象,将客户端请求信息封装到这个对象中

​ 4. servlet 容器创建一个 HttpServletResponse 对象

​ 5. servlet 容器调用 HttpServlet 对象的 service 方法,把Request与 Response 作为参数,传给 HttpServlet

​ 6. HttpServlet 调用 HttpServletRequest 对象有关方法,获取 Http 请求消息

​ 7. HttpServlet 调用 HttpServletResponse 对象有关方法,生成响应数据

​ 8. servlet 容器把 HttpServlet 的响应结果传给客户端

​ 用来接收客户端发送过来的请求信息,例如请求参数或请求头信息。service() 方法中形参接收的是 HttpServlet 接口的实例化对象。表示该对象主要应用于Http协议

​ 在 tomcat8 版本之后,GET请求不会乱码

​ request的默认语言编码是 ISO-8859-1 此编码不支持中文,解析时会出现乱码。我们需要设置 request 的编码方式或在接收到数据后通过对应编码格式还原

这种方式只针对 POST 有效(必须在接收所有数据之前设定)

借助String对象的方法,该请求方式对任何请求有效,是通用的

​ 请求转发是一种服务器行为 (此操作由服务器控制)。当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的 URL地址不会改变,得到响应后,服务端再将响应发送给客户端。从始至终只有一个请求被发出,数据可以共享

实现方式如下,达到多个资源协同响应的效果

​ 通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效

​ request 域对象中的数据在一次请求中有效,则经过请求转发,request 域中的数据依然存在,则在请求转发的过程中可以通过 request 来传输 / 共享数据

​ 通过 request 对象获取客户数据;通过 response 对象向客户端输出数据

​ HttpServletResponse 对象的主要功能是用于服务器对客户端的请求进行响应,将 Web服务器处理好的结果返回给客户端。 service() 方法中形参接收的是 HttpServletResponse 接口的实例化对象。这个对象中封装了向客户端发送的数据、发送响应头,发送响应码的方法

​ 响应时需要获取输出流

​ getWrite() 获取字符流(只能响应回字符)

​ getResponse() 获取字节流(能响应一切数据)

​ 响应回的数据到客户端被浏览器解析;两者不能同时使用

​ 在响应内容中含有中文,则可能会出现乱码,造成原因是服务器和客户端使用了不同的编码格式

​ 由于服务器进行编码默认使用 ISO-8859-1 格式编码,该编码不支持中文,所以我们需要替换服务器的编码格式

​ 同时,指定客户端的解码方式

​ 保证发送端和接收端的编码一次

同时设置服务器和客户端的编码格式

​ 由于此方式获取到的字节流响应时本身就是传输的字节,所以有可能出现乱码,当服务器和客户端使用的编码方式一致时则正确显示。

​ 为了保存数据正确性,应当同时设置客户端和服务器的编码格式

​ 重定向中有两个请求存在,并且属于客户端行为

​ 地址栏会发生改变

​ 有两次请求,数据无法共享

​ Cookie是浏览器提供的一种技术,通过服务器的程序能将一些只需要保存在客户端或者在客户端进行处理的数据放在本地计算机上,不需要通过网络传输,并且能够减少服务器的负载,但是由于 cookie是服务端保存在客户端的信息,所以其安全性比较差。常见的记住密码就是通过cookie来实现的

​ Cookie 的格式:键值对用 "=" 连接,多个键值对用 ";" 隔开

​ 返回的是数组,获取单个 cookie 需要遍历数组;getName() 获取名称、getValue() 获取 cookie值

​ cookie 的到期时间指该 cookie 何时失效,默认为浏览器关闭即失效。我们可以手动设定 cookie 的有效时间,通过 setMaxAge(int time); 方法设定 cookie 的最大有效时间,单位是秒

负整数

若为负数表示不存储该 cookie

cookie 的maxAge 属性默认值就是 -1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么cookie就会消失

正整数

若大于0的整数,表示存储的秒数

表示 cookie 对象可存活指定的秒数,当生命大于 0 时,浏览器会把 cookie 保持到硬盘,就算关闭浏览器或重启客户端电脑,cookie 也会存活相应的时时

若为0,表示删除该cookie

cookie 生命等于0是一个特殊的值,表示 cookie 被作废,就算浏览器已经保存了这个cookie,通过 cookie 的 setMaxAge(0)来删除这个cookie,无论在浏览器内存还是客户端硬盘都会删除这个cookie

同名 cookie 问题

如果服务器发送了重复的cookie,那么新的cookie会覆盖原有的cookie

浏览器存放 Cookie 的数量

cookie 的存储是有上限的,也会有大小的限定。cookie一般是由服务器创建和设定,后期结合Session来实现回话跟踪

​ cookie 的 setPath() 方法设置 cookie 的路径,这个路径直接决定服务器的请求是否会从浏览器中加载某些 cookie。

情况1:当前服务器下任何项目的任意资源都可以获取Cookie对象

情况2:当前项目下的资源可获取 Cookie 对象(默认不设置 Cookie 的path)

情况3:指定项目下的资源可以获取 Cookie 对象

情况4:指定目录下的资源可以获取 Cookie 对象

​ 如果设置了 path,当前访问路径包含了 cookie 的路径(当前访问路径在 cookie 路径基础上要比 cookie 的范围小) cookie 机会加载到 request 对象中

​ cookie 的路径是指可以访问该 cookie 的顶层目录,该路径的子路径也可以访问该 cookie

总结:当访问的路径包含了 cookie 的路径时,则该请求将带上该 cookie;如果访问路径不包含 cookie 路径,则该请求不会携带 cookie

​ 对于服务器而言,每一个连接到他的客户端都是一个 Session ,servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,跨多个连接或来自用户的页面请求。一个会话通常对应一个用户,该用户可能多次访问一个站点。可以通过此接口查看和操作有关某个会话的信息,比如说会话标识符、创建时间和最后一次访问时间。在整个Session 中,最重要的就是属性的操作

​ Session 无论客户端还是服务器都可以感知到,若重新打开一个新的浏览器则无法取得之前设置的 Session。因为每一个 Session 只保存在当前的浏览器中,并且只能在对应的页面才能获取

​ Session 的作用就是为了标识一次会话,或者说确定一个用户;在一次会话(一个用户多次请求)期间共享数据。我们可以通过 request。getSession() 方法来获取当前的 Session 对象

​ 每个 Session 都有一个唯一表示符

​ 每当一次请求到达服务器,如果开启了会话,服务器第一步会查看是否从客户端回传一个名为 JSESSIONID 的 cookie。如果没有就会创建一个新的 session 对象,并加上一个唯一标识符。服务器是根据 JSESSIONID 值查看是否含有该 session对象

​ Session 用来表示一次会话,在一次会话中数据可以共享,这是 session 作为域对象存在,可以通过 setAttribute(name, value) 方法向域对象中添加数据。通过 getAttribute(name) 从域对象中获取数据,通过 removeAttribute(name) 从域对象中移除数据

​ 数据存储在 session 域对象中,当 session 对象不存在了,或者两个不同的 session 对象时,数据就不能共享了,这就需要使用 session 生命周期

​ 关闭服务器,session即销毁。意味着此次会话结束,数据共享结束

​ 每个 web 应用都有且仅有一个 ServletContext 对象,又称 Application 对象,该对象始于应用程序相关的。在 Web 容器启动时,会给每一个web程序创建一个 ServletContext 对象

​ 该对象有两个作用:

​ > 作为域对象用来共享数据,此数据在整个应用程序中共享

​ > 该对象中保存了当前应用程序的相关信息;例如可以通过 getServerInfo() 获取当前服务器信息、getRealPath(String path) 获取资源真实路径

通过 request 对象获取

通过 session 对象获取

通过 servletConfig 对象获取,在 Servlet 标准中提供了ServletConfig 方法

直接获取,Servlet 类中提供了直接获取 ServletContext 对象的方法

​ 通过向 ServletContext 中存放数据,可以使整个应用程序共享某些数据。因为数据被保存后不手动移除会一直保存所以不建议存放过多数据

request 域对象

在一次请求中有效;请求转发有效、重定向失效

session 域对象

在一次会话中有效;请求转发和重定向都有效、session销毁后失效

servletContext 域对象

在整个应用程序中有效;服务器关闭后失效

​ 文件上传涉及到前台页面和后台服务端代码的编写;前台发送文件、后台接受并保存文件,这属于一个完整的文件上传

​ 上传文件的页面一般是一个表单,并且请求方式为 POST,其次表单的 enctype 属性必须设置为 enctype = "multipart/form-data";意思是设置表单类型为文件上传表单,属性的默认类型是application/x-www-form-urlencoded 不能用于文件上传。必须修改、

​ 使用注解 @MultipartConfig标识为支持文件上传, Servlet 将 Multipart/form-data 的post请求封装成 Part 通过part对上传文件进行操作

​ 即将服务器上的资源下载(拷贝)到本地,可以通过两种方式下载:通过超链接下载、通过代码下载

​ 项目内的文本或图片资源文件夹需要通过 Tomcat -> Deployment 进行上传才能通过项目发布,进行访问

​ 当超链接遇到浏览器不能识别的资源是会自动下载,否则会直接显示资源。我们也可以设置 download 属性规定浏览器下载(有些浏览器不支持)

默认下载

值得 download 属性下载

​ download 属性可以不写任何信息,会自动使用默认的文件名。如果设置了 download 属性的值,则使用设置的值作为文件名。当用户打开浏览器点击链接时会自动下载该文件

过滤器随着tomcat启动而建立,tomcat销毁时过滤器也销毁

判断用户权限是否能执行相应操作

​ 用于在 Servlet 之外对 Request 或者 Response 进行修改。他主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行最后处理。

​ Filter处理流程:对用户请求进行预处理 -> 将请求交给Servlet进行处理并生成响应 -> 对服务器进行后处理

​ 在一个 web 应用中,可以开发编写多个 filter,他们组合起来称作一个 Filter 链

​ 若是一个过滤器链,先配置 (按照首字母排序) 的先执行(请求时的执行顺序);响应时顺序相反

​ 在 HttpServletRequest 到达 Servlet 之前,拦截客户的 HttpServletRequest。根据需要检查 HttpServletRequest,也可以修改 HttpServletRequest 头和数据

​ 在HttpServletResponse 到达客户端之前,拦截 HttpServletResponse。根据需要检查 HttpServletResponse,也可以修改 HttpServletResponse头和数据

​ 实现步骤

​ > 编写 Java 类实现接口,并实现 doFilter() 方法

​ > 通过 @WebFilter 注解设置他所能拦截的资源

​ Tomcat 8 及以上版本:post请求乱码需要处理,GET 请求不会乱码

​ Tomcat 7 及以下版本都会乱码,需要处理

​ 拦截所有资源

​ 需要被放行的资源

​ > 放行静态资源(例如:css、js、image 等资源)

​ web监听器是 Servlet 中的一种特殊的类,能帮助开发者监听 Web 中的特定事件,比如 ServletContext、HttpSession、ServletRequest 等的创建和销毁;变量的创建、销毁或修改等。可以在某些动作后增加处理实现监控,比如统计在线人数

​ 如果是写实现类需要加上注解@WebListener

监听器分为三类八种

​ (1)监听生命周期,对象的创建和销毁;需要在 xml 文件中配置

​ > ServletRequestListener

​ > HttpSessionListener

​ > ServletContextListener

​ (2)监听值的变化;需要在 xml 文件中配置

​ > ServletRequestAttributeListener

​ > HttpSessionAttributeListener

​ > ServletContextAttributeListener

​ (3)针对 Session 中的对象

​ > HttpSessionActivationListener

​ > HttpSessionBindingListener

在线人数监控

实现步骤

​ > 创建监听器,实现 HttpSessionListener 接口

​ > 通过 @WebListener 注解配置该监听器

创建一个类,实现 HttpSessionListener 接口,用来检测 Session 的创建和销毁

​ 添加注解,自动生成 toString、getter、setter 方法

添加依赖

使用注解

常用命令

​ 需要 linux 系统有线连接成功

​ linux 控制台获取 ip地址(ifconfig);需要root用户

​ ens33 -> inet 就是IP地址

​ finalshell 新建 SSH 连接

​ 名称自取,主机即ip地址,端口默认22,认证方法选密码,用户为root用户,密码为自设的密码

​ 新建弹出窗口选保存,然后连接

​ 连接成功可以输入命令 ifconfig 检测

​ > cd /root 定位到root文件夹下

​ > mkdir jdk 创建名为jdk的文件夹

​ 上传对应的压缩包到新建的文件夹内

​ 定位工作目录到 /root/jdk 下,使用 ls 命令检索到该目录下的 jdk 压缩包,使用 tar -xvf packageName 进行解压

​ 命令行输入命令 vi /etc/profile 进入修改配置文件

​ 拉到文件最下方,输入以下内容 /root/jdk 为jdk路径

​ 保存输入内容并退出,输入命令 source /etc/profile 使配置生效后输入 java -version 成功看到版本号则安装成功

​ 定位到对应位置,解压文件

​ 依次执行下列命令

​ 此时tomcat已经准备完毕,输入以下命令运行tomcat

​ rpm 后缀文件解压方式不同于之前(使用 rpm -ivh packageName 进行解压)

​ 解压完成后输入命令检测MySQL是否安装成功

​ ps -ef | grep mysql 和 mysqladmin --version

​ 备份代码、版本控制

​ 检入:上传代码 检出:下载代码

​ 运行下列命令,初始化 git 安装环境

​ 解压完毕运行 gitlab-ctl reconfigure 重新设置gitlab

​ 重新启动命令 gitlab-ctl restart

​ 浏览器访问服务器ip 即可进入 gitlab 页面,端口默认 80,默认用户为 root

​ 新增项目,设置为 public 类型。

​ 注意:设置完一定要再次运行 gitlab-ctl reconfigure,否则git账号不能进行ssh连接,会报权限不够的错误。

​ 设置完毕输入命令 ssh -T git@192.168.30.130 测试是否连接成功,出现welcome则是成功

​ 查看提交作者:git config --global --list

​ 会在当前目录下产生 .gitconfig 文件保存配置信息

​ 本地仓库推送到远程仓库

​ spring 官方建议替代 jsp ,有网无网皆可以运行,开箱即用,多方言整合,完美贴合spring

​ type 属性设置三方数据源类型

​ 以 key-value 形式存储数据的内存型数据库,和传统的关系型数据库不同,不一定遵循传统数据库的一些基本要求

​ 这类数据库被称为 NoSQL(not only sql)

​ EXPIRE key seconds seconds取具体数值单位是秒,返回值为1是代表设置成功

​ 优点:

​ 对数据高并发读写

​ 对海量数据的高效率存储和访问

​ 对数据的可扩展性和高可用性(集群性)

​ 缺点:

​ redis(ASID)处理非常简单

​ 无法做到太复杂的关系型数据库模型

​ 启动 redis 命令 -> 连接redis 命令(需要在对应路径下使用命令)

​ get 和 set 命令 (不存在键是新增,已经存在该键则是修改)

​ 新增键值对:SET [key] [value]

​ 查看键对应的值:get [key]

​ 删除键值对:DEL [key]

​ 添加hash数据:hset [hashName] [key] [value]

​ 获取hash数据:hget [hashName] [key] [value]

​ 获取多个hash数据:hmget [hashName] [key1] [key2] ...

​ HMSET hashkey name "redis tutorial" description "redis basic commands"

​ 重复数据会覆盖前一次的数据

​ 存在语法错误所有命令都不会执行

​ 存在运行错误,除错误命令其他命令都会正常执行

​ 开启事务并执行(multi -> exec)

​ 开启事务后取消(multi -> discard)

​ 监视的键值被其他客户端修改,事务执行结果会返回空

​ 事务回滚(不会回滚,代码内部错误不会执行)

​ 消息发布与订阅(第二步也是发布,直接执行1,3然后发布)

​ scan 0 第一次遍历从0开始

​ 限制条数返回 scan 0 count [number] (使用 count 限制返回条数,返回条数有出入)

​ 值得返回对应名称的键 scan 0 match [name] (match 关键字,支持正则表达式)

​ 设置一个主机两从机

​ 添加 slaveof 127.0.0.1 [port]

​ 启动主机和从机

​ 输入命令,查看主机配置情况

​ 主机添加键值对,从机连接查看。不能修改值则配置成功

​ 从机配置与主从复制配置基本一致

​ 修改哨兵配置文件 sentinel monitor mymaster 127.0.0.1 [port] [number](指定哨兵的监视对象,number表示通过多少个哨兵可以选择新的主机)

​ 哨兵模式启动

​ 启动主机和从机(与主从配置启动一样)

​ 修改对应的配置文件

​ 修改配置结束运行所有服务机

​ 运行命令 redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1 等待提示键入 yes 等待集群创建

​ 集群中每个节点负责处理一部分哈希槽,可以人工分配槽位

​ 如果AOF和RDB都开启,优先使用AOF进行数据恢复

​ java往redis传数据需要全部实现序列化接口

​ RDB其实就是把数据以快照的形式保存在磁盘上。什么是快照呢,可以理解成把当前时刻的数据拍成一张照片保存下来。

​ 优势:

​ 适合大规模的数据恢复,对数据完整性和一致性要求不高。数据恢复时比 AOF 快

​ 劣势:

​ 如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失

​ 采用文件追加的方式,追加操作命令到文件内,不存放键值对。避免出现文件越来越大情况,新增了重写机制。

​ 优势:

​ 该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步

​ 劣势:

​ 相同数据集的AOF文件要大于RDB文件,恢复速度慢于RDB

​ AOF运行效率比RDB慢,每秒同步策略效率好,不同步策略和RDB相同

​ Java插入到redis数据是经过序列化的数据

​ springboot 连接 redis;导入对应 jar 包

​ 修改配置文件

​ 部分方法

​ springboot2开始不推荐使用 jedis (同步方式,效率低) 方式连接;目前推荐使用 lettuce(响应式,异步。效率高)

​ 删除别人的锁:对锁加上标识,在删除时进行判断

​ 解决方案:

​ 设置热点数据永不过期

​ 如果是分布式部署,可以将热点数据分布在不同的缓存数据库

​ 缓存穿透指的查询缓存和数据库中都不存在的数据,这样每次请求直接打到数据库,就好像缓存不存在一样。

​ 解决方案:

​ 加校验:如果 key 不存在就不放行,通过布隆算法判别

​ 返回不存在的查询结果

缓存里面没有需要的数据,走数据库查询需要的数据

解决方案:

数据库加锁,查询到了就将数据放在缓存。后面就都走缓存

提前放置数据到缓存,避免流量过多被击穿

设置热点数据永不过期

补救后进行限流,避免二次被击穿

​ lua 数组下标从 1 开始计数

​ lua + redis 优点:

​ 在redis 服务器上执行

​ 不能被其他客户端的命令打断,保证了原子性

​ 减少网络交互过程

​ RabbitMQ : 适合中小型项目,代码量较少

​ ActiveMQ :apach旗下产品,并发处理不如rabbitMQ

​ RocketMQ : 阿里旗下,同时支持消息中间件事务和数据库事务

​ Kafka : 功能最弱

​ 安装软件 Erlang -> rabbitmq

​ 配置环境变量

​ 新建 Erlang 环境变量: 变量名ERLANG_HOME , 变量值 -> erl文件目录路径

​ 新建 rabbitmq 环境变量

​ 配置 path : 新建两个变量 %ERLANG_HOME%\bin 和 %RABBITMQ_SERVER%\sbin。

​ 开启 rabbitmq :win + R 键入命令: rabbitmq-server -detached

​ 关闭 rabbitmq :win + R 键入命令: rabbitmqctl stop

​ 优点:

​ 销峰:限流,使流量数据变平稳

​ 解耦:降低程序耦合度

​ 缺点:

​ 系统开发复杂度提高

​ 中间环节多,容易在运行期间出错

​ 不能被处理的消息

​ 避免传入多条相同数据造成死信,可以使用幂等对数据进行判断

​ 幂等:对同一个系统,使用同样的条件,一次请求和重复的多次请求对系统资源的影响是一致的

​ 解决方式:

​ 添加 jar包

​ 配置文件

​ 消费者消费一个消息,被消费的消息在队列中在还存不存在:

​ 被消费的消息会被服务器从队列中删除

​ 默认情况:只要消费者接受了消息,他马上就会删除消息

​ 确定消息被正确消费,只有正确证明了这个消息才能把消息从队列删除。

​ 采用手动确认的方式,数据不能丢失。自动确认模式可以丢失数据,性能更高

​ 如果服务器死了,没有被消费的消息在服务器重启后,还是否存在:

​ spring封装,默认情况下,消息队列会持久化消息

​ 精确匹配路由键

​ 如果路由键匹配的话,消息就投递到相应的队列

​ 可以进行模糊匹配路由键

​ 支持在路由键中使用通配符,# 匹配路由键中一个或多个词,* 匹配路由键的一个词

​ 分库分表中间件

​ mycat bin 路径下cmd ,执行 mycat install ; installed 则代表成功

​ 权限顺序:insert,update,select,delete

​ 解决大数据量

​ 拆分概念

​ 垂直拆分:按照业务、模块进行拆分

​ 水平拆分:一个表数据量过大,可以把该表按照某种规则划分

​ 如何拆分:如果表多且各项业务逻辑清晰,低耦合,首先垂直切分;表不多,数据大、数据热点高选择水平切分

​ 事务问题:

​ 执行分库分表后,数据库分布不同库,数据库管理出现困难

​ 跨表跨库Join问题:

​ 表的关联操作受到限制

​ 额外的数据管理负担和数据运算压力:

​ 数据的定位问题和数据的增删查改的重复问题,通过应用程序可以解决但会造成额外的逻辑运算

微服务:由一系列微小服务组成,每个服务器独立运行在自己的进程中,独立部署,基于分布式管理

springBoot:是一个含概多个子项目的开发工具

建立父子工程,父工程添加添加配置文件

项目运行时注册中心每次都要先启动

负载均衡、链路跟踪

是一个高度可扩展的开源全文搜索和分析引擎。能够快速,实时的存储,搜索和分析大量数据,通常用做底层引擎技术。

使用:

bin路径启动 elasticsearch

浏览器测试,127.0.0.1:9200

配置 ik 分词器到 plugins 目录下

一个节点就是一个es服务器

节点分角色

主节点:创建索引,删除索引

数据节点:数据的存储、插入、修改、删除

一个节点能否有两个角色

可以,主节点负责维护集群,数据节点主要是对数据进行维护

分片

类似与MySQL的分库分表,不过MySQL借助了第三方组件,ES本身实现了该功能

THE END
0.放射肿瘤学基础5.加速器治疗头基本构造(书) 包括靶、均整器(X线)、散射箔、一级准直、二级准直和监测电离室。 六、高LET射线 1.定义 2.特点 掌握高LET射线的物理特点 第二节 射线的质与剂量学 一、光子与物质的相互作用 (一)光子与物质作用的四种过程 1.光电效应 jvzq<84yyy4489iqe0ipo8hqpvkov8641273385919?8;?9;2a715=6:46680|mvon
1.教师思想政治和师德师风培训心得体会(精选20篇)具有良好师德的老师从不搞“白色恐怖”“高压政策”“师道尊严”,师生之间应该在平等、温馨的交流中消除因年龄差异、角色差异形成的隐性心理隔膜,为学生营造轻松和谐和学习物化环境和心理环境,让学生产生积极的向师情感,让学生的身体、心理、情感、价值观等方面与学生的学习水平一起得到和谐发展。jvzquC41okv/t~nygp4dqv4zkpjfvrmwk1:49B7;40nuou