Oracle培训(四十七)——Servlet第八章知识点总结——过滤器过滤器链
一.过滤器概述
a) 一个中间组件,用于拦截源数据和目的数据之间的消息
b) 过滤二者之间传递的数据
二.Web应用上的过滤器
a) 驻留在Web服务器上的Web组件
b) 过滤从客户端传递到服务器端的请求和响应(数据的流向不会受到影响、内容会) AOP概念
i. 以更改请求的内容,或者重新设置请求头,然后再将请求传递给目标资源
ii. 在Web应用程序中部署过滤器,对客户端和目标资源来说都是透明的,他们并不需要知道过滤器的存在
c) Web应用上部署多个过滤器
i. 过滤器可以组成一个过滤器链。链中的每个过滤器负责特定的操作和任务,客户端的请求和响应在这些过滤器之间传递(整个Struts都是拦截器实现的)
d) 用途:
i. 认证过滤:对用户请求进行统一的认证。
ii. 登录和审核过滤:对用户的访问请求进行记录和审核。权限认证
iii. 图像转换过滤:转换图像格式。
iv. 数据压缩过滤:对用户发生的数据进行压缩,从而减少传输量。
v. 加密过滤:对请求和响应进行加密解密处理。
vi. 令牌过滤(防止表单重复提交)注册时
vii. 资源访问触发事件过滤
viii. XSLT过滤
ix. MIME-Type过滤
三.HelloWorldFilter –编码、编译:
i. web_0701_first_filter\src\com\test\filter\FirstFilter.java
ii. Web.xml
<!—指定过滤器名和过滤器类-->
<filter>
<filter-name>filter1</filter-name>
<filter-class>com.test.filter.FirstFilter</filter-class>
</filter>
<!-- 将过滤器与URL模式关联,过滤什么请求-->
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
四.过滤器API
a) 由容器实现的接口
i. javax.servlet.Filter
ii. javax.servlet.FilterChain
iii. javax.servlet.FilterConfig
b) 四个包装器类(在请求送到过滤器链的下一个组件之前更改请求的内容或者改变从前一个组件接收的响应)
i. javax.servlet.ServletRequestWrapper
ii. javax.servlet.ServletResponseWrapper
iii. javax.servlet.http.HttpServletRequestWrapper
iv. javax.servlet.http.HttpServletResponseWrapper
c) Filter接口:
d) FilterConfig接口
i. 为过滤器提供初始化参数
ii. 由Servlet容器实现
Oracle培训(四十六)——Servlet第七章知识点总结——监听器
一.监听器概述
a) 监听session,request,application这三个对象里存取数据的变化
b) 监听器对象可以在事情发生前、发生后可以做一些必要的处理
c) Servlet监听器主要目的是给Web应用增加事件处理机制,以便更好地监视和控制Web应用的状态变化
二.监听器分类
三.监听Web应用程序范围内的事件(application级别)
a) Web应用启动和销毁事件(contentInitialed contentDestroyed)启动事件应用:页游(公用的数据加入缓存)关闭事件应用:关闭服务器之前保存活跃数据
b) Web应用程序的属性发生改变的事件(包括增加、删除、修改)。
c) 定义了ServletContextListener和ServletContextAttributeListener两个接口
四.ServletContextListener接口
a) ServletContextListener接口用于监听Web应用程序启动和销毁的事件
b) contextInitialized(ServletContextEvent sce):通知正在接受的对象,应用程序已经被加载及初始化
c) contextDestroyed(ServletContextEvent sce):通知正在接受的对象,应用程序已经被销毁
五.如何配置一个监听器?
a) \web_0604_listener_context\src\com\test\listener\MyServletContextListener.java
b) 1.先从接口实现,写一个类
c) 2.在web.xml里配置linstener
d) 3.当web容器启动或对应的域对象有操作的时候由web容器监听并调用对应的实现类对象进行处理
六.监听会话范围内事件
a) 管理从同一个客户端或用户向一个Web应用程序发出的一系列请求相关的状态或资源
b) HttpSessionBindingListener接口
i. 监听对象加入Session范围时
ii. 监听从Session范围中移出对象时
iii. 接口有两个方法
iv. void valueBound(HttpSessionBindingEvent event):当对象正在绑定到Session中,Servlet容器调用该方法来通知该对象
v. void valueUnbound(HttpSessionBindingEvent event):当从Session中删除对象时,Servlet容器调用该方法来通知该对象
vi. 购物车:会话超时使用,放入购物车,很久未操作,会话超时将数据存入数据库
c) HttpSessionAttributeListener接口
d) HttpSessionListener接口(可用于在线人数的统计)
i. 监听HttpSession对象的创建和销毁操作
ii. 当创建一个Session时,激发session Created(HttpSessionEvent se)方法
iii. 当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法
iv. 功能:统计在线人数
e) HttpSessionActivationListener接口
七.监听请求生命周期内事件
请求作用域范围内的生命周期事件用于管理整个request生命周期的状态和资源
a) ServletRequestListener接口
i. public void requestDestroyed(ServletRe
1、java面向对象的特征
1)封装:封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
面向对象程序设计中,一个非常重要的技术便是封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。这样做的好处在于可以使类内部的具体实现透明化,只要其他代码不依赖类内部的私房数据,你便可以安心修改这些代码。此外,这样做也是出于安全方面的考虑,如果代表网上支付卡密码的变量随便就可以被访问到,这样的系统谁还敢用呢?
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过 外部接口,一特定的访问权限来使用类的成员。
2)继承:子类对父类的继承,若子类与父类在同一包中。子类继承了父类中所有不是private的成员方法(除构造方法)及不是private的成员变量。
对象是用类来定义的。通过类,你能够充分了解对象的全貌。比如,一说起自行车,你就会联想到自行车是有两个轮子、车把以及脚踏板。
更进一步,面向对象语言的另一个特点便是允许从一个已有的类定义新的类。比如,山地车、公路赛车和两人三轮车都是自行车。在面向对象语言中,你可以从一个已经有的自行车类定义山地车类、公路赛车类等等。山地车类、公路赛车类都称为自行车类的子类,自行车类是它们的父类,而这种定义关系,便是继承关系。
子类继承了父类的属性。比如,山地车、公路赛车都是有两个轮子一个车座。子类也可继承了父类的方法,比如山地车、公路赛车、两人三轮车都可以前进、刹车、转弯等。
当然,子类并不限于继承,还可以发扬光大。比如两人三轮车便颠覆了自行车只有两个轮子、一个座垫的属性,使得自己更加休闲潇洒。
3)多态
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
实现多态,有二种方式,覆盖,重载。
覆盖,是指子类重新定义父类的虚函数的做法。
重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
2、Java中的关键字:
1)static,
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用
用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块
static变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
static方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
static代码块
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
static和final一块用表示什么
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问。
2)final,
final变量:
当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。
当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。
另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用
final方法
如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
使用final方法的原因有二:
第一、把方法锁定,防止任何继承类修改它的意义和实现。
第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
final类
final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。
3)this,通常指向当前对象;
4)super,指向父类,如果想引用父类的某种东西时可以使用,此外当super后加参数时,表示调用父类中有相同参数形式的构造函数;
3、抽象类与接口
抽象类:
抽象方法与抽象类必须使用abstract修饰,有抽象方法的类只能被定义为抽象类,抽象类里可以没有抽象方法。
它们