Java基本指令
2023-01-13 13:46:22 5 举报
AI智能生成
JavaSE,mysql,JavaScript基本指令
作者其他创作
大纲/内容
jdk包含jre,jre包含jvm
安装jdk
系统与安全
系统
高级系统设置
环境设置
path双击
添加jdk软件下的bin文件夹路径
win7系统需要在后面加“;”
win10系统搜索控制面板
编辑环境
打hello word代码
Java 简单,面向对象,跨平台
java的初步接触
Java Standard Edtion的缩写,译成中文就是Java标准版
Java通过JVM(虚拟机)实现跨平台
名词含义
用十进制数除2取余数,所得的余数为十进制数的二进制
十进制转二进制
分成三个三个的一组,每一组除2取余
十进制转八进制
每4位为一组,每一组除2取余
十进制转十六进制
进制转换
包含8bit
byte字节
16字节
short
16字节精度高于short
float
32字节
int
32字节精度高于int
double
64字节
long
字符:包含2字节
char
布尔
bool
八种
基本数据类型
具有连续性
具有下标索引index 从0开始计数
byte short int long:0Boolean:falsefloat double:0.0char:‘\\u0000’引用类型:null
数据类型默认值
数组中只能有一种数据类型
数组一旦定义长度(元素个数),不能改变
特点
arr.length数组长度=元素个数
System.out.println(Arrays.toString(arr));
输出数组
数组长度
直接在大括号里面赋值,静态数组里面的内容是写死的
静态初始化
int [ ] 自定义变量名=new int [数组元素个数]
相当于变量,可以向里面赋值
输出时要使用工具类Arrays.toString
动态初始化
Array.copyOf(哪个数组,扩多少)
数组扩容方法
数组的复制使用
native:表示调用系统中(c)的方法
数组扩容(基于数组复制)
for(int i = 0; i < array.length; i++){ if(i%2==0){ System.out.println(arrint[i]); }else{ System.out.println(arrint[i]);}}
循环输出数组的每个元素
遍历
eg: int [] [] 自定义二维数组名={{123},{123},{123}}
元素为数组的数组
eg:int [] [] arr = new int[4] [];
int[] [] arr = new int [] {a}
动静结合时可以不定义
动态初始化必须定义一维数组的长度
子主题
for(int i = 0;i<arr.length;i++){ System.out.println(Arrays.toString(arr[i]));//二维数组中的每一个元素 for(int j = 0;j<arr.length;j++) { System.out.println(arr[i][j]);//二维数组中每一个数组的每一个元素 }}
二维数组赋值for循环嵌套
二维数组(矩阵)
拿第一个数和第二个数进行比较,如果比后面大交换内容,如果还比后面的大继续交换,直到换到最后
冒泡排序
第一个循环用第一个数的索引和第二个循环用第二个数的索引进行比较,如果里面的内容前面比后面的大,交换继续拿第一个和第三个比较,如果比第三个大交换,直到换完,此时第一索引的数为最小值,再从第二索引开始重复上面的过程直至比较完所有的数
选择排序
系统自动排序(默认从小到大)
系统排序
数组的排序
递归
数组
byte short int long:0Boolean:falsefloat double:0.0char:‘\\u0000’引用类型:null
默认初始化
对象赋值为“null”,不会出现异常
成员变量
详见面向对象构造器
创建class时会自动生成隐藏的无参构造法
成员方法
class
引用数据类型
引用类型
Java数据类型
前面的数时负数值为负数,与后面的数无关
零0对其他余数是0
n%3是周期函数,函数值[0,3)
负数的余数是负数
%取余
数学运算符+ - * /
数学运算符
int a = 0;a = a++;这个题要先看运算符的优先级++的优先级高,虽然a++先把值赋给a但是++的运算结果先=(赋值)一步把值传给a,赋值过来的随后把++的值进行覆盖
i++先把i的值传出去,传完后i自加1
++i先自加1,然后把加完的值传出去
++
自增
i--先把i的值传出去,传完后i自减1
++i先自减1,然后把减完的值传出去
--
自减
自增自减运算符
短路运算符[条件1&&条件2],如果条件一不成立则条件2不执行 省时间
与&&
或||
!
逻辑运算
5->01012->0010& 0000最后将二进制转化为十进制结果为0
有假皆假
当变量为数值时,数值转化为二进制求与
&
有真皆真
当变量为数值时,数值转化为二进制求或
|
查二进制表
7 0111~7 1000结果为-8
0为正 1为负
!等于~
逻辑位运算
逻辑与比较运算
>大于
>=大于等于
<小于
<=小于等于
==等于
!=不等于
比较运算
使用三元运算符实现分页功能。\t * */\tpublic static void test4_1() {\t\tSystem.out.println(\"请输入1:\");\t\tsc = new Scanner(System.in);\t\tint total = sc.nextInt();\t\tint size = 10;\t\tint page = total%size==0 ? total/size :total/size+1;\t\tSystem.out.println(page);\t}
当条件表达式为“true”时,表达式1作为整个表达式的值,否则表达式2作为整个表达式的值
条件表达式?表达式1:表达式2
条件运算符(三元运算符,三目运算符)
字符串和字符串相加可以把两个字符串连接起来
字符串和数字相加,得到的还是字符串
x+=y等同于x=x+y
+=
x-=y等同于x=x-y
-=
x*=y等同于x=x*y
*=
x/=y等同于x=x/y
/=
x%=y等同于x=x%y
%=
赋值运算符
运算符
Math.round(小数/或者是式子)
四舍五入,就近原则
Math.sqrt()
计算开方
Math.pow(底数,幂)
计算幂
intersects()
判断是否相交
数学函数
public 修饰的,任何地方都能访问
public
在类,同一包,子类中可以访问
protected
无返回值
在类内部,同一包中可以访问
default
仅当前类中能够访问
private
权限修饰符
返回值类型
1、见名知意2、驼峰命名法3、尽量用英文
方法名命名
方法后面跟的括号里面的内容
参数列表
方法的声明declare
例如声明主函数
(修饰词)(返回值类型)(方法名){}
方法的语法
method
如果返回值不是void就用return
return关键字
方法的参数和方法的内部变量
局部变量 local variable
空壳子没有实际的数值,相当于变量声明但是没有赋值
方法的参数定义,是临时变量
形参
实际的数值,相当于赋值
方法调用时,实际传递的参数变量
实参
形参和实参
Java的方法
if(){}else if{}else{}
if的括号里必须是Boolean类型
if(判断语句){判断成立执行此部分}else{不成立执行此部分}
if-else
枚举
六种数据类型
switch表达式只能是整数(int 和自动转换为int类型的数,String(JDK7+),enum枚举类型)
case条件只能是整数,不能是变量以及表达式
case后要有冒号“:”
break退出的是当前的switch结构,return退出整个方法
break强制退出
switch效率高于if-else
switch(整数表达式){case条件1:。。。。;break;case条件2:。。。。;break;case条件3:。。。。;break;}
switch -case
分支流程控制
while(判断语句如果为真执行后面程序){循环体,循环体内要有自增,不然程序会一直执行下去}
while
先执行再循环
do{}while(循环语句)
do...while
for(int a=0;a<...;i++){}
for
循环控制
public class Numlist {\tpublic static void main(String[]args)\t{\t\t\t\tSystem.out.println(fIB(6));\t}\tpublic static int fIB(int index)\t{\t\tif(index == 1 || index == 2)\t\t{\t\t\treturn 1;\t\t}else\t\t{\t\t\treturn fIB(index-1)+fIB(index-2);\t\t}\t\t\t}}
自己调用自己,容易造成溢出
一定要有一个出口
组成单位
数据类型 对象名 = new 构造方法();
实例化对象
创造class时自动生成隐藏的无参构造法
方法名与类名相同
不能声明返回值类型
声明在类的内部
如果定义有参构造法,要生命无参构造法,否则有参构造会覆盖无参,造成报错
方法名一致
参数列表不一致
构造器的方法重载
构造器(构造方法)
表示当前对象
this()需要在构造方法中使用
this()必须写在子类构造器的第一行
this 关键字
表示子类调用父类构造器
super()调用父类构造器,必须写在子类构造器第一行
主函数不能调用用super
不能与this()同时存在
super 关键字
类变量,类方法,从属于类,不属于对象
被所有实例共享,优于对象之前
储存于堆内的方法区,在主方法执行之前加载
静态代码块>main方法>构造代码块>构造方法
声明的变量储存在常量池中,修饰的方法为静态方法,类方法
非static修饰的变量及方法能够访问static修饰的变量和方法
static静态关键字
修饰类不能有子类,不能被继承。比如:Math String
可以修饰类
修饰变量后,变量不能被二次赋值,相当于常量
可以修饰变量
修饰方法不能被子类重写,但可被重载
可以修饰方法
String被final修饰,所以String不能被继承
final 关键字(常量)
关键字
双等号比较的是内存中的地址
equals比较的是String内的内容
new关键字创建的对象,地址一定不相等
jdk1.7以前常量池存在方法区内,jdk1.7以后常量池存在堆内
Arrays.copyOf();类中调用系统数组输出
System.arraycopy(原数组,0,现数组,0,数组长度)
数组扩容
.charAt()查找指定索引字符
字符串名.length() 字符串长度
.trim() 去头尾的空格
.toLowerCase() 大写转小写
.toUpperCase() 小写转大写
.indexOf() 查最后一次出现的字符
endsWith() 查以。。。为后缀结尾的
startWith()查以。。。开头的
[一个包含]
subString(int start) 截取子字符串
前包含,后不包含
toCharArray() 字符串和字符可以相互转换
concat()连接两个字符串
String API 用户访问接口
.matches() 匹配正则表达式
切分字符串为字符数组
.split(\"[\\s|]\")
代替
.replaceAll(要插入了类型,具体插入的数据)
String 对正则表达式的支持
用来匹配输入字符串是否与要求一致
\\d表示【0~9】
.表示任意字符集
\\w表示【0~9a~zA~Z】
常用预定义字符集
正则表达式
语法:for(类型 新名:数组名或字符串名称){Syxtem.out.println(新名)}
增强for循环
字符串数组输出
String类Class
正则表达式在线测试
正则表达式在线工具
调用底层c代码
native
toString 转成字符串可以在Object内自定义的子类中重写
Object类
构造器不能继承
子类继承父类的属性和方法
实例化子类,会递归分配所有父类的空间
子类构造器会默认先调用父类的无参构造器
子类构造器一定会调用父类构造器
类一定有构造器(父类、子类)
如果一个类不显示继承另一个类,那这个类的父类为Object{}
规则:1、有继承才能重写,如果父类里没有那么子类中会报错
2、在子类中可以根据需求对父类继承过来的方法进行重写
重写方法必须和重写方法具有相同的方法名称,参数列表和返回值类型,主要方法体不一样
重写方法不能使用比重写更严格的访问权限
主函数内不能用super
相同点:方法名一致
不同点:方法重载在同一个类中,方法重写是父子继承关系
与方法重载的区别
方法的重写override
一个类只能有一个父类(单继承)
继承的缺点
继承extends
高内聚,低耦合
父类引用指向子类实例
简化代码
改善代码的组织性和可读性
易于扩展
继承
重写
子类变成父类同样型
强制类型转换;父类引用指向子类实例
向上转型
必要条件
接口
实现形式
相当于多重闸刀开关,父类指向哪个,哪个执行
多态
方法公开变量不公开
封装/隐藏
特征
必须有包
类里面必须有无参构造器
声明变量后使用get set方法后就成为属性
用get() set()声明Bean属性
实现序列化接口
Java Bean 规范
用abstract定义的类
只有方法的定义,没有方法的实现
定义
用来被重写
抽象类的目的
抽象类里可以有变量
变量
抽象方法里可以有变量
抽象类里可以有普通方法比如static
可以没有抽象方法,但是有抽象方法的类一定是抽象类
抽象类被继承,子类必须实现抽象类中全部的抽象方法
抽象方法:只有方法的定义没有方法的实现(没有方法体,也就是没有大括号)
方法
抽象类的变量和方法
父类无参构造器在子类实例化时,调用父类无参构造器
父类无参构造器抽象,父类不能实例化(抽象类不能实例化)
抽象类不能实例化
键盘监听事件
在一个类的内部调用另一个类,相当于创造了一个类的实例
匿名内部类
继承缺点:一个类只能有一个父类(单继承)
抽象类
instanceof 检查引用类型
可以有成员变量,默认static final修饰(静态常量)
JDK1.8以后可以写普通方法,但是必须用default修饰
只有抽象方法
没有构造方法,一般用于规范
一个类实现接口内全部的抽象方法
implements实现接口继承
接口的继承
接口interface
接口多实现
接口定义行为
抽象类单继承
抽象类定义是什么
抽象类与接口的区别
抽象类接口
面向对象
大转小
向下转型
import java.util.Scanner;public class pingfang{\tpublic static void main(String[] arges)\t{\t\tScanner a =new Scanner(System.in);\t\tSystem.out.println(\"请输入:\");\t\tString b = a.nextLine();\t\tint c = Integer.parseInt(b);\t\tint d = c*c;\t\tSystem.out.println(\"平方为:\");\t\tSystem .out .print(d);\t}}
求平方
操作台输入
Garbage Collection System.gc();通知JVM回收垃圾
finalize();程序员释放对象方法,尽量少用
垃圾回收机制
import java.util.*;public class suiji{\tpublic static void main(String[] args)\t{\t\tRandom suiji = new Random();\t\tint a = 65;\t\tint rInt = suiji.nextInt(26);\t\tint b = a+rInt;\t\tchar c = (char)b;\t\tSystem.out.print(c);\t}}
随机出现大写二十六个字母
随机赋值
Java基础
String s = s1+s2+s3+s4; 被优化为 String s = new StringBuilder(s1).append(s2).append(s3).append(s4).toString();
代码优化
String由final修饰,内容不可变,每当创建时都是重新创建char[]
StringBuilder可以改变内部的字符串内容,也就是可以二次赋值,用的是同一char[]数组
String与StringBuilder的区别
因为String底层调用的是StringBuilder方法
String的效率要低于StringBuilder
字符串拼接时,str1+str2的原理在底层应该是StringBuilder(str1).append(str2).toString
String、StringBuilder的区别:
StringBuffer线程安全,效率低
StringBuilder线程不安全,效率高
StringBuilder和StringBuffer的区别:
.append字符串追加
.insert(指定位置,要添加的元素)指定位置添加
.delete(start,end)左闭右开,指定位置删除
语法:StringBuilder strB = new StringBuilder(\"hello\");
StringBuilder的三条常用指令
s=s+'a' StringBuilder s= new StringBuilder(\"123\"); StringBuilder str1 = new StringBuilder(\"a\"); s.append(str2).toString(); 相当于新建一个StringBuilder类型的s和一个StringBuilder类型的str1,用sppend拼接,并用toString指令以String类型输出
s +='a',实际上是创建了两个对象,为什么?
当处理少量字符串拼接时使用 String s = \"a\"+\"b\",大量字符串拼接操作时使用StringBuilder
笔试题
String、StringBuilder和StringBuffer
数组存放数据类型单一,可以存放基本类型,也可以存放引用类型,但是只能存一种
集合只能放引用类型,但是可以存放不同类型的元素,比如String
储存类型
数组长度一定,使用时需要扩容
长度限制
数组通过索引来获取元素
集合通常通过迭代器来访问元素
访问元素
数组与集合的区别:
集合:数组高级版接口可以集成接口类可以实现接口
基本数据类型(八种)对应的引用类型
String str = \"12345\" ;int a = Integer.parseInt(str) ;
parseInt(s);将字符串类型的值转为int类型
Integer num = new Integer(\"12345\"); String num1 = num.toString();
Integer类的主要方法有:parseInt方法和toString方法.
1、int是基本数据类型,直接存数值,而Integer是引用数据类型
2、int的声明不需要实例化,且变量声明后初始值为0;integer是一个类,初始值是NULL,需要实例化,才能赋值;
3、integer是int的包装类,实际应用中integer被看做一个类,可以进行数据转换等操作
题目:Java中int和Integer的区别
面试题
boolean-->Booleanchar-->Characterbyte-->Byteshort-->Shortlong-->Longint-->Integerfloat-->Floatdouble-->Double
用途:为了使方便对基本类型进行封装除了Integer和Characte其他六个类的类名和基本数据一致只是类名的第一个首字母大写即可
比如:考生成绩为零和缺考,为零的值为0,缺考的值为NULL,只有用Integer才能实现
作为 和基本数据类型对应的类、类型存在,方便涉及到对象的操作
包含每种基本数据类型的相关属性。如最大值、最小值,以及相关操作
主要两种用途
基本数据类型在传值时会自动转成包装类
使用的是ValueOf的方法
将 基本数据类型 封装为对象类型
自动装箱
将对象重新转化为基本数据类型.
自动拆箱
包装类与基本数据类型转换
Integer 类在[-128~127]范围内,比较的是栈里存放的常量池的地址,而Integer i1与 Integer i2在常量池中的地址相同,所以为true。而下面i1与i2的内容存放在堆内,且地址不同,所以输出结果为false
输出结果为:truefalse
public static void main(String[] args) { Integer i1 = 127; Integer i2 = 127; System.err.println(i1 == i2); i1 = 128; i2 = 128; System.err.println(i1 == i2); }
Boolean:-128~128
byte:-128~127
char:0~127
short:-128~127
int:-128~127
long:-128~127
float和double没有缓存值
Jvm会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,当Integer i = 127时,在自动装箱过程中是取自常量池中的数值,而当Integer i = 128时128不在常量池的范围内,所以在自动装箱过程中需要new 128,所以地址不一样
包装类的缓存值范围
Integer.toHexString转十六进制
Integer.toBinaryString转二进制
Integer.toOctalString转八进制
Integer.Max最大值
Integer.Min最小值
最值
Integer方法
包装类
add(下表索引,内容)
addALL求和
增
clear删除所有
list.remove(index);根据索引删除,返回删除的元素
list.remove(object);表示根据元素删除,返回删除结果,成功turn,失败false
remove删除想要删除的元素
删
set(下标索引,修改内容)
改
indexOf查询下标索引
与null的区别
isEmpty判断是否有元素
查
public Boolean contains(Object o)
检查是否包含指定元素
list.size()查看当前集合的元素个数
集合大小
API
for(Integer str:list1){System.out.println(str)}
也叫for。。。each循环
for (类型名:list)
只能用来遍历
Arraylist线程不安全效率高
vector线程安全效率低
Arraylist与vector的区别:
ArrayList(线性结构)
LinkedList链式表添加元素效率高
ArrayList查询效率高
LinkedList与ArrayList之间的区别
创建语法: List<String> list = new LinkedList<>();
增删改
结构图示
LinkedList链式表
List集合有序线性表,元素可以重复
比较equalsHashcode
无序存放数据,不重复元素唯一
元素不能重复,,无序存放,相当于只有key的HashMap
创建语法:Set<泛型>名= new HashSet<>();
与list集合指令基本一致
通过hashcode和equals判断是否重复,自定义引用类,需要重写
包含:contains方法
集合的迭代,是一种集合的遍历算法,因为set是collection的实现类,collection继承了iterator
List的实现类都是有序的线性表,便利可以直接用for循环,map和set都是无序的,所以用迭代器来遍历
迭代器
HashSet
set集合无序不重复
collection
HashMap非线程安全效率高
Hashtable线程安全效率低
HashMap与Hashtable的区别
HashMap无序存放数据,可以重复
定义:哈希表是一种根据关键码去寻找值得数据映射结构该结构是通过把关键码映射的位置去寻找存放值的地方
<>泛型内部需要定义两个类型
equals+hashcode(==)都相同时才能包含
containskey键
equals相同包含
containvalue值
对于两个对象来说,hashcode相同,一定是同一个对象同一个对象hashcode可能不同
是jdk根据对象的地址或者字符串或者是数字算出来的int类型的数值
Hashcode
HashMap哈希表
红黑树,二叉树的一种
treemap
entry方法
keyset方法
三种Map遍历
map
检查是否有下一个元素
hasNext
输出下一个元素
next
Iterator迭代器
集合
File(“路径名”)
File file = new File(路径名)
四个重载方法
file构造方法
file文件
FileInputStream
继承于Inputstream
输入流
FileOutPutStream
outputstream
输出流
8bit
字节流复制文件
exisits();文件是否存在
isFile ();是不是一个文件
isDirectory();是不是一个目录
getName();获取文件名,返回是以String的形式
canRead();只读
canWrite();可写
listFile();遍历文件
delete();删除文件
字节流
国际通用编码
GBK中1字符等于2字节
4~5个字节
UTF-8中不是2字节
字符一般用于汉字
、继承于
父节点
FileReader
Reader字符流读
FileWriter
Writer字符流写
读写
字符缓冲流读写文件
追加内容
刷新
换行
操作
字符流
一行一行读
BufferdReader
一行一行写
BufferWriter
缓冲流
按照处理的数据的单位划分
要有参照物相对的为输入输出例子:读文件
把对象的字节序列永久的存在硬盘上,通常存放在一个文件中
在网络上传送对象的字节序列
用途
ObjectOutputStream
ObjectOuyput[interface]
Implements Serializable
实现序列化
序列化
ObjectInputStream
ObjectInput
解密序列化
反序列化
存储
序列
IO流
Collection是接口,里面有list、set
Colllections工具类
collections:是工具类
Collection与Collections区别
stackOverFlowError栈溢出
OutMemoyError内存溢出
靠程序本身无法恢复的严重错误一般是环境问题,jvm的问题
Error
一般发生在程序运行前
checked受检异常
finlly在有System.exit(0);(强行行终止程序退出程序)时不执行
finally异常
final修饰
finalize垃圾回收
finally、final、finalize之间的区别
加close是要关闭资源
Scanner 变量名 = new Scanner(System.in);名.close();
finally
try尝试解决错误catch把错误存在catchfinlly无论前面是否有错都一定在try catch finally程序段的最后执行
try catch finlly 捕获异常
ArrayIndexOutofOFBoundsException
数组索引越界异常
ArithmeticException
算术异常
Null
运行时异常此外都是受检异常
runtime exception
Java检查异常
throws声明异常,不处理异常像上传,谁调用谁处理
zi定义域异常类,继承runtimeexceoyion 新建new就可以重写
抛出一个异常
throw一般用在catch内部
常用运行时异常
常用受检异常
Exception
Throwable是类继承于Oject
异常
Start只是开启,并不执行
方法一:继承Thread
方法二:实现接口Runnable
线程
同一时间只能有一个程序运行
synchronized同步锁
线程安全
默认优先级为5最小1.最大10
线程优先级
private只能创建一次
懒汉式单例
饿汉式单例
调用可以通过间接模式
单例模式
创建型模式
结构型模式
行为型模式
三大类别
单一职责原则
里氏替换原则
依赖倒转原则
接口隔离原则
迪米特法则
合成复用原则
总原则:开闭原则
六大原则
设计模式
JavaSE高级
用Java操纵数据库
本质
选择类文件及文件地址
第零步导包,加载驱动
第一步:选择数据库
链接地址,用户名,密码
导sql包
第二步:获得链接,指定数据库
Connection接口下的preparedstatement()方法(sql语句),返回一个连接用的connection接口接收
第三步准备接收sql语句
第四步:执行sql语句
第五步;对于查询来说,返回的是结果对于增删改来说,返回受影响的行数
第六步:关流
实现思路
创建一个方法选择数据库
在类内
实现步骤
添加
通过preparedStatament效率高安全
占位符?
sql注入
漏洞
删除
修改
封装操作数据库类
封装
JDBCjava database connectivity
针对单例
有困难
反射
Mysql
JDBC
事务
数据库连接池
JavaSE
web浏览器与web服务器之间的一问一答的交互过程必须遵循一定的规律,这就是HTTP协议
hypeertext transfer protocol(超文本传输协议)
建立连接
发出请求信息
会送响应信息
关闭连接
四个步骤
如果在网页中的<form>表单元素的method属性被设置为get方法,浏览器提交这个form时生成的HTTP请求的请求方式也是get
http://www.lampbrother.net/counter.jsp?name=Ic&password=123
使用get请求方式给web服务器传递参数的格式:
传送的数据量有限,一般在1kb以下
传递参数
get方式
传送数据量比get多,大概在1mb左右
post请求方式主要用于向web服务器程序端提交form表单中的数据
post方式
使用get和post方式传递参数
servletAPI中定义的ServletRequest接口类似于封装请求信息
httpServletRequest是专用于http协议的ServletRequest子接口,用于封装http的请求信息
在servlet()方法内部调用httpServletRequest对象的各种方法来获取请求信息
httpServletRequest简介
getMethod:返回请求行的请求方式
getRequestURL:返回请求行中的资源名部分
getQueryString:返回请求行中的参数部分
getProtocol:返回请求行中的协议名和版本
getContextPath:返回请求资源所属的web应用程序的路径
getServletPath方法:Servlet的名称或Servlet所反射的路径
获取请求行的相关信息
getRemoteAddr返回发出请求的客户机的IP地址
getRequestURL方法返回客户端发出请求时的完整的URL
获取网络连接
getParameter方法
getparameterValues方法
getParameterNames方法
getParameterMap方法
获取请求的参数
setAttribute方法
getAttribute方法
removeAttribute方法
getAttributeName方法
相关方法
请求域属性
servletAPI中定义的ServletResponse接口类用于创建响应消息
HttpServletResponse是专用于http协议的ServletResponse子接口,用于封装http相应消息
httpServletResponse简介
RequestDispatcher接口
用forword方法实现请求转发
请求转发的运行流程
如果传递给sendRedirect方法的相对URL以”/“开头,则是相对于整个web站点的根目录,而不是相对于当前web应用程序的根目录
sendRedirect方法不仅可以重定向到当前应用程序中的其他资源,它还可以定向到同一站点上的其他应用程序中的资源,甚至使用绝对URL重定向到其他站点的资源
用sendRedirect方法实现请求重定向
请求重定向的运行流程
RequestDispatcher。forward方法只能将请求转发给同一个web应用中的组件,而HttpServletResponse。sendRedirect方法还可以重定向到同一站点上的其他应用程序的资源,甚至是使用绝对URL重定向到其他站点资源
调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL。调用RequesDispatcher。forword方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变
HttpServletResponse.sendRedirect方法对浏览器的请求直接做出响应,响应的结果就是告诉浏览器去重新发出对另一个URL的访问请求;RequestDispacher.forword方法在服务端内部将请求转发给另一个资源,浏览器只知道发出了请求并得到了相应结果,并不知道服务器程序内部发生了转发行为
1、转发请求一次地址栏不会改变,重定向:两次请求,地址栏会改变
2、转发是服务器内部转发,必须指向站点下已知的文件;从定向:可以定位到其他站点的网页
总结转发和重定向的区别
请求重定向与请求转发的比较
请求重定向与请求转发
Http简介
@WebServlet(name = \"ShopServlet\
注解
<servlet> <servlet-name>hello</servlet-name> <servlet-class>com.neuedu.helloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/helloServlet</url-pattern> </servlet-mapping>
web.xml注册
配置servlet接口
无参构造方法
init()方法,当Servlet第一次装载时会执行一次此方法(只调用一次)
初始化
处理前端jsp页面,与后台数据库数据的地方。前端jsp页面拿参数name可以获取value的值(name和value可以看作键值对)
service
当servlet即将被卸载时通过servlet引擎调用,用来清除释放init中所分配的资源
销毁方法
servlet的生命周期
form表单中设置method方法,默认值是get模式
地址栏显示信息
处理内容1kb
get模式
地址栏不显示信息
处理内容1mb
post模式
根据不同的method做出不同的响应
service模式
servlet请求与响应方法
servlet与servlet容器
servlet接口
Java servlet Page ,Java服务页面,简化servlet混合了HTML和java
效率低,后期维护性差
servlet中可以编写页面,用out.writer()或者StringBuilder.append(\"***\").append(“***”)
第一次加载jsp页面会被编译成servlet,再由servlet编译成为class字节码和源文件
底层是final修饰的,继承自httpjspbase,httpjspbase继承自heepservlet,简单地说jsp是简化版的servlet
底层用out.writer(“***”)写的html内容,可以解析成HTML标签
jsp底层代码
概念
<%写Java代码,内置对象%>
<%=表达式,声明的变量为局部变量%>
<%!java代码,声明的变量为成员变量,可以写方法,在service之外%>
JSP中如何写JAVA
请求对象
1、request
方法:response.getWriter();
响应对象
2、response
当前jsp对应的对象,指代当前页面,可以拿到其余的8个对象
3、pageContext
会话:一个浏览器的打开到关闭
sessiold的客户端的标示
4、session
全局对象,拿当前应用,全部数据都能拿到,可用来加载信息
5、application
每个servlet都对应一个config,内部对象,特殊的方法可以访问
6、config
多态,用Object中的方法
7、page
页面输出
8、out
将isErrorPage改为true,可以使用exception对象自定义错误网页
在web.xml中<error-page>中写错代码,转向自定义错误页面
9、exception
9个内置对象
pageContext作用域最小,当前页面可以获取,其他页面拿不到
request只作用一次请求,转发时可带数据,链接属于二次请求,所以拿不到数据
用户登陆后,每页都应获取用户的数据,因此用户名密码要用session传
session的作用域是一次会话,作用在同一浏览器
application作用域是当前项目,跨浏览器也能拿到
作用域(4个)
JSP
当浏览器访问某个服务器时,由服务器的响应头传送给浏览器一个cookie,一旦浏览器保存了这个cookie,那么以后每次访问该服务器都会把这个cookie传给服务器。
解析:1、在客户端保持HTTP状态信息的方案
cookie只能标识一种信息,它至少含有一个表示该信息的name和设置值value
构造方法:public Cookie (String name,String value)
获取名字
getName方法
获取值
getValue方法
最大时效
setMaxAge
setPath
cookie类的方法
创建cookie对象
设置最大时效
如果创建了一个cookie,将他发送到浏览器上,默认情况下是一个会话级别的(临时的),储存在内存中,用户退出浏览器就会被删除。如果希望浏览器将cookie长久保存在磁盘上,则需要用maxage,并给出一个以秒为单位的时间
发送cookie需要使用HttpServletResponse和addCookie方法,将cookie插入到一个Set-Cookie HTTP响应报头中。由于这个方法并不修改任何之前指定的Set-Cookiebaotou,而是创建新的报头,因此这个方法称为addcookie,而非setcookie
将cookie放入HTTP响应头
cookie的发送
如果不设置过期时间,则表示这个cookie生命周期为浏览器的会话期。只要浏览器一关闭,cookie就会消失,这种生命周期的cookie为会话cookie,会话cookie保存在内存上。
如果设置了过期时间,浏览器会把cookie保存到硬盘上关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间
会话cookie和持久cookie的区别
案例:自动登陆
cookie机制
定义:session机制采用的是在服务器端保持HTTP状态信息的方案。当程序需要为某个客户端请求创建一个session时,服务器会首先检查这个客户端的请求里是否包含一个sessionid则说明以前已经为此客户创建过session,服务器按照sessionid把这个session检索出来使用(如果检索不到,可能会新建一个出来。这种情况可能出现在服务端已经删除了该用户对应的session对象,但是用户人为的在请求的URL后面附加上一个JSESSION的参数)如果客户请求不包含sessionid,则为此客户创建一个新的session并且生成一个与此session相关的sessionid,这个sessionid将在本响应中返还给客户端保存
浏览器自动将sessionid发送给服务器
依赖于cookie
cookie被人为禁用时经常采用把sessionid附加在URL路径的后面
重写URL
保存session的两种方式
session通过sessionId来区分不同的用户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为Jsessionid的输出cookie,这个称之为session cookie,以区别cookies。session cookie存储在浏览器的内存中,并没有写在硬盘中,通常看不到jsession但是当浏览器禁用cookie后,web服务器会采用URL重写的方式传递sessionid
session cookie
1、程序调用HttpSession.invalidate()
2、距离上次收到客户端发送的session id 时间间隔超过 了session的最大有效时间
3、服务进程被停止
session的删除
获取sessionID
getId方法
获取创建时间
getCreationTime方法
获取最后访问时间
getLastAccessedTime方法
获取最大有效时间
setMaxInactiveInterval方法
是否为新建
isNew
invalidate方法
getServletContest方法
setAttribute
getAttribute
HttpSession接口中的方法
session机制
Cookie与session
存取变量数据的方法简单
简化了Java代码
不能循环只能取变量
返回null,直接显示空字符串
只要支持Servlet2.4/jsp2.0的container就可以在jsp网页中直接使用EL了
特点:
请求域中名为request的值
语法:${requestScope.request}
pageScope
1pageContext
requestScope
2、request
sessionScope
3、session
applicationScope
4、application
${username}不写默认值直接查找
如果途中找到username就直接回传,不在继续找下去,但是如果全部范围都没找到就返回null
取变量
${param.问号后面的name}通过name拿value在网页之间传递
jsp在引入时应该尽量使用绝对路径
/jsp中,/是相对于站点,如果没有项目就会报错
${pageContext.request.contextpath}
获取项目名称
绝对路径
cookie是EL表达式的内置对象
${cookie名称,value}获得cookie的值
获取cookie信息
EL(Exception language)
JSTL
EL与JSTL
Filter
FilterChain
FilterConfig
servlet中定义了三个接口来供开发者使用(都继承于filter接口)
拦截顺序按照filter的名字的首字母顺序排列
value=”需要拦截的url“
可以注册多个filter,组合成为filter链,拦截顺序与映射顺序一致
<filter><filter-name>FilterDemo01</filter-name><filter-class>me.gacl.web.filter.FilterDemo01</filter-class></filter>
配置过滤
/*代表拦截所有
<filter-mapping><filter-name>FilterDemo01</filter-name><url-pattern>/*<url-pattern></filter-mapping>
映射过滤,设置过滤url
两种注册方式
三种典型的应用
package com.neuedu.controller;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import java.io.IOException;@WebFilter(filterName = \"FilterDemo\
拦截全部应用
拦截器(过滤器)
JavaEE
Mapper.xml映射文件中定义了操作数据库的sql是一个statement,映射文件是mybatis的核心
如果传入参数为对象的话,通过属性取值
占位符
#{}
sql拼接
${}
传递简单类型使用
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。
实体类
传递pojo对象
查询条件可能是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如查询用户信息的时候,将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数.包装对象:Pojo类中的一个属性是另外一个pojo.需求:根据用户名模糊查询用户信息,查询条件放到QueryVo的user属性中.
包装类定义的属性
编写QueryVO
SELECT * FROM user WHERE username LIKE '%张%'
Sql语句
在UserMapper中的配置SQL
Mapper.xml文件
在接口中添加方法
Mapper接口
在UserMapperTest增加测试方法
测试方法
效果
传递pojo包装类对象
输入参数映射(parameterType输入类型)
返回值映射
输入输出映射
mapper
select last_insert_Id
<selectKey KerColumn+\"\"(key)对应实体类的属性>order=
添加完成后返回最新添加的ID
Mapper.xml文件中的namespace与mapper接口中的类路径相同
mapper的namespace与接口类路径相同
Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
mapper的sqlID与接口中的方法名相同
Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
返回值类型相同
Mapper接口方法的输出参数类型和mapper.xml中定义的每个resoultType的类型相同
规则
mapper的动态代理开发
取单个接口
接口名与mapper的文件名一致
接口与mapper必须在同一路径
条件
<mapper class=\"\"></mapper>
<package name=\"\"></package>
引入多个接口
通过反射
通过路径读取
引入映射的方式
主键映射
id
映射其他字段
result
关联一个对象
association
关联多个对象
resultMap
手动映射
判断条件是否成立
if
相当于Java中的switch。。。case
when
相当于default
otherwise
choose
遍历多个元素
forEach
<sql id=\"\"></sql>
<include refid=\"id\"></include>
sql片段
去掉第一个and
相当于SQL中的where关键字
where
动态sql
创建结构及对应的实体类
多个条件之间用and链接
where后面加多个条件
sql92
多条件之间用on链接
sql99
多表关联查询
实体类中引用关联对象
用多个<select>标签查询
表单独查询
三种方式
一对一查询
关联查询
MyBatis
SSH Spring Struts2 Hibernate
SSM spring spring MVC MyBatis
两种框架模式
解耦合
spring框架属于一站式框架
容器中装什么对象就有什么功能
spring框架属于容器性质
不排斥其他框架,还能帮助其他框架管理对象
面向切面编程
aop支持
ioc思想
spring jdbc
spring框架简介
1、导入jar包
2、创建一个对象
1、位置任意(建议放到src下)
2、配置文件名任意(建议放到applicationContext.xml)
3、导入约束
4、将对象交给spring容器管理
3、书写配置注册对象到容器
4、代码测试
Spring搭建
1、创建对象的方式反转
2、以前开发由开发人员自己维护,包括依赖关系也是自己注入
3、使用spring之后,对象的创建以及依赖关系可以由spring完成创建以及注入
4、反转控制就是反转了对象的创建方式从我们自身创建反转给程序(spring)
反转控制
IOC
setter方式注入
简单值、集合、bean对象
构造方式注入
依赖注入
DI
spring是具有ioc特性的框架,由spring容器来实现ioc。spring容器是通过依赖注入DI建立起对象(组件、bean)之间的关系
ioc与DI之间的关系
spring概念
set方法注入
构造方法注入
字段注入
注入方式
注入类型
set注入
对象注入方式
p命名空间
属性注入方式
DI(dependency Injection)
跟随容器启动而创建
跟随容器销毁而销毁
Bean对象创建调用
init-method
销毁调用
destory-method
自定义初始化和销毁
Bean生命周期
Scope=“singleton”
单例
Scope=“prototype”
多例
Bean单例和多例
管理对象容器
Spring-context
Maven
导入依赖
导入约束
注册一个bean
创建applicationContext.xml文件
一次加载
容器创建就创建对象
ApplicationContext
节省空间
获取对象时再创建对象
BeanFactory
读取配置文件
编写test类
第一个程序
后面不加(value=“”)默认小写类名
@componet
设置属性的值
@value
父主题
JDK提供的方法
默认先按变量名查找,如果没有找到与变量名相对应的类,那么会按照变量前面的类型找
当componet没设置(name=“”)时
当component设置name时,按照name找
@Resource
Spring提供
@AutoWired 未指定name按照变量名找,如果有多个父子继承关系的类可以查找
单独写一个Qualifier会注册不进来,有丢值得现象
指定类型
@Qualifier(value=\"\")
@component(value=\"属性名\")
@Respository
用于控制层
@controller
用于服务层
@service
注解方式包括
spring-context
1、导包
<context:compont-scan base package=\"\">
组建扫描
2、引入context约束
注解方式创建spring
IOC(Inverse Of Control)
注解开发流程
aop是将共同的部分抽出来,作用在一个或多个 目标对象上。有点类似class选择器
Aspect Oriented Programming
Aop简介及好处
指的是共同业务处理,可以切入到多个目标对象,可以多次使用
Aspect切面
将切面代码插入到目标对象中
织入 (Weaving)
可以被切面织入的方法,通常业务接口中的方法皆为连接点
连接点joinPoint
指切面具体织入的方法
切入点(pointcut)
只要被增强的对象
目标对象(Target)
通知是切面的一种实现,可以完成简单的织入功能,
通知定义了增强代码切入到目标代码的时间点,决定了是在目标方法执行之前执行,还是执行后执行。通知类型不同,切入的时间不通
通知(Advice)
AOP的概念
AOP
HandlerMapping会将请求交给Handler,由Handler调用自定义的***.service
service返回值给Handler,在返回给DispatvherServlet
DispatcherServlet调用ViewResolver(视图解析器)
最后由view渲染响应客户端请求
DisparcherServlet收到请求会调用HanderMapping
用户发送请求
springMVC处理流程
Spring
DML (Data Manipulation Language):数据操纵语言,用于增删改查数据库记录,并检查数据完整性
DDL
DCL
分类
原名叫Mysql
简介
不区分大小写
每句话用“;”或/g结尾
各子句一般分行写
关键字不能缩写也不能分行
应缩进提升语句可读性
规范
创建create database 库名
删除库:drop database数据库名
使用:use数据库名
查看:show databases;
创建数据库
create table 自定义名(字段(表头)类型,字段(表头)类型。。。)
创建表
drop table 表名
删表
desc 表名
查看表结构
show tablesselect*from.user
查数据
查表
where是条件
updata 表名set列1=列1的值,列2=列2的值where
修改列
添加列
重命名:select列名(AS)“列名别名”from表名
仅仅修改显示的结果,并没有修改表中的真实数据
列的别名
SELECT *
查符合条件的
升序ORDER BY 以。。分组
降序DESC
select ‘123’;显示列名123,值位123
select1+2,显示列名1+2,值位3
字符串
查列
insert into 表名(表头)values(值);
增加数据
delete*from表名;
全删
delete from表名 where 加条件
单删(有条件)
全改:update表名set表头=值;
单改(有条件):update 表名 set 表头= 值where 。。。
针对表数据的操作
表
#注释
=
>
>=
<
<=
<>或!=
单行比较操作符
BETWEEN...AND...大于等于小于等于
IN(set)
%匹配多个
下划线匹配一个
LIKE关键字
不是
NOT
或者
OR
空值
NULL
逻辑运算符
where 表名.关系标题=表名.关系标题
语法
where加入
多表连接
where连接关系两个表的条件
笛卡尔集
表的别名和列的别名一样使用表名前缀可以提高执行效率
区分重复的列名
自然连接中拥有相同名字的列名作为连接条件
可以使用on子句制定额外的链接条件
这个链接条件与其他条件分开
on子句的使用拥有更高的易读性
使用on子语句进行连接
试例二
示例一
inner joinon。。。
内链接(默认join内链接)
右外连接
左外连接
外连接
内链接,外连接之间的关系
连接多个表链接n个表,需要n-个连接条件
表的别名
多表查询
lower()大写换小写
字符函数
两列变一列
concat连接字符串
SUBSTR(表头,开始,长度)
LENGTH()长度
INSTR()获取字符串内的值
左填充
LAPD()
右填充
RPAD()
去前后位置的元素
TRIM()
替换
REPLACE()
字符控制函数
ROUND四舍五入
截小数位
TRUNCATE截断
MOD求余
str_to_date:将日期格式的字符装换成指定格式的日期
date_format:将日期转换成字符
NOW()获取当前时间
字符和日期用‘’“包括
数字函数
简单实用
insertinto表名(列名,列名,。。。)values(。。)
一次添加一条
插入空值
与被拷贝的表的标题一致
拷贝数据
INSERT 语句
UPDATA
使用where子句删除指令
不加where全删
delete from 表名 where。。
DELETE语句
crud增删改查
DML数据操纵语言
原子性,不可分割
一范式
有主键,有一个字段唯一
二范式
外键依赖
三范式
关系型数据库(满足三范式)依次满足
范式
在其他select内部的select语句
内嵌其他select语句的查询,称为外查询或主查询
子查询要包含在括号内
将子查询放在比较条件的右侧
单行操作符对应单行子查询,多行操作符对应多行子查询
注意事项
只返回一行
使用单行比较操作符
首先执行子查询
非法使用子查询
子查询的空值问题
想主查询中的HAVING 子句返回结果
HAVING
单行子查询
IN/NOT IN
>=1的意思
ANY/SOME
ALL
多行操作符
返回多行
多行子查询
子查询
ADD 名 类型(长度)
追加列
数据类型
MODIFY
DROP cloumn
删除列
CHANGE 旧名 新名 (数据类型)
重命名一个列
ALTER TABLE语句
修改表
DROP TABLE name
删除表
TRUNCATE TABLE name
清空表
列的操作
多表之间的连接(链接两个表)
不去重
UNION ALL
相同的列,相同的数据类型,去重
有BUG顺序不对也可以合并,按照自己表格的顺序合并
UNION
数据一致性
数据正确,符合要求
数据库完整性
数据库
为了保证数据的一致性和完整性,SQL规范以约束方式对表数据进行额外的条件限制
约束是表级的强制规定
可以在创建表时规定约束(通过CREATE TABLE 语句),在创建后可以通过ALTER TABLE语句
DEFAULT 默认值
表级
修改表结构
列级
确保当前列值不为空值
NOT NULL
非空约束
constraint 约束名unique(列名)
多列,每列都同时为重复
constraint 约束名unique(列名1,列名2)
组合约束
在创建表时直接创建
alter table表名add(约束名)unique(列名,列名。。。)
alter table表名modify列名 数据类型unique;
alter table 表名 drop index 约束名
某个字段在整个表中是唯一的
UNIQUE
唯一约束
列名 数据类型 primary key(列名)
列级模式
constraint自定义名primary key(列名)
表级模式
复合主键
constraint 自定义名 primary key(列名1,列名2)
组合模式
alter table 表名add primary key(列名)
添加主键约束
alter table 表名modify列名 数据类型 primary key 没有主键约束时
修改主键约束
删除所有的主键约束
删除主键约束
相当于唯一+非空
PRIMARY KEY
主键约束
保证一个或两个表之间的参照完整性,外键是构建于一个
当一个表的主键(主表)作为另一个表(从表)的外键的时候,不能删除这个表(主表)的主键
外键可以为空,主键不能为空
一个表可以有多个外键
从表中的外键可以为空或为主表中的数据
create table(。。。,constraint约束名foreign key(外键列名)refernces)
foreign key (外键列名)references 从表(主键列名)
CONSTRAINT
创建一个外键
FOREING KEY 外键
添加要添加的数据的条件
添加数据时,没有任何错误或警告
语法:列名数据类型check(列名 运算符 值)
基本没啥用
CHECK 检查约束
增加
六种
单列约束:每个约束只约束一列
多列约束:每个约束约束多个数列
根据数据列的限制分
列级约束:只作用在一个列上,跟在列的定义后面
表级约束:作用在多个列上,不与列在一起,而是单独定义
约束作用范围分
例子:limit 0,5
需要写两条数据
limit必须放在整个查询语句的最后
公式:(当前想查的页数-1)*每页条数,每页条数
limit
分页
约束
保存SQL的逻辑,不保存结果
虚拟存在的表
提高重用性
提高安全性
数据清晰
对数据库重构,不影响程序的运行
视图的好处
示例
存的sql语句
CREATE VIEW 名ASSELECT ...
创建视图
ALTER VIEW 视图名AS select_statement[with|cascaded|local|chech option]
修改视图
drop view视图名
删除视图
视图
与表相关的触发器,满足条件的情况下执行
insert
update
delete
触发事件
before
after
触发时间
old
new
触发对象
想删主表里的内容,先删从表中的链接key
删除必须在之前触发
CREATE TRIGGER 触发器名DELETE ON 表名FOR EACH ROW范围 BEGIN操作WHERE 条件;(分号必须写)END
创建触发器
SHOW TRIGGERS
查看触发器
触发器
提高查询效率
缺点:增大索引空间,降低数据增删改的性能
优点
查看SQL的执行结果
EXPLAIN
可以添加索引,查询效率高
CREATE INDEX
创建索引
大于五个索引以上有待优化
一般定义在简单的基本数据类型上
索引
事务是由一个或多个SQL语言组织,这些SQL语言之间相互依赖,若其中一条执行失败,会回滚到最初状态
通过show engines;可以查看数据库支持的存储引擎有哪些
数据库中有不同的技术来储存数据:引擎
不可分割
原子性(Atomicity)
事务必须使数据库从一个一致性的状态变成为另一个一致性的状态
一致性(Consistency)
事务一读取了事务二更新但没提交字段,事务二回滚,则事务一读取的内容是临时且是无效的
脏读
若事务一先读取,事务二后更新,则事务一再次读取同一字段,值便不同
不可重复读
事务一读取后,事务二插入新行,事务一再次读取会多出几行
幻读
并发执行的事务不能相互干扰,如果没有隔离会出现:
一个事务与其他事务的隔离程度成为隔离级别
隔离性(Isolation)
事务一旦提交,其改变是持久性的
持久性(durability)
事物的ACID属性
开启事务:start transation
多条SQL语句分别操作
在提交前可以回滚到最初状态rollback
完成后提交事务:commit
数据库中处理事务的步骤
jdbc
tinyint=byty范围-128-127
varchar可变字符
m=整数个数+小数个数,d=小数个数
double(m,d)
常用数据类型
Mysqlstructure query language结构化查询语言
volume巨大的数量
variety 数据的多样性
velocity 数据增长速度快
value 数据的价值类型
vercity 数据的真实性
存储容量
读写速度
计算效率
系统瓶颈
Hadoop之父 Dong Cutting
HDFS 分布式文件系统
Mapreduce 分布式计算框架(计算和分析)
HBase非关系型数据库
Hadoop生态圈
大数据
基于对象的脚本语言
解释执行
代码以纯文本形式储存
类型宽松
Netscape公司和sun公司
表单确认
页面修饰以及特殊效果
导航系统
基本数学运算
动态文档生成
JavaScript功能
脚本编写
基于对象
简单
动态
跨平台
JavaScript特点
一个描述,供扩展
ECMAScript
通过创建树来表示模型
DOM文档对象模型
访问和操作浏览器窗口
没有统一的标准,每种浏览器都有自己的BOM
BOM浏览器对象模型
包含
可以嵌入任何位置
在HTML中潜入JavaScript代码
嵌入使用
影响表级的某个事件
多个页面使用相同的JavaScript代码将共用代码保存在以.js为扩展名的文件中在页面中使用src属性引入外部文件<script type=\"text/javascript\" src=“a.js”></script>
引入使用
不输入值:alert();
可以输入值:Window.prompt();
弹窗
控制台输出:console.log();
页面:document.write();
显示结果方式
引用方式
JavaScript简介
单行//
注释快/**/
注释
“”‘
使用\\+特殊字符
特殊字符
var 变量名
变量声明
以字母、下划线或$开头
余下的字符可以实下划线、美元符号或者是任何字母、数字
最长255个字符
不能有空格,大小写敏感
不能使用JavaScript关键字或者保留字
方法外:var i = 0;
方法内: i =0;
全局变量
方法内:var i = 0;
局部变量
作用域
变量命名
用来检测变量的数据类型
typeof操作符
未定义的变量值为undefined
Undefined-未定义类型
值为null
Null空类型
true/false
Boolean布尔类型
NaN表示非数
Number数字类型
String字符串类型
五种原始类型
ECMAScript6
ECMAScript5
Object
复杂类型
转义字符
数值与字符相加,将数值强制转为字符串
布尔值与字符串相加,将布尔值强制转换为字符串
数值与布尔值相加,将布尔值强制转换为数值
变量执行运算
parselnt(var)
parseFloat(var)
只对string类型有效,且需要时数字开头的字符串
字符串变数值
toString()
将任何类型的值转换为字符串
如果是null或undefined,返回null或者undefined
数值变字符串
字符串与数值
转型函数,用于任何数值类型
Boolean类型的true和false分别转成1和0
null空对象返回0
undefined返回NaN
Number()函数
类型转换JavaScript是弱类型语言,变量的类型对应于其值的类型可以对不同类型的变量执行运算,解释器强制转换数据类型,然后进行处理
优先级
==比较值
===比较类型和值
对比
类型转换
区分大小写
语句由一个或多个表达式、关键字或运算符组成
多行语句写在同一行,之间用分号分开
单独一行只有一条语句,可以省略分号
语句规范
由常量、变量和运算符等组成
表达式可以作为参数传递给函数,获奖表达式结果赋予给变量保存起来
逻辑表达式、数值表达式和布尔表达式
操作数是指表达式中的常量或变量,也包含表达式的返回值
表达式
区分大小写变量 myTest、myTEST是不同的变量变量是弱类型行结尾加分号括号表明代码块注释通用简单在浏览器中逐条解释执行,如果某条语句出现错误,后面的语句将不能执行。
JavaScript基本语法
if else
if else if
switch
选择语句
for-in遍历数组
while()
do-while
跳出并结束当前循环
break
忽略后面语句并结束当前循环,开始下一轮循环
continue
循环语句
try-catch
try-catch-finally
throw
异常处理
流程控制语句
function 函数名(参数列表){具体实现;return表达式}
必选项:function关键字函数名
普通定义
var变量名=new Function(参数列表,【函数体】);
函数变量名
变量的定义方式实质上就是创建一个对象
变量定义
值得传递
函数返回值
函数名(参数列表)
arguments对象
函数定义时,参数列表为空,函数也可以接受任意个数的参数,通过arguments来访问
获取参数时:arguments[索引] 从零开始
参数个数用arguments.length来定义
参数
调用
将数字字符串转换为数字
如果失败返回NaN
Number()、parselnt()、parse Float()
判断是否是非数
isNaN
把字符串中含有的JavaScript编译出来并执行
eval()
常用函数
函数
var obj =new Object();
new关键字可以不写
new运算符
var obj = {属性名:值,属性名:值,方法名:function(){}}
字面量
创建对象
alert(obj.属性);
alert(obj['属性名']);
输出
delete obj.属性名;
var 变量名=对姓名.属性名;
with(对象名){//省略了对象名var变量名 = 属性名;var 变量名 = 属性名;}
with语句
取值
属性
调用:obj.方法名()
对象成员
JavaScript中的数组中数据类型可以改变
数组长度不固定时,复制可以改变数组长度
空数组:var Obj = new Array();
通过指定数组长度创建数组:var Obj = new Array(Size);
通过指定元素创建数组:var Obj = new Array(元素一,元素二。。。,元素N);
直接创建数组:var Obj = [元素一,。。。元素N];
仅指定长度但没有实际填充元素及其数据的数组将得不到数据存储空间
数组长度为指定长度
遍历数组,仅显示实际填充元素个数
输出数组,显示所有元素,没有填充,则为空,例如:(1,2,,,)
实际填充元素个数>指定长度
创建数组
直接赋值:数组名【下表索引】=值;
通过for循环赋值
赋值
数组名【下表索引】
使用数组
push方法是将新元素添加到数组的尾部,Obj.push(值);
unshift方法将指定个数的新元素插入数组开始的位置
增(返回值为长度,在本数组上修改)
删 delete数组名【下标】
长度 Obj.length
点到数组元素的顺序:数组名.reverse();
顺序反转
sort
排序
基本操作
解析字符串中的JavaScript代码
eval()方法
Global全局对象
var 自定义名 = new Date();
要使用new关键字创造一个新的Date对象
getFullYear():返回年数;
getMonth():返回当月号数;(比实际小一)
getDtae():返回当日号数
星期的天数以及年的月数是从0开始的。因此,第0天是星期日,第6天是星期六;第0月是1月。但是每月的天数是从1开始计数的
getDay()返回星期几(0表示星期日)
getHours()返回小时数
getMinutes()返回分钟数
getSecond()返回秒数
getTime()返回毫秒数
Date对象的setDate、setMonth方法的参数可以为负值,会导致从年或者月借位
月份0-11表示一月到十二月,也是差1,为后面的练习打基础日期函数中的星期几用数字表示,星期一到星期天(七)一般用数字0-6表示,和中国人的习惯差 1
Date
全局对象,使用时不需要创建实例
abs(x):返回x的绝对值
ceil(x)返回大于等于x的最小整数
fioor(x)返回小于等于x的最大整数
round(x)舍入到最近的整数
Math.round(Math.random()*8+1)产生1-9的数字
Math
和原属字符串类型对应的内置对象
var string_ =\"string of text\";
var string_name = new String(\"string of text\")
声明
length返回string对象长度
charAt(i)返回索引处位置的字符
concat(str)连接字符串
indexOf(str)返回String对象中子字符串最后出现的位置
lastindexOf(str)返回String对象中子字符串最后出现的位置
raplace(str1,str2)返回将str1替换成str2后的字符串
substr(start,length)返回一个指定位置开始的指定长度的字符串
substring(start,end)返回一个指定位置之间的字符串,不包括end
toLowerCase返回一个字符串,zuanhuanweixiaoxiezimu
toUpperCase返回一个字符串,转换为大写字母
String
Number
Boolean
内部对象
JavaScript对象
window对象
浏览器由shell和内核构成
提示框:alert(“提示信息”);只能确定(一个按钮)
输入信息提示框:prompt(用户输入信息提示,文本框默认值);(获取的值为字符串,取消则为null)
对话框,确认信息:confirm(确认提示信息;两个按钮(确认,取消))
与用户交互
让函数在一定时间内重新执行,递归调用
如果不递归调用仅执行一次
var timeld = setTimeout(“函数名”,时间间隔);
clear Timeout(timeld)
清除设置的setTimeout函数
clear Timeout函数
setTimeout函数
让函数在一定时间内重新执行,外部调用
var timeld = setInterval(“函数名”,时间间隔);
clearInterval(timeld);
清除设置的setInterval函数
clearInterval 函数
setInterval函数
定时执行
用户访问过的站点的列表
方法:go()、back()、forward()
back();histor.go(-1),都是后退一页
forward();与history.go(1);功能相同
back()与forword()只能向前向后一页
区别
三个标签只对访问过的页面有效
history对象
write()/writeln()动态向页面写入内容
document.createElement(Tag)创建一个HTML标记对象
document.getElementById(id)获得指定id名的对象
document.getElementsByName(Name)获得指定Name值的对象
document.getElementsByTagName(Name)获得某标签的全部对象
document对象
浏览器对象模型BOM(Browser Object Model)浏览器对象模型
在 HTML DOM 中,所有事物都是节点。DOM 是被视为节点树的 HTML。每个节点都拥有包含着关于节点某些信息的属性。这些属性是:nodeName(节点名称)nodeValue(节点值)nodeType(节点类型)
getElementById(id) - 获取带有指定 id 的节点(元素)appendChild(node) - 插入新的子节点(元素)removeChild(node) - 删除子节点(元素)
一些常用的 HTML DOM 方法
对鼠标或键盘进行处理的函数
onLoad页面内容完成封装时触发
onBlur当元素失去焦点时触发
onClick鼠标点击时触发
onFocus当某个元素获得焦点时触发
onDblClick鼠标双击时触发
onMouseOver鼠标移动到对象上时触发
onMouseOut当鼠标离开对象时触发
onMouaeUp当鼠标按下松开鼠标时触发
鼠标事件
onKeyPress当键盘上的某个键按下并且释放时触发
onKeyDown当键盘上某个键被按下时触发
onKeyUp当键盘上的键被按下放开时触发
键盘事件
事件处理
onBlur复选框失去焦点
onFoucus复选框获得焦点
onClick复选框被选定或取消选定
事件
checked查看复及修改选框状态,选中true,未选中false
value设置获取复选框得值
checkBox复选框
创建:var 变量名 =new Option(“显示值”,参数值)
添加到下拉列表:select的变量名.appendChild(option的变量名)
option表示选项值
选项个数
length属性
selectedIndex属性 获取当前选项的索引,默认值为0
value下拉列表中,被选选项的值
options所有的选项组成一个数组,options表示整个选项数组,下表索引从0开始
selectedIndex返回被选择的选项的索引号,如果选中第一个返回0选中第二个返回一,以此类推
onBlur 下拉列表失去焦点
onChange当选项发生改变时产生
onFocus下拉列表获得焦点
selet下拉列表
表单
HTML DOM编程 Document Object Model(文档对象模型)
一个描述字符模型的对象,主要用来验证客户端的输入数据
var变量=new RegExp(‘正则表达式’);
new RegExp(“参数字符串”,参数可选模式修饰符)
var变量 =/参数字符串/参数可选修饰符
字面量方式
i-----忽略大小写
g----全局变量
m----多行匹配
模式修饰符
创建
test()---验证是否匹配 返回true/false
str.match();如果全局,返回 string类型数组,否则只显示第一个,没有则为null
match(正则表达式)---返回符合条件的字串,或null
replace(正则表达式,替换的内容) 返回改变后的字符串
search(正则表达式) 返回符合条件的开始位置,否则返回-1,下表从“0”开始,空格也可以通过下标找到
split(正则表达式) 返回的字符串按指定的正则表达式拆分的数组
String对象中的正则表达式
RegExp类表示正则表达式
“.”--匹配除换行符以外的任意字符
[a-z0-9] 匹配括号内的字符集的任意字符
[^a-z0-9]匹配不在括号中的字符集的任意字符
\\d 匹配数字
\\D 匹配非数字等同于[^0-9]
\\w 匹配字母数字和_
\\W 匹配非字母数字下划线
单个字符和数字
x? 匹配0个或一个
x* 匹配0个或任意多个
x+ 匹配至少一个
(xyz)+ 匹配至少一个(xyz)
x{m,n} 匹配最少m个,最多n个
重复字符
匹配this或ehere或logo中任意一个存在
|:this|where|logo
替代字符
^ 首行匹配
$行尾匹配
锚字符
元字符
/[0-9]{6}/
检查邮件编码
/[\\w]+\\.zip|rar|gz/
检查文件压缩包
/\\s/g
删除多余空格
电子邮件验证
常用的正则表达式
JAVA Script
JavaScript封装的库,就是为了简化开发者使用JavaScript
AngularsJS
Vue.js
React.js
JavaScript库
精确选择页面对象
进行可靠的CSS样式控制
使DOM操作规范化
标准化事件控制
支持网页特效
扩展JavaScript内核
功能
本地导入:与导入自定义的js文件相同
从百度、新浪、谷歌或者微软加载过jQuery
缺点:联网
菜鸟教程CDN:<script src = \"http://cdn.ststic.runoob.com/libs/jquery/1.10.2/jquery.min.js\">
新浪CDN:<script src = \"http://libs.sinaapp.com/js/jquery/2.0.2/jquery-2.0.2.min.js\">
谷歌CDN:<script src = \"http://ajax.goodleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js\">
微软CDN:<script src = \"http://ajax.htmlnetcdn.com/ajax/jQuery/jquery-1.10.2.min.js\">
例如:
CDN代替方案
导入方式
初识
$():将DOM对象转化为jQuery对象
selecter:选择器,获取需要的DOM元素
action():jQuery中提供事件的解决方法,其中包括绑定事件处理的方法
$(select).action()
$(document).ready(function(){})
比较
确保DOM载入完毕后开始执行
$(h2).css(\"background-color\
$(\"h2\").css({\"width\":\"100px\
设置css样式:css(“属性”,“属性值”)
类选择器一般写在css内
添加类样式:addClass(\"类选择器的名字\")
获取元素的其后紧邻的同辈元素:next()
返回值用变量接受
取得第一个元素的html内容:html()
常用语句
创建元素节点:¥(\"<li></li>\");
创建属性节点:$(\"<li id = “li1”></li>\")
创建文本节点:$(\"hello world \");
$(<li id = \"li1\">hello world</li>)
内部插入:$(\"ul\")append($(\"<li></li>\"))
后面插入:after()
前面添加:before();
插入
节点
标签选择器:$(\"h2\")
类选择器:$(“.title”)
id选择器:$(\"#title\")
并集选择器(类似组合选择器):$(\
全局选择器:$(\"*\")
基本选择器
后代选择器$(\"#menu span\")
子选择器:$(\"parent>child\")
选取金陵prev元素之后的next元素
后代选择器:包括其下所有标签
子选择器:只选择子标签
相邻元素选择器:$(\"prev+next\")
层次选择器
属性选择器
类css选择器
选取第一个元素
$(\"li:first\")
选取最后一个
$(\"li:last\")
选取索引是偶数的所有元素(index从0开始)
$(\"li:even\")
选区索引是奇数的所有元素(index从0开始)
$(\"li:odd\")
选区索引等于index的元素(索引从0开始)
$(\"li:eq(1)\")
选取索引大于index的元素(index从0开始)
$(\"li:gt(1)\")
选取索引小于index的元素(索引从0开始)
$(\"li:lt(1)\")
基本过滤器
可见性过滤选择器
内容过滤选择器
子元素过滤选择器
表单过滤选择器
表单对象属性过滤选择器
过滤选择器(通过特定的规则来筛选元素“:”)
选择器
mouseover():实现鼠标经过时特效
mouseout():鼠标移出
$(document).click(function(){})
$(document).keydown(function(event){if (event.keyCode==\"13\"){alter(\"确认提交了吗?\")}})
keydown():按下键盘时发生
keyup():释放按键事件
keypress()“点击事件(产生可打印的字符时)
$(\"标签名\").focus(function(){$(this).addClass(\"css样式类名\");|});
focus():获得焦点
blur():失去焦点
表单事件
window事件
基础事件(没有on)
hover()方法相当于mouseover与mouseout方法的的组合事件
$(\"#ID选择器\").hover(function(){$(\"#ID选择器1\").css(\"display\
鼠标光标悬停
鼠标连击事件
event:事件,主要包括blur、focus、click、mouseout等基础事件,此外还可以是自定义事件
selector:选择器,一个最初传递到.on()事件处理程序的附加选择器
data:数据,当一个被触发时要传递event.data给事件处理函数
fn:处理函数,用来绑定的处理函数
$(\"input[name=event_1]\").on(\
单个事件绑定方法
$(\"input[name=event_1]\").on(\"mouseover:function(){$(\"ul\").css(\"display\
多个事件绑定的方法
绑定事件
复合事件(多个事件组合)
$(\"/content\").show(600);
毫秒(1000)、slow、normal、fast
show():显示元素
hide():隐藏显示元素
控制元素的显示与隐藏
$(\"li:gt(5)\"):not(:last)\".toggle();
毫秒(如1000)、slow、normal、fast
切换元素状态toggle()
淡入fadeln()
淡出fadeOut()
毫秒)(1000)slow、normal、fast
控制元素淡入淡出
slideDown()可使元素逐步延伸显示
slideUp()是元素逐步缩短至隐藏
毫秒(1000)、slow、normal、fast
滑动效果
动画
单个属性:css(样式名称,样式)
多个属性:css({样式名称:样式,样式名称:样式})
样式操作,css();
追加样式:addclass(class)或addClass(class1,class2.。。)
移除样式:removecClass(“style”)或者removeClass(“style,style1”)
css-DOM操作
元素样式
内容以及value属性值操作
获取元素:$(\"div.left\").html();
设置元素:$(\"div.left\").html(\"<div class='content'>...</div>\");解析标签
HTML代码操作
获取文本内容:$(\"div.left\").text();
设置文本内容:$(\"div.left\").text(\"文本信息\");
文本操作
获取元素的value属性值:$(this).val();
设置元素的value属性值:$(this).val(\"jQuery框架\");
value值操作:val()
元素内容
DOM
JQuery
svn
cvs
集中式版本控制器
初始化一个本地仓库
git init
git仓库的根目录
将工作取得文件提交到暂存区
git add
commit不能直接提交工作区的文件,一定要先add才能用commit提交
清空暂存区,提交到本地仓库
git commit -m \"提交时的文件描述\"
查看工作状态
git status
工作区(在同一文件夹内,也就是git仓库的根目录就叫做工作区)
本地仓库
git remote add origin “远程仓库地址”
关联远程仓库
提交后没有任何提交成功的提示
第一次提交用-u
git push -u origin master
提交
远程仓库
git log
查看提交的log
git reset --hard commited
版本回退
git常用命令
git branch -b 分支名
创建并切换分支
git branch
查看分支
git checkout 分支名
分支切换
git checkout a
1、切换到a分支
将其它分支内容合并到当前分支
2、分支合并:git merge 其他分支名
需求:将a分支的内容合并到b分支
分支合并
git push origin head -u
需求:将本地分支推送到远程
分支推送
git pull origin分支名 拉取远程仓库数据
拉取远程仓库数据
git clone 远程端克隆地址
分支
基于功能划分
分支开发
主干发布
分支开发,主干发布
企业中git使用
分布式控制版本工具
版本控制工具
git
Linux创建连接MySQL
人性化,简单易懂,好上手
窗口卡顿
安装软件后需要重启
蓝屏
缺点
windows
智能手表
智能电视
服务器
跨平台的硬件支持
基于小红帽的免费版
centos
乌班图
ubuntu
小红帽
redhat
kail
可以通过yum指令安装软件,yum会将相关联的软件一并安装
丰富的软件资源
最高权限
root
普通用户
好处,可以为每个用户分配不同的权限
多任务多用户
因为权限管理做得非常完善,一些恶意病毒无法获取到最高的权限,所以无法执行
可靠的安全性
安装新的程序时不需要重启操作系统,号称20年不死机
良好的稳定性
linux自带强大的防火墙,对网络安全管理的非常完善
完善的网络功能
每一个文件和目录从根目录开始
只有root用户具有该目录下的权限
注意:/root是root用户的主目录
1、/-根
所有的用户使用的linux命令都在这个文件夹内
2、/bin中-用户二进制文件
3、/sbin 存放特权级二进制文件
4、/etc 存放配置文件
5、/dev 设备文件,存放抽象硬盘
6|、/proc 进程信息
比如:系统日志文件,包和数据库文件
7、/var 存放经常变化的文件
包含系统和用户创建的临时文件,当系统重启时,这个目录下的文件都会被删除
8、/tmp 临时文件
/usr/bin包含用户程序
/usr/sbin 包含系统管理员的二进制文件
/usr/lib 包含从原安装的用户程序
9、/usr 存放安装程序(软件默认安装目录)
存用户个人档案
10、/home 普通用户目录
11、/boot 存放内核与启动文件
12、/lib 存放系统库文件
13、/opt大型软件存放目录(非强制)
临时安装目录,系统管理员可以挂载文件系统
14、/mnt 挂载目录(u盘、光驱)
15、/media 可移动媒体设备
16、/服务数据
目录结构
显示当前登录用户
$ who
$whoami
用来切换用户
$su
以root用户身份执行
$sudo command
更改密码
$passwd
用户
可用于设置网络接口
显示网络接口以及相应的ip地址
$ifconfig
关闭ctrl+c
连接外网
$ping
运行eth0接口
$ifup eth0
关闭eth0接口
$ifdown eth0
重启网卡
service network restart
网络
查看当前进程,并及时更新(动态的)
退出:q
top
ps命令将某个进程显示出来
grep 命令是查找
中间的|是管道命令是指ps命令与grep的通道
ps -ef|grep详解
显示当前shell下的进程(不更新)
ps
杀进程
$sudo kill-9 进程id
进程
mkdir
创建文件夹
cd~进入主目录
cd / 查看根目录
cd .. 返回上级目录
cd
pwd查看当前目录路径
ls查看当前目录文件
rm-rf删除文件夹
文件夹
如果文件不存在,创建一个空白文件;如果文件存在,更新文件读取和修改的时间
touch filename
vi filename
创建文件
编辑状态
i
保存并退出
wq
强制保存退出
wq!
不保存退出
q!
shift:
esc
vi
编辑文件内容
复制file1为file2
$cp file1 file2
递归复制目录的内容
cp -r file1 file2
文件复制
移动文件到目标文件夹
mv+原文件+目标文件夹
mv oldfilename newfilename
修改文件名
mv+旧文件名+新文件名
mv
文件剪切
cat filename
$head -1 filename
显示文件第一行
显示文件
- 代表文件
d 代表文件夹
第一位
创建该文件的用户,对该文件所应有的权限(读,写,执行)
第一组
用户组对该文件所拥有的权限(读、写、执行)
第二组
其他用户对该文件所拥有的权限(读、写、执行)
第三组
每三位一组
后九位
r4w2x1
创建用户,用户组,其他用户
chmod ***
修改文件权限
-rw-rw-r--
ls-l
查看隐藏文件:ls-a
ls-la
查看隐藏文件属性
查看文件属性
$rm-rf filename
删除文件夹,及其包含的所有文件
$rm -r filename
删除文件
从根目录查找文件的位置
find/-name文件名
查找文件
文件
常用命令
从yum上下载并安装mysql
yum -y install mysql-server mysql-dev
mysqladmin -uroot password ‘密码’
设置密码
mysql -u root -p
链接Xshell登录mysql
进入mysql库中的user表中,将密码为空的多余用户删除
修改权限,所有用户都可以使用这个数据库
flush privileges刷新后就可以远程使用了
数据库配置
sudo systemctl start filewalld
开启防火墙
sudo systemctl status filewalld
查看防火墙
sudo systemctl restart filewalld
重启防火墙
sudo systemctl stop filewalld
关闭防火墙
防火墙设置
1、firewall-cmd --get-active-zones
2、firewall-cmd --zone=public --add-port=8080(-8085)/tcp --permanent
3、firewall-cmd --reload
firewall-cmd --query-port=8080/tcp
查看端口号是否开启,运行命令:
centos7开放端口
Linux
操作系统
linux
安装路径下的/nginx/sbin/ nginx -t
测试配置文件
安装路径下的/nginx/sbin/nginx
启动命令
安装路径下的/nginx/sbin/nginx -s stop
或者是:nginx/sbin/nginx -s quit
停止命令
安装路径下的/nginx/sbin/nginx -s reload
重启命令
ps -ef|grep nginx
查看进程命令
kill -HUP[Nginx主进程号(即查看进程命令查到的PID)]
平滑重启
常用指令
Nginx是一款轻量级的web服务器,也是一款fanxiangdaili
默认
高稳定、高性能、资源占用少、功能丰富、模块化结构、支持热部署
1、可以作为http反向代理服务器
2、作为负载均衡器
3、作为邮件代理服务器
4、帮助实现前端动静分离
应用
首先退回到桌面上whereis nginx查出nginx文件所在的位置
进入文件夹后找local进入后找nginx文件夹
目录转发
nginx
mysql
oracle
sqlserver
db2
关系型
mongoDB
文档数据库
redis
memorycache
键值对数据库
hbase
非关系型
支持永久缓存
缓存系统
用来处理的消息的并发
消息队列
key-value内存数据库
异常报错
相关知识了解
set key value
设置key的过期时间
setex key timeout value
psetex key 毫秒value设置key的过期时间,以毫秒为单位
先get然后set
getset key value
mset key1value1 key2 value2...批量添加
mget key1 key2...
只有当key不存在时,才没能设置成功
setnx key value
获取字符串长度
strln key
批量添加不存在的key,跟事务比较接近,原子性
msetnx
让key对应的value增加1,要求value为数字类型
incr key
指定增长步长100
incrby key100
减1
decr key
n减少100
decrby key100
在value后追加字符串str
append key str
增加key对应的值
incrbyfloat key 3.5
获取字符串指定下标所有的值
getrange start end
设定指定下标所有对应的值
setrange key index value
类型:唯一标识;属性
例子:user1:count
提示信息:key定义,
给id为1的用户的count属性自增
incr user:1:count
需求:记录网站每个用户的个人主页访问量
需求:缓存视频基本信息(数据源在mysql)
incr
需求:分布式id生成器
案例
String(字符串)
特点:有序、可重复
从列表右端插入值(1-N)
rpush key value1 value2 ... valueN
从列表左端插入值(1-N)
lpush key value1 value2 ... valueN
在list指定的值前|后插 入newValue
linsert key before|after value newValue
从列表左侧弹出一个item
lpop key
从列表右侧弹出一个item
rpop key
根据count值,从列表中删除所有value相 等的项
lrem key count vlaue
按照索引范围修剪列表
ltrim key start end
获取列表指定索引范围所有item
lrange key start end(包含end)
获取列表指定索引的item
lindex key index
获取列表长度
llen key
设置列表指定索引值为newValue
lset key index newValue
lpush+lpop=statck
栈
lpush+rpop=queue
队列
lpush+ltrim
有固定数量的列表
lpush+brpop
tips:
list(链表)
特点:无序、不可重复
向集合key添加element(如果element已将存在,添加失败)
sadd key element
将集合key中的element移除
srem key element
计算集合大小
scard user:1:follow =4
判断it是否在集合中
sismember user:1:follow it = 1(存在)
从集合中随机挑count个元素
srandmember user:1:follow count = his
从集合中随机弹出一个元素
spop user:1:follow = sports
谁在前面就显示谁的没有的元素
sdiff user:1:follow user:2:follow = music his
差集
两个集合的共同部分
sinter user:1:fellow user:2:follow = it sports
交集
显示两个集合所有的元素,重复的只算一个
sunion user:1:follow user:2:follow = it music his sports news ent
并集
sdiff|sinter|sunion+store destkey
将差集、交集、并结果保存在destkey中
集合间的操作
set(无序集合)
特点:有序
set集合VSsortedset有序集合
zadd key score element(可以是多对)添加元素
zrem key element(可以是多对)删除元素
重要api
sorted set(有序集合)
我理解的就是key key value的形式,key不能相同,value可以相同
特点:key field value
获取hash key对应的field的value
hget key field
设置hash key对应的field的value
hset key field value
删除hash key对应的value
hdel
判断hash key是否有field
hexists key field
获取hash key field 的数量
hlen key
批量获取hash key的一批field对应的值
hmget key field1 field2...fieldN
批量设置hash key的一批field value
hmset key field1 value1 field2 value2....fieldN valueN
返回hash key 对应的所有的field的value
hgetall key
返回hash key对应所有field的value
hvals key
返回hash key对应所有field
hkeys key
如果field已存在则设置失败
hsetnx key field value
hash key对应的field的value自增intCounter
hincrby key field intCounter
hincrby浮点数版
hincrbyfloat key field floatCounter
提示:hincrby user:1:info pageview count
需求:记录网站每个用户个人主页访问量
hash(hash表)
src/redis-server & 不占用命令行
tar xzf redis-5.0.0.tar.gzcd redis-2.8.0makesrc/redis-server 占用命令行
解压缩
src/redis-cli 链接redis服务器
连接服务器
redis安装
配置文件
redis.conf
port端口
requirepass密码
masterauth主从同步中在slave配置master的密码
配置
reids-server 默认启动
redis-server${redis.conf}
redis-server --port${port} --端口启动
服务端启动
redis-cli
redis-cli -p ${port}
redis-cli -h ${ip}
redis-cli -a ${password}
redis-cli -p ${port} -h ${ip} -a ${password}
requirepass geelyredis
打开redis.conf添加密码:
客户端的启动
redis-cli shutdown
redis-cli -p ${port}shutdown
redis-cli -h ${ip} shutdown
redis-cli -p ${port} -h ${ip}shutdown
redis单实例服务端及客户端关闭
ping
执行redis set相关命令
查看redis get命令获取到的值
redis单实例环境验证
redis单实例
info
退出client链接
quit
人工触发的对redis数据的持久化
save
计算key的总数
dbsize
select
清除当前库的key
flushdb
清除所有的key
flushall
基础命令
set
del key删除指定的key-value
del
exists key 判断key是否存在
exists
-1永远存在
-2已经过期,销毁
查看剩余时间
ttl
查看类型
type
randomkey
rename
redis中有很多以nx结尾的命令,这些命令会有逻辑判断,当key不存在,命令才会生效
redis键命令
redis命令
最大连接数
最小连接数
最大空闲数
检查连接是否有效
连接池配置类
JedisPoolConfig
Jedis
getResource
JedisPool
redis连接池
get
setex
exire
封装redis常用Api
简化配置
约定优先于配置
打成jar包
java-jarxx.jar
简化部署
简化开发
简化监控
1、新建项目new project。左侧选择Spring Initializr
2、第一栏项目路径;第二栏项目名称(尽量小写,否则会报错(文件命名错误))最后一栏保留到项目名
3、选择web,其他的用到可以选
确认后会加载配置文件
4、确认
springboot项目的创建
@RestController返回值类型为String或者是json形式
@Controller+@ResponesBody=@RestController
@RequestMapping(value=“/自定义名”)。自定义名为8080后面跟着的路径名
单个访问
@RequestMapping(value={“/自定义名1”,“/自定义名2”})
多路径访问
@RequestMapping(value=“/”,method=RequestMethod.(get/post/put/delete))
method方法
可以放在类上,也可以放在方法上
@RequestMapping
只能用get方法请求
@GetMapping
只能用post方法请求
@PostMapping
public String getMoney(@RequestParam(value=\"\
当注解的名称和所传的形参名相同时可以省略注解
所传参数的参数名称
value
required
默认值,value不设值时,默认传送的参数
defaultValue
用在方法里(传参)
@RequestParam()
以资源为导向,一个对象对应一个url
有利于搜索引擎的抓取,使搜索排名靠前
利于seo的优化
优点:
介绍
利用{personId}实现动态的网址访问路径利用@PathVariable(value=\"\")结合上面的语句实现动态的网址访问
如果注解里的参数和方法里的形参一样那么可以省略注解后面的
用法
@PathVariable(value=\"\")
注解写在哪个类上哪个类就可以启动
1、@SpringBootApplication注解
回车
2、在(Tomcat Terminal按钮)根目录下:mvn spring-boot:run
生成target目录下的xx.jar文件
执行:Java -jar target/文件名.jar
3、在(Tomcat Terminal)根目录下:mvn clean package -DskipTests
注意:方式3时,如果遇到jdk文件不匹配时:
启动方式
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
pom.xml文件中加入依赖
<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">
html文件中
thymeleaf
application.properties形式的配置文件
@Value(\"${自定义变量名}\")
配置自定义变量
${变量名}
在配置文件中引用其他变量
@ConfigurationProperties(prefix = \"mysql\")@Component
通过配置类访问自定义变量
application.yml形式的配置文件
两种配置文件的形式不太一样,yml形式有层级的概念,上一级和下级之间需要缩进,相同层级并列,冒号后面需要有空格
选中哪个用哪个
多环境配置
配置属性文件
Spring-boot
vue
进程隔离
解决环境不一致导致程序无法运行的问题
解决多机器部署繁琐的问题
充分利用服务器资源
docker的优点
环境:centos7.x
sudo yum -y update
首先更新yum
sudo yum install -y docker
然后执行安装命令
Docker默认安装位置:/var/lib/docker
docker 安装
sudo systemctl start docker
启动docker
sudo systemctl restart docker
重启docker
sudo systemctl stop docker
关闭docker
docker虚拟机命令
https://www.daocloud.io/mirror
官网网址
shell下执行命令: curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
配置DaoCloud
DaoCloud镜像加速器
选取base image
表示不依赖任何image,从头制作
FROM scratch
FROM
LABEL maintainer=\"gy@qq.com\" LABEL version=\"1.0\" LABEL description=\"this is description\"
镜像作者信息
LABEL
执行命令并创建新的镜像层
RUN
设定当前工作目录,类似于cd
WORKDIR /root 如果没有会自动创建root
WORKDIR demo RUN pwd 输出结果/root/demo
WORKDIR
将本地文件添加到docker image中
ADD and COPY
Dockerfile
https://hub.docker.com/
从dockerhub上面搜索镜像并在线安装
docker search 镜像名(java)
docker pull 镜像名 :版本号
安装
docker images
查看
docker tag oldname newname
修改docker镜像名称
docker save java> /home/java.tar.gz
镜像导出
docker load </home/java.tar.gz
镜像导入
备份镜像
docker rmi 镜像名称或镜像Id
删除镜像
docker history 镜像Id
查看镜像依赖
镜像
docker run -it --name 容器名称 镜像名称 bash
docker run -it -p 9000:8080 --name 容器名称 镜像名称 bash
docker run -it -v /usr/home:/soft --privileged --name 容器名称 镜像名称 bash
运行容器
容器
重要组件
docker
Network模式
Master-slave主被模式
架构模式
ActiveMQ
KAFKA
类群拓扑
RocketMQ
主流消息中间件介绍
集群架构
为什么选择rabbitmq,rabbitmq高性能原因
AMQP协议模型
什么是AMQP高级消息队列协议?
AMQP高级消息队列协议与模型
AMQP核心概念讲解
消息流转
RabbitMQ整体架构
RabbitMQ整体架构与消息流转
http://www.rabbitmq.com
官网地址
--hostname一定要有
5672默认端口
15672管理界面端口
默认:guest
用户名:zhou
-e RABBITMQ_DEFAULT_USER=zhou
密码:Dxz706204
-e RABBITMQ_DEFAULT_PASS=Dxz706204
docker run -d --hostname my-rabbitmq -e RABBITMQ_DEFAULT_USER=zhou -e RABBITMQ_DEFAULT_PASS=Dxz706204 -p 5672:5672 -p 15672:15672 rabbitmq:3.7.3-management
zhou/Dxz706204
验证:http://http://39.105.230.209:15672
docker exec -it 容器id /bin/bash
docker中执行rabbitmq命令
基于docker安装rabbitmq
RabbitMQ环境安装
rabbitmq核心概念
rabbitMQ
消息中间件
前台vue
springboot
后台api
电商项目
明确哪些功能需要做,哪些功能不需要做
概念:
评审需求
降低成本
好处
列表
详情
门户
商品上下架
后台
商品模块
添加类别
修改类别
查看子类别
递归查询
查看后代
查看类别
类别模块
添加商品到购物车
修改购物车中的商品数量
单选/取消单选
多选/取消多选
查看购物车中的商品数量
购物车
注册
登录
忘记密码
修改个人信息
登录状态下修改密码
查看个人信息
查看详细信息
退出
用户模块
创建订单
查看订单
个人中心
前台
订单发货
订单模块
添加地址
地址模块
扫码支付
支付宝当面付款
支付
查看支付状态
支付模块
核心“购买”
需求分析
主键
int(11)
user_id
来源商品表的id
product_id
数量
quantity
tinyint
是否选中1选中0:未勾选
checked
create_time
update_time
购物车表
用户表
商品表
加索引
订单号
bigint(20)
order_no
收货地址
int(11)
shopping_id
订单实际付款金额 单位:元,保留两位小数
payment
运费
postage
0已取消;10-未付款;20已付款;30-已发货;40-已完成;50-已关闭
订单状态
status
订单支付时间
datetime
payment_time
订单发货时间
send_time
订单完成时间
end_time
订单关闭时间
close_time
订单表
order_no和user_id添加组合索引
订单编号
bigint(20)
冗余字段
product_name
product_image
购买商品时的付款价格
current_unit_price
商品数量
商品价格
total_price
订单明细表
收货地址表
支付平台:1支付宝;2微信
pay_payform
支付宝流水号
varchar(200)
platform_number
platform_status
支付信息表
订单
数据库设计
技术选型
搭建框架
开发
测试
部署
流程
父项目
当前文件继承自
<parent>
如果有其他项目想要依赖这个项目,就引入maven坐标
这三项是maven坐标
<groupId><artifactId><version>
项目名称,项目描述
<name><discription>
可以定义常量
属性标签
<properties>
依赖
<dependencies>
pom.xml文件
springboot目录结构
电商项目开发流程
Java
0 条评论
回复 删除
下一页