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