一、方法
方法头(声明):[访问修饰符] 返回值类型 方法名 [参数列表] [异常列表]
方法体(实现):两个作用1:围绕类中的属性进行各种操作 2:与其他类的对象进行数据的交流,消息的传递
return + 表达式
void修饰的方法可以使用关键字 return,但是不能加表达式 仅表示该方法结束
按值传递:方法调用时 传递的参数是按照值的拷贝进行传递的 传递前后互不相关,没有影响
8种基本数据类型+String值
按引用传递:方法调用时 传递的参数是按照引用地址(在堆内存中开辟的空间地址)进行传递,
传递前后操作的是同一个引用地址,指向了同一个空间
数组 类(集合 对象) 接口
二、面向对象
面向对象:程序=对象+消息传递
面向过程:程序=算法+数据结构
面向对象的三个基本特征:封装,继承,多态
类和对象(类是事物的描述 对象是事物的具体)
类:是具有相同的操作功能(方法)和相同的数据格式(属性)的对象的集合与抽象
对象:是构成现实世界的一个独立的单位 具有自己的静态特征(属性)和动态特征(方法)
类是构建对象的模板 对象是类的具体实例
[访问修饰符] class 类名称
成员变量的名称必须是唯一的
成员方法
new 类名():匿名对象只能使用一次 也可以作为实参进行传递
封装:将属性进行私有化:private
提供公开的接口-->只能访问,不需要知道具体的实现 getters+setters
通过setters方法进行传递数据时 方法的局部变量与类中的成员变量名称一致了 如何进行区分?
使用关键字this进行区分,this表示当前对象的引用
构造方法:语法结构:[访问修饰符] 类名([参数列表]){功能代码}
构造方法的作用:创建当前类的对象并为属性进行初始化操作
构造方法不能直接调用,在创建对象时通过关键字new引起构造方法的调用,返回对象的引用地址
构造方法的名称必须与类名一致 没有返回值,同时也没有void
构造方法不能被重写
构造方法可以被重载
构造方法不能被static/final进行修饰
构造方法不能被继承,但是如果子类使用父类的构造方法可以通过super([参数列表])语句进行调用
super()语句和this()语句都必须是构造方法中的第一条语句,因此不能同时出现在同一个构造方法中
Java类都有构造方法,如果没有显示的自定义构造方法,系统默认创建一个缺省的无参的构造方法
同一个类中 如果构造方法A想调用构造方法B,如何实现?
可以通过this([参数列表])语句进行调用
类变量(静态变量)和实例变量
类变量:使用关键字static修饰的变量,作用于整个类的所有实例 访问语法:类名.变量名
实例变量:没有使用关键字static修饰的变量 只能作用于某个具体的实例对象 访问语法:对象名.变量名
类方法(静态方法)和实例方法
类方法:使用关键字static修饰的方法,作用于整个类的所有实例 访问语法:类名.方法名
实例方法:没有使用关键字static修饰的方法 只能作用于某个具体的实例对象 访问语法:对象名.方法名
类方法中只能使用类变量和调用类方法
实例方法啥都行,一切皆可
单例模式----只创建当前类的一个对象
使用关键字package进行打包 包可以理解为磁盘上的目录
打包语句必须是文件中的第一条语句 在package之前,可以有空白行和注释语句
如果不加package语句 则默认为是缺省包(default package)
包的访问权限:小-->大:private私有的 < default缺省的 < protected受保护的 < public公有的
private仅限当前类
default最大到当前包
protected最大可以到不同包的子类
public任何情况都可以访问
导包的语句:import 包名.类名; import 包名.*;
继承:通过已有的类创建新的类的机制
通过继承创建的新类拥有已有类的所有公共的属性和方法,同时新类可以随意的扩展(增加自己的属性和方法)
java只支持单继承 子类只能有一个直接的父类
父类是所有子类公共属性和方法的集合 子类是父类的特殊化 一种特殊的表现形式
父类和子类是一般与特殊的关系 is a 子类是父类的一种
继承具有传递性(多层继承,间接的父类)
语法格式:class 子类 extends 父类{}
继承的规则
父类的访问修饰符 使用情况 子类是否可以继承
public 任何情况 可以继承
protected 任何情况 可以继承
default 同包 可以继承
不同包 不可以继承
private 任何情况 不可以继承
如果父类中只提供了有参的构造方法,子类如何调用父类的构造?
如果父类中只有有参构造方法,那么子类构造方法中必须通过super(参数列表)语句进行显示调用,该语句不能省略
如果父类中含有无参构造方法,那么子类构造方法中的super()语句可以省略,表示默认调用父类的无参构造
继承时属性的隐藏:
class A{
String name = "父类";
}
class B extends A{
String name = "子类";
}
此时类B中含有两个同名属性 1:父类中继承的name 2:自己重新定义的name
但是自定义的name属性将继承的name属性进行覆盖了(隐藏了),如果想访问父类的name属性,需要通过关键字super进行调用
语法结构:super.name
其中super表示父类对象的引用 this表示当前对象的引用
多态的两种表现形式:重载与重写
什么是重载?
在同一个类中,使用相同的方法名定义多个不同方法的机制
特征:方法名必须相同 必须在同一个类中 参数列表必须不同(1.数量 2.类型 3.顺序)
返回值类型和访问修饰符是否相同无所谓
什么是重写?
子类对父类同名方法的覆盖(重新定义)
特征:方法的返回值类型、方法名、参数列表与被覆盖的方法相同
访问修饰符,与被覆盖的方法相同,或者更宽松,不能更严格
private default protected public
抽象方法必须被重写,如果子类不重写父类的抽象方法,那么子类必须是抽象类
final和static修饰的方法不能被重写的
final可以修饰变量(属性)、方法、类
变量:称之为常量,值不能被修改,并且在定义时必须进行初始化
方法:称之为终结方法,不能被重写
类:称之为终结类,不能产生子类 String类 Math类
抽象类:目的:设计和实现相分离 abstract
抽象类中必须要含有抽象方法(×)
抽象类中可以含有抽象方法和常规类中的所有元素,也可以没有抽象方法
抽象类不能被new,不能进行实例化对象,需要通过创建子类对象进行完成具体实现动作
抽象方法:需要使用关键字abstract定义
只有方法的声明(方法头),没有方法的具体实现(方法体)
需要通过子类对该方法进行重写完成具体的实现操作
子类和父类之间的转换问题 想一下花木兰替父从军 父亲代替花木兰出嫁
子类转成父类类型(允许) 对象的上转型
父类转成子类类型(错误) 对象的下转型 在编译时通过强制转换可以避免错误 但是运行时报异常
子类转成父类类型时属性和方法的使用情况 想一下花木兰替父从军
属性:使用的是父类的
方法:使用的是子类的
instanceof: 判断对象是否属于某个特定类 返回boolean类型的结果
里氏代换原则:父类出现的地方 子类一定可以出现
子类出现的地方,父类不一定出现
组合关系:类中除了包含基本数据类型的属性外,还可以含有其他类类型的属性(对象属性) has a 有一个
合成聚合复用原则:组合与继承都可以实现代码复用的前提下,优先考虑使用组合关系
实现(implements)关系(接口): interface like a 像一个 目的:设计和实现相分离 接口的抽象层次比抽象类更高(因为接口中的方法都是抽象方法)
特征:接口不能new 不能实例化 因为接口不是类 需要实例化它的实现类对象
一个类可以实现多个接口(变相的解决了多继承问题) 接口与接口之间使用逗号分隔
一个接口可以被多个类实现
接口中所有的成员数据都是公有的静态的常量
接口中的方法都是公有的抽象方法(1.7(含)版本之前) 1.8版本之后提供了静态方法和缺省方法,支持方法体的
接口的隔离原则:使用专门的接口比使用统一的接口更合理 避免接口的污染
静态工厂方法模式(根据参数动态创建实例对象)、开闭原则(扩展是开放的,修改是关闭的)、工厂方法设计模式、代理模式(在不改变目标对象的前提下,添加额外的功能)、缺省适配模式(平庸类---1.将接口中的抽象方法转为普通方法,没有具体实现2.可以让子类选择性的重写某个方法,而不是全部3.该类不需要进行实例化,因此定义为抽象类)、适配器模式
不能实例化的几种情况:1.接口 2.抽象类 3.私有的构造方法(单例模式)
三、异常处理
Object-->Throwable-->1.Exception(异常,可以解决的)2.Error(错误,不能解决的)
Exception异常分为两种:检查型异常--在编译时 系统编译器进行实时检查,如果有异常则必须处理,否则编译通过
运行时异常--在编译时,系统编译器不进行实时检查,只有在运行时才会提示是否有异常的出现
处理异常的方式:捕获异常(try-catch-finally) 抛出异常(throws[异常的列表] throw[方法实现,Throwable类或子类对象])
如果一个try语句同时匹配多个catch语句时,要求catch的顺序是:先子类后父类
无论代码是否正确,finally语句都要执行,进行资源的释放。
如果try和catch语句中存在return语句,那么先执行finally再执行return 但是如果try和catch语句中使用了System.exit(0)方法时,finally语句就不再执行了
异常消息的提示处理: 1.getMessage();显示异常的错误信息(对用户不是很友好)
2.toString();显示异常的错误信息以及对应的异常类型(对程序员不友好,不知道异常的具体位置)
3.printStackTrace();可以打印异常在堆栈中的轨迹,追溯根源
四、常用类
1.Object:是所有系统提供的类或自定义的类的直接或间接的父类
equals():判断对象的地址否时相同(对象是否是同一个) 等同于==
对象同一值一定相等 值相等对象不一定同一
如果自定义类想取缔Object类中的equals()方法,则需要进行重写,重新定义比较的规则(保留父类的比较,新增额外的)
clone():克隆 创建并返回当前对象的一个副本(复制了一个新的,该新对象的属性与源对象一致,但是地址不同)
toString():返回对象的字符串形式 本身是返回对象的空间地址值 但是可以重新定义(重写),返回自己想要的具体内容
2.String:s.length() s.equals() s.equalsIgnoreCase() s.indexOf() s.lastIndexOf() s.toUpperCase() s.toLowerCase()
s.charAt() s.toCharArray() s.split() String.valueOf() s.startsWith() s.endsWith()
s.replace() s.subString(begin,end) s.subString(begin) s.trim()
String s = new String();
String s = new String("");
String s = new String(char[] a);
String s = new String(byte[] b);
3.StringBuffer和StringBuilder StringBuilder(不考虑线程的安全性)>StringBuffer(考虑线程的安全性)>String(不断的开辟空间地址/常量池中存储新的数据)
是一对兄弟类 API是兼容的
append():执行该方法追加完内容后,都会改变原数据
toString():将该对象转成字符串形式,然后就可以与String类型的值进行比较了
insert() length() setCharAt():将指定位置的数据替换为新的给定值
reverse() deleteCharAt() delete(start,end) replace(start,end,str)
4.包装类 parseInt("123") "123"+10==>12310 123+10==>133
parseXXX方法的返回值类型是基本数据类型
valueOf方法的返回值类型是类类型的的
从JDK1.5版本以后,基本数据类型和包装类类型之间可以进行自动的封箱拆箱处理(自由转换处理)
Integer in = new Integer(12);
Integer in = 12;
isSpaceChar(' ')--->true isSpaceChar('\t')--->false
5.Runtime:该类不能直接进行实例化,通过查看源码得出:这是一个饿汉式的单例模式类
通过自身提供的getRuntime()方法获取该类对象 通过得到的对象调用exec()方法可以执行外部的可执行命令,例如:QQ、微信、计算器
6.Date日期类Calendar日历类
Date date1 = new Date(); //返回CST格式的系统时间
Date date2 = new Date(System.currentTimeMills()-2000);
date1.after(date2) 判断是否在后
date1.before(date2) 判断是否在前
date1.getTime(); 以毫秒值形式返回当前系统的日期与时间
Calendar该类是抽象类 通过自身提供的getInstance()方法创建对象
在进行获取月份数据时,是从0开始的 0-11(可以理解为这是月份的索引值) 因此显示正常月份值时需要进行+1处理
该类中提供了一个可以判断给定年份是否是闰年的方法:isLeapYear(2000)---->true
7.DateFormat格式化和解析日期的处理类
可以对日期进行指定格式的格式化操作
该类依旧是一个抽象类,需要通过子类SimpleDateFormat完成对象的创建
DateFormat df = new SimpleDateFormat(); //对象的上转型的处理
Date date1 = new Date(); //返回CST格式的系统时间
df.format(date1); 通过format格式化方法对系统时间进行格式的转换,此时没有指定格式,按照系统默认格式进行操作
如果想指定格式,在创建对象时通过构造传参即可new SimpleDateFormat("yyyy年MM月dd日 HH*mm*ss");
SimpleDateFormat.getDateInstance().format(date1) 只处理日期
SimpleDateFormat.getTimeInstance().format(date1) 只处理时间
SimpleDateFormat.getDateTimeInstance().format(date1) 可以处理日期与时间
可以将某个字符串数据值解析为日期类型数据 解析时时间的描述必须是:进行连接 10:22:33 如果不是,会报解析异常错误
String x = "1999-12-32 13:22:56";
SimpleDateFormat.getDateTimeInstance().parse(x); 日期超出范围,自动向下顺延,显示2000-1-1
8.Random类可以实现伪随机数的获取
nextInt(范围值)获取随机整数
nextDouble()获取随机浮点数
nextBoolean()获取随机的true/false值
五、集合
Collection(父接口,特点是:不唯一,无顺序)----子接口:List(特点:有顺序[索引顺序],不唯一)/Set(特点:唯一,无顺序)
List---ArrayList/LinkedList
ArrayList:get(index) size() subList(begin,end)
如果集合泛型为Integer类型,进行移除数据时,remove(new Integer(数据值)),如果直接写数据 表示按照索引进行查找并移除操作
Set----HashSet/TreeSet/LinkedHashSet
Collections---集合工具类
sort()可以排序 reverse()顺序进行反转
因为List和Set来自同一个父接口,大多数的方法都是一样的,但是List比Set多一些与索引相关的操作
List集合在进行遍历数据时,可以使用for循环通过索引进行遍历 或者forEach直接遍历元素
Set集合只能使用迭代器,先将数据存储到迭代器中,然后通过while循环或forEach循环进行遍历
Map(父接口)--KEY-VALUE:以键值对的形式存储数据
特点:KEY是唯一的 无顺序-----等同于Set集合
VALUE是不唯一的 无顺序-----等同于Collection集合
如果KEY相同时,后存储的数据会覆盖之前的,相当于一次变更操作
实现类:HashMap/TreeMap/LinkedHashMap
六、IO流----输入流与输出流
如何区分:站在程序的角度看,程序接收数据就是输入,程序发送数据就是输出
基本上都是三个步骤:1.打开流(创建) 2.读数据(输入操作)/写数据(输出操作) 3.关掉流(释放资源)
如果从内容进行划分流:面向字符的输入输出流 面向字节的输入输出流
如果从分工进行划分流:节点流 处理流(在节点流基础之上进行的二次封装处理)
输入:Reader(面向字符) InputStream(面向字节)
输出:Writer(面向字符) OutputStream(面向字节)
上面的四个父类,都是抽象类,都需要实例化其子类完成文件的传输操作
如果进行输出操作时,不要忘记进行关闭流 因为不关闭会导致数据的丢失
File文件类----与平台无关的操作,Java中唯一一个操作文件或目录的类
File file = new File("f:/aaa.txt");
File file = new File("f:/","aaa.txt");
File dir = new File("f:/aa/bb"); File file = new File(dir,"aaa.txt");
前提:类要实现序列化接口 具有序列的能力
对象的序列化---将Java对象转成字节序列(存储到磁盘上) 输出处理流ObjectOutputStream 使用writeObject方法
反序列化--将字节序列恢复成Java对象(读取到程序中) 输入处理流ObjectInputStream 使用readObject方法,返回Object类型对象,因此需要进行强制转换
七、线程
获取线程的两种方式:1.继承Thread类 2.实现Runnable接口
如果当需要数据进行共享时 选择实现接口方式;如果当当前类已经继承了其他类,并需要获取线程对象,那么只能使用实现接口方式(Java只支持单继承)
八、数据库
必须知道的相关概念---数据库、表、行、列、记录、字段
DCL数据库控制语言---创建用户角色、为用户角色分配使用权限
DDL数据定义语言---定义数据库、定义数据表(定义表结构、修改表结构)
DML数据操纵语言---增加数据、删除数据、更新数据
DQL数据查询语句---查询数据(全部、部分)
TCL事务控制语言---原子性、一致性、隔离性、持久性
新增insert into
删除delete(删除表中数据的) drop(删除数据库、数据表、表字段)
更新update...set 如果同时修改多个字段的数据,使用逗号进行分隔
update 表名 set 字段1=值1,字段2=值2,字段3=值3......where 条件
查询语句select
where条件查询 对数据表进行检索
group by分组查询
order by排序查询
having在结果表(虚拟表)中进行二次筛选数据
limit控制查询条目
limit 2--表示只显示前2条记录 limit 0,5---表示从指定的索引位置开始检索指定个数的记录,通过该方式可以实现分页操作
in 后面描述的是一个集合 按照集合中的元素进行检索数据
and&& or|| not! 统称为逻辑运算符
like模糊查询
like '张%'---任意字符 like '张_'---单个字符
count(统计行数/记录数) max(最大值) min(最小值) sum(求和) avg(平均值) 这是常用的5个聚合函数、
distinct去重处理
union all---联合查询:将两个表中的查询结果在一起进行显示,如果使用all显示结果包括重复的记录
left join..on right join..on inner join..on---连接查询
JDBC执行的过程
1.加载数据库驱动类
2.建立数据库连接
3.获取语句对象,发送要执行的SQL语句
4.获取结果集对象
5.使用结果集对象
6.关闭结果集对象、语句对象、连接对象
结果集对象具有一个next方法 该方法有两个作用:1.判断结果集中是否有下一条记录 2.将指针向下移动一位
DAO层
通过Java类创建的对象进行存储数据------该对象是持久化对象 该类是持久类 执行该系列操作的层是持久层
Java类创建的对象与表中的数据形成一一对应关系
ORM--对象关系映射
表中字段的类型、数量与类中属性的类型、数量应该保持一致
九、HTML
http:超文本传输协议
html:超文本标记语言/超文本标签语言
URL:http://www.baidu.com:80/index.html 协议+主机名+端口号+访问的资源
十、CSS级联样式表/层叠样式表
内联样式表---直接写在html标签中,优先级最高
内部样式表---在文件内部声明style代码域
外部样式表---需要link标签进行引入
选择器:HTML标签选择器 类选择器 id选择器 关联选择器 属性选择器
文本属性的操作、背景属性、盒子模型
十一、JS
声明和引入
第一种:在head/body标签中使用script标签声明js的代码域
第二种:在head标签中使用script标签引入外部声明的js文件
第三种:直接在标签中使用js的代码
变量:关键字var 因此变量无类型
可以存在同名变量 新的值覆盖旧的值
var A = 12;
var a = 12;
var a = 22;
数据类型:number、string、boolean、object
查看某个变量存储的数据类型时,使用关键字:typeof
特殊的数据值:undefined、NaN、null
变量的运算:
特殊的运算
等值符==:先判断类型,如果类型一致,则比较内容,如果内容一致,返回true,否则返回false;
如果类型不一致,则使用Number()函数进行类型的强制转换,然后再比较内容,如果内容一致,返回true,否则返回false。
等同符===:先判断类型,如果类型不一致,则直接返回false;
如果类型一致,则比较内容,如果内容一致,返回true,否则返回false。
流程控制:
顺序结构、分支结构(判断语句/选择语句)、循环结构
使用方式参照Java即可,只需要注意:声明变量时使用关键字var
函数的声明:
声明一:function 函数名([形参1,形参2,....]){执行体}
声明二:var 变量名/对象名/函数名 = new Function("形参1","形参2",....,"执行体");
该对象/变量是js中的函数---->因此js中的函数也是对象,可以作为方法的参数进行传递
声明三:var 变量名/函数名 = function([形参1,形参2,....]){执行体}
函数的参数问题:在js中使用函数时,实参的传递个数可以与形参个数不匹配,按照形参的顺序进行赋值即可
函数的返回值问题:如果函数有返回值,则通过return+表达式返回数据即可;如果没有返回值,在接收时,默认返回undefined
函数的执行符:()
当函数对象作为方法参数进行传递时,如果使用了函数的执行符,那么该函数对象会当作函数进行执行;
如果没有函数执行符的使用,那么传递的函数对象仅会当作对象参数(变量)使用,可以被原样输出。
数组:
声明:
var 数组名 = new Array(); 声明一个空的数组,数组存在但是没有元素
var 数组名 = new Array(长度值); 声明一个指定长度的数组,数组存在,各个之间元素通过","进行分隔,元素是空
var 数组名 = new Array(元素1,元素2,....); 声明一个指定初始元素的数组
var 数组名 = [元素1,元素2,....]; 以简写的方式声明数组,该数组元素可以为空,可以指定
使用:在js中数据的长度可以不指定,可以改变,不是固定的,因此js中没有集合概念
js中的数组在进行赋值时,可以是不连续的操作,自动使用空白补齐
在取值时,也可以是不连续的操作,如果使用一个没有指定内容的索引进行提取时,返回默认值undefined
js中的数组可以存储任意类型的数据,可以是混合类型的数组
length属性:
可以对长度属性进行重新赋值操作
1.如果减小,从后面缩减
2.如果增加,从后面使用空白进行补齐
遍历数组
for循环,使用索引进行提取数据
for-in循环:注意:该循环每次获取的依旧是元素的索引,不是元素本身,因此依旧是使用索引提取数据
for(var i in arr){
alert(arr[i])
}
数组的常用方法:
concat()连接数组
pop()移除数组中最后一个元素,返回移除的元素
push(数据值)在数组的末端追加指定的元素,返回数组新的长度值
shift()移除数组中第一个元素,返回移除的元素
unshift(数据值)在数组的首端插入指定的元素,返回数组新的长度值
常用对象:
1.String
substr(benginIndex,length):从指定位置开始截取指定长度的子串
substring(benginIndex,endIndex):截取从指定位置开始到指定位置-1结束的子串,含头不含尾
split(规则):使用指定的规则拆分字符串,返回字符串类型数据 支持正则表达式的使用
2.Date
var 对象名 = new Date();获取当前的系统时间
对象名.getTime()获取时间戳
getFullYear获取当前年份
getYear获取从1900年至今的总年数
getMonth获取当前月份值 范围0~11之间 具体值需要+1处理
getDay获取当前的星期值 范围0~6 星期日是0
3.Math
不能new,不创建对象 直接使用Math.方法名的方式即可
random获取随机数 0~1 无线接近于1的小数
ceil 天花板值 向上取整 13.0001 < ? 14
floor 地板值 向下取整 13.99999 > ? 13
4.Global
不能new,不创建对象 同时也不使用Global.方法名的方式进行调用
直接使用方法即可
eval:将js字符串转成可以执行的js代码
isNaN:判断是否是NaN情况 is not a number为真 a number为假
parseInt:截取字符串开头的整数部分,如果截取失败,返回NaN
parseFloat:截取字符串开头的小数部分,如果截取失败,返回NaN
事件:
onclick、ondblclick、onmouseover、onmouseout、onmousemove
onkeydown、onkeyup
onload
onfocus、onblur---用来用户数据的校验
onchange----作用在下拉框控件中更为合理
合适的标签添加合适的事件
事件之间的互相干扰问题:在添加事件时需要避免
自定义类和对象
使用关键字function进行定义,类中声明的属性或函数使用this关键字
function 类名([形参1,形参2,.....]){
this.形参1 = 形参1;
this.形参2 = 形参2;
....
this.属性名 = 值;
this.函数名 = function([形参1,形参2,.....]){
执行体......
}
}
类在进行传参时,实参和形参的个数可以不匹配 ,也可以不传递参数
通过js类创建的对象,在外部可以对属性/函数进行随意的扩充(拥有类以外的属性和函数)
可以通过使用prototype属性变相的实现两个类的继承关系
类A.prototype = new 类B()
看似时类A继承了类B,但是实际上是通过类B的对象在调用类B中的属性和函数
var 对象名 = new Object();
var 对象名 = {};
对象名.属性1 = 值1;
对象名.属性2 = 值2;
......
对象名.函数名 = function(){
.....
}
var 对象名 = {
属性1:值1,
属性2:值2,
.....
this.函数名= function(){
....
}
}
事件的阻断问题:
超链接调用函数:href="javascript:函数名();"
超链接调用函数:href="跳转的URL路径" οnclick="函数名()"
当函数执行完毕时,会向指定的资源进行跳转
但是如果函数中出现了异常(错误),则不再向指定的资源进行跳转------>事件的阻断
定义的函数要有返回值,如果返回false,表示函数中出现问题,跳转操作需要阻断处理
如果返回true 表示原有功能可以继续执行,不进行阻断
href="跳转的URL路径" οnclick="return 函数名()"
event:
通过该对象可以解决浏览器的差异问题
event对象是随之事件调用函数时当作参数进行传递的
但是IE8.0及其以下版本是作为window对象的属性进行使用的
获取对象的方式:
var eve = eve || window.event
获取鼠标的坐标值(x轴/y轴)
var x = eve.pageX || eve.x
var x = eve.pageY || eve.y
获取键盘的码表值
var code = eve.keyCode;
window对象:
框体方法
alert
confirm("确认语句") 返回true/false
prompt("提示语句","示例语句") 返回填写的内容 如果没有填写,返回空
定时执行setTimeout(函数,时间):到达指定时间后执行指定的函数 只执行一次
间隔执行setInterval(函数,时间):到达每间隔指定的时间后执行指定的函数 执行多次
这两种执行操作每次都会开启一个单独的线程 并且返回该线程的id值
通过该id可以对线程进行关闭处理
关闭定时执行:clearTimeout(id)
关闭间隔执行:clearInterval(id)
open("资源路径","名称","子页面的配置")可以打开一个子页面
close()关闭子页面
使用opener属性:子页面调用父页面的函数
有时需要该方式让子父页面的资源进行统一处理------>例如:修改操作时打开了子页面,修改完毕后需要子父页面的资源统一
location地址栏属性
href:获取URL信息
重新赋予新的URL地址-----跳转
reload():重新加载 相当于实现页面的刷新处理
document对象:
获取HTML元素对象的方式:
1.直接方式
通过id属性获取、通过name属性获取的、通过标签名称获取的、通过class属性获取的
2.间接方式
通过父子方式、通过子父方式、通过兄弟方式
操作元素的属性
查看---固有属性(对象名.属性名)、自定义属性(对象名.getAttribute("属性名"))
修改---固有属性(对象名.属性名=新的值)、自定义属性(对象名.setAttribute("属性名","新的值"))
在进行处理固有属性时,可以使用getAttribute方法和setAttribute方法
但是通过该方式操作value属性时,获取的值是默认的,不是实时数据,因此并不推荐使用该处理方式
操作元素的内容
innerHTML
查看:获取的内容包括HTML标签
修改:支持HTML标签的解析
innerText
查看:获取的内容不包括HTML标签,只是纯粹的文本内容
修改:不支持HTML标签的解析,标签属于内容的一部分,原样显示
操作元素的样式
使用style属性直接操作元素的样式
对象名.style.样式名称="样式值"
使用className类选择器操作元素的样式
对象名.className = "类选择器的名称"
操作元素的文档结构
创建自定义元素对象的步骤
1.先获取要操作的元素对象----例如是div对象:通过id方式获取
2.根据需求明确要添加的元素对象---以便进行创建
3.创建需要添加的对象---var 对象名 = document.createElement("标签名称");
4.有时可能需要设置标签的其他属性值
5.添加到指定的父节点对象中----父节点对象名.appendChild(子节点对象名)
6.移除自定义的元素对象----父节点对象名.removeChild(子节点对象名)
表格实现删除行的要求
1.获取表格对象
2.获取要删除的行对象
3.获取行对象对应的行编号
4.表格对象.deleteRow(行编号)
操作form表单对象
1.获取表单对象
使用id属性获取、直接使用name属性进行获取: document.name属性值
注意:获取的表单对象本身就是一个数组,具有长度属性----表示含有的表单项的个数
(表单项中包括的是用户可以操作的---能点能写的 其中div、table不属于表单项)
2.elements属性获取form表单对象的元素集合
3.submit()函数---提交处理 reset()函数---重置处理
十二、正则表达式
/\d+/g new RegExp("表达式"[,"标志"])
正则对象的常用方法
exec:用于检索字符串中与某个规则匹配的部分 返回结果数组 如果不匹配,返回null
如果与全局搜索g标识同时使用,表示可以多次检索 下次匹配是从上一次的结果后开始的
如果与捕获括号()同时使用,返回的结果中,第一部分是整体匹配的结果,后面部分依次是每个括号匹配的结果
test:用于判断字符串是否符合某个规则 返回boolean类型的结果 校验用户填写数据的格式
字符串常用方法
match:用于检索字符串中与某个规则匹配的部分 如果不匹配,返回null
如果与全局搜索g标识同时使用,一次性返回全部的匹配结果
search:检索字符串中指定的子字符串或者检索与正则表达式匹配的子字符串
返回子字符串第一次出现的位置 如果没有匹配值,返回-1
功能与indexOf方法类似 但是功能性更强,因为支持正则表达式的使用
replace:将字符串中指定的字符串替换为另一个新的字符串或者替换成一个与正则表达式匹配的子串
split:将一个字符串根据指定的规则拆分成字符串数组----规则可以是:指定的字符串 或者是与某个正则匹配的子串
注意:拆分返回的数组可以自己指定大小 如果没有明确指定,返回全部的数据
量词
+:前一个字符出现1次或多次
*:前一个字符出现0次或多次
{}:
{2}:前一个字符正好出现2次
{2,4}:前一个字符最少出现2次,最多出现4次
{1,}:前一个字符最少出现1次,最多不限------相当于是+
{0,}:前一个字符最少出现0次,最多不限------相当于是*
{0,1}:前一个字符最少出现0次,最多出现1次------相当于是?
?:前一个字符出现0次或1次
如果将?紧跟在其他量词的后面,会将该量词变为非贪婪的,默认量词是贪婪的
特殊的字符:
\b单词边界 \B非单词边界
\d数字 \D非数字
\w单字字符(数字、字母、下划线)\W非单字字符
\s空白字符(空格、制表符、换页符、换行符) \S非空白字符
^---匹配输入的开始,整体/整行进行匹配
$---匹配输入的结束,整体/整行进行匹配
.---匹配任意的单个字符 (除了换行和行结束符)
()---分组/捕获括号,可以记住分组中的内容的,该内容可以在当前正则表达式中再次进行使用 \1,\2,\3.....\9
如果进行replace替换操作时,分组信息使用$1,$2.....$9形式进行表示
(?:)---非捕获括号 因为分组名额只有9个,为了不占用名额,可以使用非捕获括号,不记住括号中的内容
x(?!y)-----匹配x并且后面必须不是y y仅作为条件进行检索不作为结果进行显示
x(?=y)-----匹配x并且后面必须是y y仅作为条件进行检索不作为结果进行显示
x(y|z)-----匹配x并且后面是y或者是z y或z作为条件进行检索同时作为结果进行显示 并且返回分组(捕获括号)中的结果
[xyz]:或者是x 或者y 或者z
[23]:或者是2 或者是3
[12-59]:或者是1 或者是2-5之间 或者是9
[a-zA-z0-9]:或者是a-z之间的值 或者是A-Z之间的值 或者是0-9之间的值
[\u4e00-\u9fa5]
十三、Servlet+JSP
服务器端控制的跳转方式
1.请求转发
2.重定向
不同点:
a.语句不同
b.请求中的数据是否共享
转发可以----跳转前后请求对象是同一个
重定向不可以----跳转前后的请求对象不是一个
c.url地址不同
转发--是跳转之前的地址(服务器端默默发起的跳转,客户端不知道)
重定向---是跳转之后的地址(服务器端返回的结果中含有新的请求地址,客户端主动发起的第二次请求)
d.原理不同
e.效率不同
转发--高
重定向--低
f.跳转范围不同
转发--只能在当前项目中进行跳转,最大范围也就是当前的服务器
重定向--互联网上的所有服务器的所有项目
g.路径不同
绝对路径
转发--不支持
重定向--支持的
根路径(推荐使用的)
转发--/ 代表当前项目
重定向--/ 代表当前服务器
相对路径
只能相对自己
没有相对base标签 base标签是html标签 a img css js
转发和重定向的选择
1.希望跳转前后两个web组件可以共享request中的数据,必须使用请求转发方式
2.跳转到同一个应用的WEB-INF目录下只能使用请求转发方式
3.跳转到不用的应用中只能使用重定向的方式
4.使用Cookie存储数据时需要使用重定向的方式
跳转到同一个应用,哪种方式更好?
1.如果希望转发的效率高,尽量使用请求转发的方式
2.如果进行了添加操作,并且使用的是请求转发的方式,那么需要解决避免重复提交的问题
3.如果进行注销操作时,一般推荐使用重定向方式
4.如果进行连续表单页面之间的跳转,建议使用重定向方式,可以避免属性的冲突问题
Servlet的生命周期
1.类的加载
a.发出请求 url
b.获取映射路径
c.在web.xml文件中检索映射路径对应的servlet-name
d.按照servlet-name值获取对应的类信息(类的全名称)
e.通过该类信息获取类对象
Class clazz = Class.forName("类的全名称")
2.创建对象(实例化)
Object obj = clazz.newInstance();
3.初始化 init()
4.服务请求---service()---doGet/doPost
5.销毁--destroy()
通过session和cookie解决HTTP协议的无状态问题
1.采用session将信息保存在服务器端
2.采用cookie将信息保存在客户端
session的三种注销方式
1.到达默认的非活跃间隔时间 30分钟
2.关闭浏览器(此时没有真正的注销,服务器端的session还是存在的,需要到达默认的非活跃间隔时间后才会真正的消失)
3.主动调用注销的方法----session.invalidate()
Servlet与JSP的联系和区别
JSP和Servlet都是sun公司推出的可以实现动态网页的技术
因为Servlet开发页面时太繁琐,因此使用JSP简化页面的开发
JSP本质上就是一个Servlet,在运行时JSP会翻译成一个Servlet
JSP可以将显示代码与逻辑代码进行分开,意味着两者的开发可以并行进行
Servlet是在Java代码上编写HTML代码,本身是一个Java类
JSP框架是HTML页面,是在HTML代码中编写Java代码
JSP主要是进行显示的----视图层 Servlet主要是进行调度的----控制层
MVC架构模式-----视图层+控制层+业务层+数据访问层
JSP的9个内置对象和四大作用域
request-------request
response------page
out-----------page
session-------session
application---application
config--------page
pageContext---page
page----------page
exception-----page
作用域:
page:当前页面
动态包含得不到
静态包含可以得到
request:当前请求
动态包含可以+静态包含可以+请求转发+<jsp:forward>
session:当前会话
结束的方式
application:当前应用程序对象
结束的条件----重启服务器
动态包含和静态包含的区别
1.静态包含是将被包含文件的代码全部合并到主文件中,动态包含是通过方法的调用实现的
2.静态包含中被包含文件不额外产生.java和.class文件,动态包含会产生.java和.class两个文件
3.静态包含情况下两个文件不可以存在同名的变量,动态包含可以有同名变量的
4.静态包含的包含时机是在转译阶段(第一阶段),动态包含的包含时机是发生在解释执行阶段(第三阶段)
过滤器--Filter 和 监听器--Listener
过滤器是请求访问目标资源之前的预处理操作和访问目标资源之后响应离开服务器之前的后处理操作
如果定义了多个过滤器,可以组成过滤链,请求和响应会依次经过各个过滤器
过滤器和Servlet/JSP一样,是运行在服务器端的程序
多个过滤器执行的顺序是如何确定的-------与filer-mapping的配置顺序有关
每个请求和响应都会经过过滤器吗-----与设置的过滤路径有关
请求和响应是分别将过滤器中的代码从头至尾都执行一遍吗-----不是
在过滤器中是否可以跳转到当前项目的其他任意资源下-----可以的,例如权限验证问题
重定向和请求转发是否要经过过滤器-------重定向会经过 请求转发默认不经过的(但是可以通过配置设置转发/包含经过过滤器)
监听事件源分别是SerlvetContext、HttpSession、ServletRequest三个域对象
监听事件主要是JSP内置对象:application、session、request对象上发生的事件
应用程序环境对象(2)、用户会话对象(4)、请求消息对象(2)
创建和销毁的监听器(3)、属性增加和删除的监听器(3)-------- 这两种类型的监听器必须在web.xml文件中注册才可以使用,或者通过注解@WebListener的方式进行处理
对象的状态的事件监听器(2)------监测自己何时被绑定和解绑 / 监测自己何时活化(反序列化)或钝化(序列化)
该类监听器不需要在web.xml文件中进行注册 但是需要相关的类实现监听器对应的接口
十四、文件的上传和下载
通过apache提供的commons-fileupload组件可以实现文件上传和下载的操作,降低开发的难度
该组件需要commons-io组件的支持
上传:
前端的准备:
form表单的提交方式必须是post
必须设置enctype属性值是multipart/form-data-----二进制流的方式
提供文件表单项 <input type="file">
后端的处理:
1.FileItemFactory工厂接口对象
2.通过该工厂对象获取可以实现上传操作的对象----ServletFileUpload
3.通过上传对象进行解析请求对象,并对请求中包含的数据进行封装----List<FileItem>(每一个表单项是一个FileItem类?型的对象)
在进行解析数据时 可以同时指定文件的大小(单个文件的、总文件的)
4.从封装的集合数据中获取表单对象数据并进行相关的操作
如果操作文件数据---需要指定上传的路径,推荐使用在当前项目路径下创建一个逻辑路径存储 在存储时需要注意文件名称的唯一性,使用UUID的方式实现的 需要指定上传文件的类型
下载:
创建输入流和输出流
通过copy方法借助输入流和输出流,实现文件从服务器端拷贝到客户端
关闭流对象
有时需要通过附件的方式实现文件的下载,上述方式没有该功能,需要额外添加
需要设置浏览器的响应头信息
response.setHeader("Content-Disposition","attachment;filename="+文件的名称)
如果下载的文件名称是中文的,需要解决中文乱码问题,不同浏览器解决方式不同,尤其是IE浏览器-----需要判断使用的是哪种浏览器,IE不同版本判断的方式不同
十五、Ajax+JQuery
十六、前端框架(BootStrap+LayUI+Validate)