Java知识点总结
面向对象
Java中的数据类型分为:原始数据类型和引用数据类型
在数据类型转换中,由低类型转至高类型,将会自动(隐式)类型转换,而从高类型转至低类型,则必须强制(显式)类型转换
Java中的数组是引用数据类型,必须由new关键字在堆中分配内存
Java虚拟机的垃圾回收机制将自动释放不再使用的内存
面向对象(Object Oriendted Programming)就是使用对象进行程序设计,简写成OOP。
面向对象的三大原则:封装、继承、多态。
对象是面向对象编程的核心部分,是实际存在的具体实体,具有明确定义的状态和行为。
对象由状态(属性)和行为(方法)组成。
类是具有相同属性和行为的一组对象的集合。
对象或实体拥有的特征在类中表示时称为属性。
对象执行的操作在类中表示为方法。
类与对象的区别:
·类是用来描述实体的“模板”或“原型”
·对象是实际的实体,每一个对象都是类的一个具体实例
·类用来定义对象所有的属性和方法,同一类的所有对象都拥有相同的特征和操作
·可以将类理解成生产产品的模具,而对象则是根据此模具生产的一个个产品。
封装
隐藏属性、方法或实现细节的处理方式称为封装。
封装其实就是有选择性地公开或隐藏某些信息,它解决了数据的安全性问题。
继承
继承就是重用现有的类来生成新类的一种特征。
通俗地讲就是从现有的类(即父类或基类)创建新类(子类或派生类)的过程。
继承可以使代码重用。
多态
多态是指同一函数在不同的类中有不同的实现。
多态的好处就是使类更灵活,更便于扩充。
抽象
把相同的或相似的对象归为一类的这个过程就是抽象,所以,抽象就是分析问题的方法。
抽象的基本原则:
·只关心主要问题,不关心次要问题
·只关心主要矛盾,不关心次要矛盾
·只关心相同的问题,而不关心不同的东西
·只关心问题是什么,能够完成什么,而不关心怎样去完成
抽象的过程其实就是面向对象编程的核心思想。
使用已经定义好的类,创建该类对象的过程称为“实例化”。
访问权限:public和private
public修饰的成员可以在任何地方进行访问,不受任何约束;private修饰的成员只能够被本类中的其它成员访问,而不能从类的外部进行访问。
构造方法是特殊的方法,它与类同名,在对象实例化时由虚拟机自动调用。
构造方法没有返回值类型,也不能有返回值。
每个对象在生成时都必须执行构造方法,而且只能执行一次。
如果构造方法调用失败,那么对象也无法创建。
不可以显式地直接调用构造方法。
必须先实例化类的对象,才可以访问到其中的成员。
构造方法一般用来初始化对象中的数据成员。
方法重载的三大原则:
·方法名相同
·参数不同
·同一作用域
注意:方法重载跟方法的返回值类型没有任何关系。
请勿将功能完全不一样的方法进行重载。
this
每一个成员都有一个隐含的this引用,它总是指向调用它的对象。
关键字this给出用于调用成员方法的对象的地址。
每当调用成员方法时,编译器会向this分配调用该方法的对象的地址。
可以像使用任何引用那样使用this。
静态成员变量:
在成员变量前加static关键字,可以将其声明为静态成员变量。
如果类中成员变量被定义为静态,那么不论有多少个对象,静态成员变量只有一份内存拷贝,即所有对象共享该成员变量。
静态成员变量的作用域只在类内部,但其生命周期却贯穿整个程序。
静态成员变量的注意事项:
·和程序同生命周期
·在没有实例化对象时,可以通过类名访问静态成员
·也可以通过对象访问静态成员变量,但不论使用的是哪个对象,访问到的都是同一个变量。
·静态成员方法只能对类的静态成员变量进行操作。
·静态成员方法没有this引用。
静态成员包括静态数据成员和静态成员方法。
静态成员属于整个类而不是属于某个对象,它被该类的所有对象共享。
访问静态成员时一般通过类名访问,也可以通过对象访问。
静态成员也受访问权限的约束。
静态数据成员在使用之前应尽量初始化。
静态成员方法不能操作非静态成员。
继承
面向对象的程序设计的有三大特征:
·封装:解决了数据的安全性问题
·继承:解决了代码的重用问题
·多态:解决了程序的扩展问题
继承其实就是自动地共享基类中成员属性和成员方法的机制。
继承的作用:
·实现了代码重用
·实现类递增式的程序设计
·继承是能自动传播代码和重用代码的有力工具
·继承能够在某些比较一般的类的基础上建造、建立和扩充新类
·能减少代码和数据的重复冗余度,并通过增强一致性来减少模块间的接口和界面,从而增强了程序的可维护性
·能清晰地体现出类与类之间的层次结构关系
注意:
·继承是单方向的,即派生类可以继承和访问基类中的成员,但基类则无法访问派生类中的成员。
·在Java中只允许单一继承方式,即一个派生类只能继续于一个基类
信息隐藏是面向对象程序设计的重要特点之一,它可以:
·防止类的使用者意外损坏数据
·对任何实现细节所作的修改不会影响到使用该类的其它代码
·使类更易于使用
在Java中实现信息隐藏的是访问控制权限机制。
访问修饰符:
·public:不受任何限制本类或非本类均可随意访问。
·protected:本类及其子类可以访问(父子友好),同一个包中的其它类也可访问(包内友好)。
·缺省:只有相同包中的类可以访问(包内友好)。
·private:只有本类可以访问,其余都不可以。
对普通类使用的访问修饰符只有public和缺省两种。
不加访问修饰符,缺省修饰的类只能从本包中访问,不同包则无法访问到。
父类中的构造方法不能被子类继承,即使它是public的。
当实例化子类的对象时,必须先执行父类的构造方法,然后在执行子类的构造方法。
如果父类的构造方法执行失败,那么子类的对象也将无法实例化。
在Java中,super关键字有两个主要用途:
1、在子类的构造方法中,super关键字可以显式地通知虚拟机调用直接父类的构造方法,用于将参数传递给它。
一般语法为:super(实际参数);
注意:该语句必须是子类构造方法的第一条语句。
2、在子类中默认访问是属于自己的哪一个成员。super关键字可以明确地指定要访问父类中的成员。
一般语法为:super.成员名;
前提条件是:父类中的该成员不是private的
对象数组中存放的并不是对象本身,而是对象的引用。
多态
在类的继承体系结构中,如果子类中出现了与父类中有同原型的方法,那么认为子类中的方法覆盖了父类中的方法(也称为方法重写)。
通过子类的实例调用被覆盖的方法时,将总是调用子类中的方法,而父类中的方法将被隐藏。
方法覆盖和方法重载的区别:
·方法覆盖出现的前提条件之一是必须有继承发生的情况下,而且要求父类和子类中的方法必须同原型。
·方法重载时,继承并不是必需的,它只要方法名称相同,而参数列表则必须不同,换言之,各方法的原型其实是不同的。
多态包括动态多态和静态多态。
静态多态:
·静态多态也称为编译时多态,即在编译时决定调用哪个方法。
·静态多态一般是指方法重载。
·只要构成了方法重载,就可以认为形成了静态多态的条件。
·静态多态与是否发生继承没有必然联系。
动态多态:
·动态多态也称为运行时多态,即在运行时才能确定调用哪个方法。
·形成动态多态必须具备以下条件:
1、必须要有继承的情况存在。
2、在继承中必须要求方法覆盖。
3、必须由基类的引用指向派生类的实例,并且通过基类的引用调用被覆盖的方法。
·由上述条件可以看出,继承是实现动态多态的首要前提。
在某些情况下,基类无法(或者没有必要)提供被覆盖方法的具体实现,那么就可以将此方法声明成抽象方法。
使用关键字abstract声明抽象方法,一般语法:
[访问权限] abstract 返回值类型 方法名称(参数列表);
如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。
定义抽象类同样使用关键字abstract,一般语法:
[访问权限] abstract class 类名{
成员列表
}
注意:
·抽象类不可以直接实例化,只可以用来继承。
·抽象类的派生子类应该提供对其所有抽象方法的具体实现。
·抽象方法实际上就是由抽象基类强制要求其派生子类必须实现的方法原型。
·抽象类中也可以包含有非抽象的方法。
·构造方法和静态方法不可以修饰为abstract
如果某个类中的所有方法都是抽象方法,那么可以考虑将该类定义为接口。
定义接口的关键字interface,一般语法为:
[访问权限] interface 接口名{
成员列表
}
接口不可以实例化,只能用于实现。(implements)
注意:
·接口中不能定义非抽象方法,也就是说接口中不能包含有函数实体。
·接口中的所有方法都默认为抽象方法,无需在每个方法前加abstract关键字。
·接口的实现类应该提供对接口中所有抽象方法的具体实现,否则将成为抽象类。
·与抽象类和它的继承类相似,也可以使用接口的引用指向其实现类的对象,从而达到动态多态的效果。
Java只支持单继承,但是可以实现多个接口。
Java中还允许一个接口继承于另一个接口。
在Java中,final关键字有最终的,不可修改的含义。
final关键字有三种用途,可以分别应用于变量、成员方法和类。
如果将某个变量修饰为final,那么该变量就成为常量,一般语法:
[访问权限] final 数据类型 常量名 = 值;
常量在声明时必须初始化。
如果将某个成员方法修饰为final,则意味着该方法不能被子类覆盖,一般语法:
[访问权限] final 返回值类型 方法名(参数列表){
...
}
如果在派生类中出现用原型的方法,将会报错。
如果将某个类修饰为final,则说明该类无法被继承,一般语法:
[访问权限] final class 类名{
成员列表
}
类与类之间的关系:“是”关系和“有”关系。
异常
程序中出现的错误被称为异常。
异常可分为两大类:编译时异常和运行时异常。
try块和catch块:
·try块:一般用来监视有可能产生异常的代码部分。
·catch块:当异常产生后,catch块捕捉异常,并在其中对异常进行处理。
Java中的异常类:
·Exception:异常层次结构根类
·ArithmeticException:算术异常
·ArrayIndexOutOfBoundsException:数组下标越界
·NumberFormatException:字符串转换数字失败
finally块:
·无论try/catch块中发送了什么,finally块都一定会执行
·finally块是可选的
·finally块必须和try块一起使用,不能单独存在
Throwable有两个直接的子类,它们是:
·Error类:Error类的异常通常为内部错误,因此在正常情况下并不期望用户程序捕获它们。
·Exception类:绝大部分用户程序应当捕获的异常类的根类。
异常类中的常用方法:
String getMessage():在Exception类中定义的方法,被继承到所有的异常类中,用于获得与异常相关的描述信息。
void printStackTrace():在Exception类中定义的方法,用于在控制台上显示有关异常的信息,不但有异常的原因,还涉及产生异常的代码行。
多重catch块的注意事项:
·不论有多少个catch块,最多只会执行其中的一个
·catch块的书写顺序:类层次越低的越往上写,越高的越往下写。
throw关键字:
·throw语句用于手工抛出异常
·执行流程将在throw语句后立即停止,转而寻找与之类型相匹配的catch块
·throw语句的语法是:throw (异常类型的实例);
throws关键字:
·throws用于将函数内部产生的异常抛给主调函数
·任何抛到函数外部的异常,都必须使用throws关键字指定其异常类型
自定义异常类一般继承与Exception类
断言(assert):
断言一般用于程序不准备通过捕获异常来处理的错误
java.io包
java.io包也是Java内置的包,其中包含一系列对文件和目录的属性进行操作,对文件进行读写出操作的类。
文件可以认为是相关记录或存放在一起的数据的集合。
File类:
·File类的对象不但可以表示文件,还可以表示目录,在程序中一个File类对象可以代表一个文件或目录。
·当创建一个文件对象后,就可以利用它来对文件或目录的属性进行操作。
·File对象并不能直接对元件进行读/写出操作,只能查看文件的属性。
File类中的常用方法:
boolean exists():判断文件是否存在,存在返回true,否则返回false
long length():获得文件的长度(字节数)
boolean createNewFile() throws IOException:创建新文件,创建成功返回true,否则返回false,有可能抛出IOException异常,必须捕捉
stream(流)
流是指一连串流动的数据信号,是以先进先出的方式发送和接收数据的通道
流的类型:
·根据流动方向的不同,流分为输入流和输出流
·对于输入和输出流,由于传输格式的不同,又分为字节流和字符流。
·字节流是指8位的通用字节流,以字节为基本单位,在java.io包中,对于字节流进行操作的类大部分继承于InputStream(输入字节流)类和OutputStream(输出字节流)类。
·字符流是指16位的Unicode字符流,以字符(两个字节)为基本单位,非常适合处理字符串和文本,对于字符流进行操作的类大部分继承Reader(读取流)类和Writer(写入流)类。
使用FileInputStream类读文件:
·FileInputStream类称为文件输入流,继承于InputStream类,是进行文件读操作的最基本类。
·它的作用是将文件中的数据输入到内存中,我们可以利用它来读文件。
·由于它属于字节流,因此在读取Unicode字符(如中文)的文件时可能会出现问题。
FileInputStream类的常用方法:
int read() throws IOException:读取文件中的数据,一次读取一个字节,读取的数据作为返回值返回,如果读到文件末尾则返回-1,有可能抛异常,必须捕捉
int read(byte[] b) throws IOException:读取文件中的数据,将读到的数据存放到byte型数组中,并返回读取的字节的数量,未读到数据返回-1,有可能抛异常,必须捕捉
void close() throws IOException:关闭流对象,有可能抛异常,必须捕捉
使用FileOutputStream类写文件:
·FileOutputStream类称为文件输出流,继承于OutputStream类,是进行文件写操作的最基本类。
·它的作用是将内存中的数据输出到文件中,我们可以利用它来写文件。
void write(int b) throws IOException:往文件中写数据,一次写一个字节,有可能抛异常,必须捕捉
FileReader类:
·FileReader类称为文件读取流,允许以字符流的形式对文件进行读操作
·该类将从文件中逐个地读取字符,效率比较底下,因此一般将该类对象包装到缓冲流中进行操作
BufferedReader类:
·BufferedReader类主要为字符流提供缓冲,以提高效率。
FileWriter类:
·FileWriter类称为文件写入流,以字符流的形式对文件进行写操作。
BufferedWriter类:
·BufferedWriter类可以为FileWriter类提供缓冲
BufferedWriter类的常用方法:
void newLine() throws IOException:将一个回车换行符写入到缓冲写入流中,有可能抛异常,必须捕捉
DataInputStream类:
·DataInputStream类可以输入任何类型的数据,但它不可以单独使用,需要配合其它字节输入流一起使用。
DataOutputStream类:
·DataOutputStream类可以输出任何类型的数据,同样也需要配合其它字节输出流一起使用。
java.lang包
java.lang包是java内置的一个基础包,其中包含了一系列程序中经常要用到的类
在默认情况下,每个java程序都会自动导入该包,因此无需在程序中显式地声明。
在java.lang包中,对于每个原始数据类型都有一个响应的包装类。
每一个包装类都有一个静态的valueOf方法,用于将字符串转换成相应包装类的对象。
除了Boolean类和Character类以外,其它的包装类都有静态的parseXxx方法(Xxx指代具体的数据类型),用于将字符串转换成相对应的原始数据类型值。
String类:
·创建一个字符串对象之后,将不能更改构成字符串的字符。
String类中提供length成员方法,用来获取字符串的长度,方法原型:int length(); 该方法返回字符串中有效字符的个数。
字符串比较:
·==运算符用于比较两个引用是否指向同一个对象。
·equals()方法则是比较两个字符串中的内容是否相同。
StringBuffer类:
·StringBuffer类用于表示可以修改的字符串
·使用+运算符的字符串将自动创建字符串缓冲对象
在Java中一旦创建了字符串就不能直接更改,这就是字符串的不变性。
Math类:
·Math类中提供了一系列基本数学运算和几何运算的方法
·该类的构造方法被修饰为private,因此不能实例化
·该类中的所有方法都是静态的,可以通过类名直接调用
·该类被修饰为final,因此没有子类
Math类中还包括两个常用的常量:
·PI:圆周率π
·E:自然常量
Object类:
·Java中的类体系遵循单根结构,即任何一个类往上追溯都到达同一个父类
Class类:
·Class类的实例用于记录对象的类描述信息
·Class类没有公共的构造方法,无法通过new运算符实例化,只能通过对象的getClass方法,或是通过Class的静态方法forName来获得实例。
java.util包
java.util包是Java内置的一个工具包,其中包含了一系列常用的工具类。
Date类:
·Date类对象用来表示时间和日期。
·Date类最多的用途是获取系统当前的日期和时间。
Calendar类:
·Calendar类也是用来操作日期和时间的类,但它可以以整数形式检索类似于年、月、日之类的信息。
·Calendar类也是抽象类,无法实例化,要得到该类对象只能通过调用getInstance方法来获得。
·Calendar对象提供给为特定语言或日历样式实现日期格式化所需的所有时间字段。
Calendar类的常用方法:
Calendar getInstance():返回默认地区和时区的Calendar对象
int get(int fields):返回调用对象中fields指定部分的值
void set(int fields, int value):将value中指定的值设置到fields指定的部分
Random类:
·Random类专门用来生成随机数
Random类的常用方法:
int nextInt():从随机数生成器返回下一个整型值
float nextFloat():从随机数生成器返回0.0到1.0之间的下一个浮点数
集合:
·集合是将多个元素组成一个单元的对象
·类似于数组,但数组最大的缺点是:长度受到限制(一经创建,就不可再改变),并且只能存放相同数据类型的元素。
·集合的长度没有限制,可以存放任意多的元素,而且元素的数据类型也可以不同。
·集合还提供一系列操纵数据的方法。
集合框架的优点:
·提供有用的数据结构和算法,从而减少编程工作。
·提高了程序速度和质量,因为它提供了高性能的数据结构和算法。
·允许不同API之间的相互操作,API之间可以来回传递集合。
·可以方便地扩展或改写集合。
集合类中只能存放对象,而不能存放原始数据类型的元素,所以当有原始数据类型需要存放时,只能将其转换成相应的包装类对象。
ArrayList类:
·ArrayList是长度可变的对象引用数组,称为动态数组。
·随着元素的添加,元素数目的增大,数组容量也会随之自动扩展。
·访问和遍历数组元素时,ArrayList的性能优越。
·ArrayList类继承了AbstractList类并实现了List接口。
ArrayList类的常用方法:
int size():返回ArrayList对象的大小,即元素的数量
boolean isEmpty():判断ArrayList对象是否为空,为空返回true,否则返回false
void clear():清空ArrayList对象中的所有元素
boolean add(Object object):向ArrayList对象中添加一个元素,该元素可以是任何类的对象
Object remove(int index):从ArrayList对象中删除指定索引位置的元素
Object get(int index):返回指定索引位置的元素
LinkedList类
·LinkedList类用于创建链表数据结构
·链表中元素的数量不受任何限制,可以随意地添加和删除
·与ArrayList相比,如果需要频繁地添加和删除元素,LinkedList的性能更加优越
·LinkedList类继承了AbstractSequentialList类,并实现了List接口
LinkedList类常用的方法:
int size():返回链表的大小,即元素的数量
boolean isEmpty():判断链表是否为空,为空返回true,否则返回false
void clear():清空链表中的所有元素,使其成为空链表
boolean add(Object element):向链表中添加一个元素,该元素可以是任何类的对象
Object remove(int index):从链表中删除指定索引位置的元素
Object get(int index):返回指定索引位置的元素
Vector类:
·Vector类与ArrayList类和LinkedList类很相似,最大的区别在于Vector是线程同步的。Vector类可以创建线程同步的动态数组。
·如果在多线程的程序中要使用到集合框架,并且不希望线程与线程之间相互干扰,那么Vector是不错的选择。
·Vector类继承于AbstractList类,并实现了List接口。
HashMap类:
·HashMap以键值对的形式存储元素
·对于HashMap来说,不存在索引,也就是说不可以通过索引来访问元素,只能通过键去访问值,如要快速检索元素的话,HashMap性能优越。
·由于没有索引,所以HashMap中的元素的存放是没有顺序的
·HashMap类继承了AbstractMap类,并实现了Map接口。
HashMap类常用的方法:
int size():返回HashMap对象的大小,即元素的个数
boolean isEmpty():判断HashMap对象是否为空,为空返回true,否则返回false
void clear():清空HashMap对象中的所有元素
Object put(Object key, Object value):向HashMap对象中添加一个元素,必须指定该元素的键和值
协议
协议就是通信双方必须共同遵守的规则和约定。
协议必须具备如下三个要素:
语法:数据与控制信息的结构或格式。
语义:控制信息的含义,需要做出的动作及回应。
时序:规定的操作的执行顺序。
HTTP
HTTP协议即超文本传输协议,是基于网络应用层的协议,它建立在TCP/IP协议的基础上。
该协议使用可靠的TCP连接,默认端口是80。
HTTP协议基于客户端/服务器模式。
请求报文中的大部分是可选的,只有GET和Host部分是必需的。
响应报文中也有两个部分是必需的:
1、HTTP/协议版本号 状态码 OK
2、Content-Type: text/html, charset=字符集编码(用来描述服务器发回响应的文件类型以及字符集编码)
Web应用程序
Web应用程序的优点:
·访问Web应用程序更容易
·维护和部署成本低
GET、POST方法的区别:
GET方法:
·用于检索信息(如文档、图标或数据库请求结果)
·请求的页面可以被设置为书签和使用电子邮件发送
·请求信息作为查询字符串发送
POST方法:
·用于发送敏感信息(如信用卡号)或要保存到数据库中的信息
·请求的页面不能设置为书签或不能通过电子邮件发送
·发送的数据没有大小限制
Web应用程序开发过程:
·设计目录结构
·编写Web应用程序代码
·编写部署描述符
·编译代码
·将Web应用程序打包
·部署Web应用程序
·执行Web应用程序
在三层体系结构中,表示层不能与数据层直接交互
Servlet
Servlet是用Java语言编写的程序,它运行在Web服务器上,用以处理来自客户端的请求;它一般会把处理的结果以HTML的形式返回,在客户端形成动态网页。
Servlet的优点:
·Servlet运行在Web服务器中,可以扩展服务器的功能
·Servlet可以和其他资源交互,从而生成返回给客户端响应的内容,即动态网页
·使用Java编写,所以能够跨平台
·Java的所有优点都可以在Servlet中体现
·Servlet很安全,因为访问Servlet的唯一途径是通过服务器
·只要符合Servlet规范的Servlet容器都可以运行Servlet
Servlet API(servlet-api.jar)
与Servlet相关的两个包:javax.servlet、javax.servlet.http
javax.servlet包中包含了支持通用的、跨协议的Servlet的相关接口和类;javax.servlet.http包中则包含了特定于HTTP协议的Servlet相关类。
javax.servlet包中的接口:
Servlet:这是每个Servlet都必须实现的接口,它定义了一系列必须由Servlet实现的方法。
ServletRequest:此接口用于将客户端的请求信息传送给Servlet。
ServletResponse:此接口用于对客户端做出响应。
ServletConfig:此接口定义Servlet配置对象,以便于容器将信息传递给Servlet。
ServletContext:此接口定义了一组方法,用于Servlet与容器进行通信。
GenericServlet:抽象类,定义一个通用的、独立于底层协议的Servlet
javax.servlet.http包中的类:
HttpServlet:该类是最常用于扩展Servlet的类,因为很多Servlet应用程序都遵照HTTP协议运行。此类支持HTTP协议功能以及Servlet类的方法,它是个抽象类。它接收客户端的请求,并向客户端发送响应。
Cookie:此类用来创建Cookie,它存储了少量由Servlet发送至客户端的信息。
javax.servlet.http.HttpServlet:
HttpServlet中提供了一系列让子类重写的方法,在不同的时刻会调用执行:
public void init(ServletConfig config) throws ServletException :在初始化Servlet时调用一次,如有特殊需要,可重写该方法。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException : 如果客户端是以GET方式提交请求时执行,应当重写此方法。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException : 如果客户端是以POST方式提交请求时执行,应当重写此方法。
public void distroy() :当销毁Servlet实例时调用一次,如有需要释放的资源,可重写该方法。
HttpServlet中还提供了一些其他的方法,这些方法不是用来重写,而是提供某些功能的:
ServletContext getServletContext() :返回ServletContext对象
ServletConfig getServletConfig() :返回ServletConfig对象
String getServletInfo() :返回Servlet的一般信息字符串,如作者、版本、版权等。
void log(String message) :将消息写入Servlet的日志文件
long getLastModified(HttpServletRequest request) :返回Servlet的最后修改日期
String getServletName() :返回Servlet的名称
String getInitParameter(String name) :返回指定的初始化参数的值
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException :此方法用来调度客户端的请求,API文档中明确规定,请勿重写该方法。
配置文件web.xml:
<servlet>
<servlet-name>ServletName</servlet-name>
<servlet-class>ServletClass</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletName</servlet-name>
<url-pattern>ServletURLMapping</url-pattern>
</servlet-mapping>
总结:
·Servlet其实就是运行在服务器端的小应用程序
·Servlet容器负责调度Servlet,并控制着它们的生命周期
·一般通过继承HttpServlet的方式来实现Servlet
·根据客户端请求的方式,只需重写doGet或doPost方法即可
·要使容器正确识别Servlet,则必须填写配置文件web.xml
·WEB应用程序必须要按照标准的目录结构,方可正确运行。
会话跟踪
HttpServletRequest的常用方法:
void setCharacterEncoding(String env) :设置请求报文的字符集编码,主要用来解决页面间传递中文的问题。
String getParameter(String name):获取由name指定的参数的值。
String[] getParameterValues(String name):获取由name指定的参数的所有值。
Enumeration getParameterNames():获取所有参数的名称。
HttpSession getSession():获得与请求有关的Session,如果没有则创建一个新的。
RequestDispatcher getRequestDispatcher(String path):获得与请求有关的RequestDispatcher。
void setAttribute(String name):在请求中设置新的属性。
Object getAttribute(String name):根据属性名称获得属性的值。
String getContextPath():获得当前Context的路径(即站点路径)。
HttpServletResponse的常用方法:
PrintWriter getWriter():返回对客户进行输出的字符流。
void setContentType(String type):设置对客户端输出端额字符集编码。
void sendRedirect(String location):将响应重定向到新的URL。
在某些情况下,必须想办法将客户状态维持在服务器上,这种维持客户状态的技术,我们称之为会话跟踪技术。
会话跟踪技术可以由以下四种方式来实现:
·URL传递参数
·隐藏表单区域
·使用Session对象
·使用Cookie
所谓的会话是指:在一段时间内,某客户端与服务器之前的一连串的请求与响应。
会话对象可以使用户访问一个站点的多个页面时共享信息。
HttpSession的常用方法:
void setAttribute(String name, Object value):在会话中设置新的属性。
Object getAttribute(String name):根据属性名称获得属性的值。
void invalidate():丢弃会话,释放其中存储的任何数据。
会话对象是进行会话跟踪最流行的一种方式,它主要解决了HTTP协议的无状态的问题。
JSP基本语法
JSP是Java Server Pages的简称,是服务器端的一种基于Java语言的网页技术,所有程序操作都在服务器端执行,网络上传送给客户端的仅是得到的结果,与客户端的浏览器无关。
HTML + Java程序片段 + JSP标记 = JSP网页
JSP网页的运行原理:
容器在遇到JSP网页的请求时,首先执行其中的Java代码,通过这些Java代码可以操作数据库、发送email、传输数据信息以及转到另外的网页等。然后服务器将执行完代码后所产生的结果封装到原HTML网页中,以HTMl的格式返回给用户。
JSP页面内容:
静态内容:HTML静态文本
指令:以“<%@%”开始,以“%>”结束
表达式:<%=Java表达式%>
Scriptlet:<%Java代码%>
声明:<%!属性或方法%>
动作:以“<jsp:动作名”开始,以“</jsp:动作名>”结束
注释:
<%--这也是注释,但是客户端不能查看到--%>
JSP元素:JSP脚本元素、指令元素、动作元素。
JSP脚本元素包括:注释、表达式、Scriptlet、声明。
共同特点是:都是用一对<% %>的符号封装所构成。
表达式是对数据的表示,在请求处理时计算这些表达式,计算的结果将被转换为字符串,插入到当前的输出流中,然后显示出来。
表达式在JSP页面中的表现形式:<%=Java表达式%>
JSP声明用于在JSP页面的脚本语言中使用的变量和方法。声明不会在当前的输出流中产生任何的输出,声明只在当前的JSP页面中有效。
JSP声明在JSP页面中的表现形式:<%!Java代码%>
JSP指令并不向客户端产生任何输出,主要用于为转换阶段提供整个JSP页面的相关信息。所有的指令只在当前的JSP页面中有效。JSP指令包括page、include、taglib。
JSP指令的语法为:
<%@ 指令名称 属性1="属性值1" 属性2="属性值2" ... 属性n="属性值n"%>
page指令用于设置JSP页面的属性,这个属性将被用于和容器通信。
<%@ page %>指令作用于整个JSP页面,同样包括静态的包含文件。
无论你把<%@ page %>指令放在JSP的文件的那个地方,它的作用范围都是整个JSP页面。
include指令:用来在JSP文件被编译时导入一个指定的文件,语法形式:<%@ include file="relativeURLspec" %>
include指令告诉编译器在编译当前的JSP程序时,将由relativeURLspec所指定的外部文件代码插入到include编译指令所在的位置,并把它作为当前JSP程序的一部分编译,如果被嵌入文件在包含它们的主JSP程序被装载到内存之后被修改,那么主JSP程序连同被嵌入的文件将在下一次请求产生时被重新编译。
这个包含的过程是静态的,而包含的文件可以是HTML文件、JSP页面、文本文件或是一段java程序。
taglib指令允许用户创建自定义标签。
JSP隐式对象
对象不需要我们来new,而由web容器来进行加载,这就是我们所说的JSP隐式对象。
输入/输出对象:
·控制页面的输入和输出
·访问与所有请求和响应有关的数据
·输入和输出对象包括request、response和out
request对象:
·表示客户端对网页的请求
·实现javax.servlet.http.HttpServletRequest接口
·使用HTTP协议处理客户端的请求
request对象常用方法:
String getParameter(String name):根据页面表单组件名称获取请求页面提交数据
String[] getParameterValues(String name):获取页面请求中一个表单组件对应多个值时的用户的请求数据
setCharacterEncoding(String param):设置请求中的字符编码方法
response对象:
·处理JSP生成的响应
·将响应发送给客户端
·实现javax.servlet.http.HttpServletResponse接口
·使用HTTP协议将响应发送给客户端
response对象常用方法:
void setContentType(String name):设置作为响应生成的内容的类型和字符编码
void sendRedirect(String name):发送一个响应给浏览器,指示其用请求另一个URL
out对象:
·表示输出流
·javax.servlet.jsp.JspWriter类的实例
·使用write()、print()和println()方法
out对象的方法:
println()、print()、write():用以输出至客户端页面
作用域通信对象:
·隐式对象的作用域包括pageContext、request、response和application
·作用域通信对象包括session、application和pageContext
session对象:
·Web服务器为单个用户发送的多个请求创建会话
·存储有关用户会话的所有信息
·javax.servlet.http.HttpServlet接口的实例
session对象最常用的方法有:
void setAttribute(String name, Object value):以键值对的方式,将一个对象的值存放到session中
Object getAttribute(String name):根据名称去获取session中存放对象的值
application对象:
·表示JSP页面所属的应用程序
·应用程序的JSP页面组合起来形成一个应用程序
·javax.servlet.ServletContext接口实例
application对象最常用的方法有:
void setAttribute(String name,Object value):以键值对的方式,将一个对象的值存放到application中
Object getAttribute(String name):根据名称去获取application中存到对象的值
pageContext对象:
·使用户可以访问页面作用域中定义的所有隐式对象
·它的作用范围是在同一页面
·javax.servlet.jsp.PageContext类的实例
pageContext对象最常用的方法有:
void setAttribute(String name, Object value):以键值对的方式,将一个对象的值存放到pageContext中
void getAttribute(String name):根据名称去获取pageContext中存放对象的值
Servlet对象:
·JSP引擎为每一个JSP生成一个Servlet
·Servlet对象提供了访问Servlet信息的方法和变量
·Servlet对象包括:page和config
page对象:
·使用page对象可以访问Servlet类的所有变量和方法
·java.lang.Object类的一个引用
config对象:
config对象实现javax.servlet.ServletConfig接口,表示Servlet的配置,其常用方法有:
getInitParameter():获取初始化的参数
getServletContext():获取环境
getServletName():获取Servlet名字
JSP隐式对象一般分为输入/输出对象、作用域通信对象、Servlet对象和错误对象四类。
JSP中的隐式对象包括page、config、request、response、out、session、application、pageContext和exception。
JSP定义的作用域包括page、request、session和application。
JSP和JavaBean(jsp动作)
JavaBean的优点:
·变更方便
·可重用组件
·可在多个应用程序中使用
·可以跨平台
JavaBean的编写:
·有一个共有无参的构造函数
·类名是公共的
·取得或设定属性时,必须使用共有set方法和get方法
JSP标准动作:
·JSP元素为请求处理阶段提供信息
JSP2.0标准动作有:
·<jsp:useBean>
·<jsp:getProperty>
·<jsp:setProperty>
·<jsp:include>
·<jsp:param>
·<jsp:forword>
include动作与include指令的区别:
·前者就相当于宏,编译时替代,后者相当于函数,运行时返回。
·当采用<%@include%>指令包含资源时,资源的内容(文本或代码)在include指令的位置处被包含进来,成为一个整体,被转换为Servlet源文件;当采用<jsp:include>动作包含资源时,当前页面和被包含的资源是两个独立的个体,当前页面将请求发送给被包含的资源,被包含资源对请求处理的结果将作为当前页面对请求相应的一部分发送到客户端。
·<jsp:include>包含的内容可以是动态改变的,它在执行时才确定,而<%@ include%>包含的内容是固定不变的,一经编译,就不能改变。
·<jsp:include>的效率比<%@ include%>效率低。
<jsp:userBean>常用的三个属性:
id:在JSP网页中,id值表示JavaBean的代号,代表我们使用JavaBean的对象。
scope:表示这个JavaBean的范围,和我们将的隐式对象的范围一致
class:表示这个JavaBean的类的位置
JavaBean的范围:page、request、session、application