监听器能做什么事
监听某一个事件的发生,状态的改变
它的内部机制其实就是接口回调
接口回调
当有一个需求:A在执行循环,执行到5的时候,通知B
事先先把一个对象传递给A,当A执行到5的时候,通过这个对象来调用B中的方法,但是注意,不是直接传递一个接口的实例过去,而是传递一个接口的实例过去
先写一个接口
public interface PrintListener{
//一旦出现了某一种事件,达到了某一个状态,就调用这个方法
void print();
}
再写B类实现这个接口
public class B implements PrintListener{
public void print(){
System.out.println("B收到了");
}
}
监听A类
public class A{
public void print(PrintListener listener){
for(int i = 0;i<10;i++){
System.out.println("循环到了 "+i);
if(i==5){
System.out.println("通知B")
//这是以前的写法
//B b = new B();
//b.print();
listener.print();
}
}
}
}
测试类
public class Test{
public static void main(Stirng[] args){
A a = new A();
a.print(new B());
}
}
- 在A中为什么不直接用B b = new B()创建一个B的实例去调用方法?
如果两个类是同时写的或者是同一个人写的,确实可以直接用这种方法达到效果,但是如果两个类不是同时写的或者不是同一个人写的呢?例如,A类写于1990年,而B类写于2018年,那么A类是不可能准确知道今后会有B这么一个类的,那么使用接口就可以避免这种情况,使用A类的人只要写一个实现了特定接口的类就可以了。
web监听器
总共有8个,划分成三种类型
1.定义一个类,实现接口
2.在xml中注册|配置监听器
<listener>
<listener-class>包名.类名</listener-class>
</listener>
- 监听三个作用域创建和销毁
request ----- httpServletRequest
session ----- httpSession
application ----- ServletContext
-
ServletContextListener
servletContext创建:启动服务器的时候
servletContext销毁:关闭服务器,从服务器移除项目
初始化的时候调用:contextInitialized
销毁的时候调用:contextDestroyed -
ServletRequestListener
request创建:访问服务器上的任意资源都会有请求出现,html,jsp,servlet
request销毁:服务器已经对这次请求做出了响应
初始化的时候调用:requestInitialized
销毁的时候调用:requestDestroyed -
HttpSessionListener
session的创建:只要调用getSession
session的销毁:超时,正常关闭服务器(序列化)
创建的时候调用:sessionCreated
销毁的时候调用:sessionDestroyed
作用:
ServletContextListener:
利用它来在servletContext创建的时候
1.完成自己想要的初始化工作
2.执行自定义任务调度,执行某一个任务
HttpSessionListener:
统计在线人数
-
监听三个作用域属性状态变更]
request ---- ServletRe1questAttributeListener
session ---- HttpSessionAttributeListener
servletContext ---- ServletContextAttributeListener
可以监听在作用域中添加 | 替换 | 移除的动作
sttributeAdded
sttributeRemoved
sttributeReplaced
- 监听httpSession里面存值的状态变更
这一类监听器不用注册
1.HttpSessionBingdingListenner
valueBound:值被绑定
valueUnbound:值被解除
让javaBean实现该接口即可
2.HttpSessionActivationListener
用于监听现在session的值是钝化(序列化)还是活化(反序列化)的动作
钝化:把内存中的数据存储到硬盘上,sessionWillPassivate
活化:把硬盘中的数据读取到内存中,sessionDidActivate
session钝化活化的意义:
session中的值可能会很多,并且我们有很长一段时间不使用这个内存中的值,那么可以考虑把session中的值存储到硬盘上【钝化】,等下一次再使用的时候,再从硬盘中提取出来【活化】。
如何让session内的值在一定时间内钝化:
1.在tomcat里面 conf/context.xml 里面配置
对所有的运行在这个服务器的项目生效
2.在tomcat里面 conf/Catalina/locahost/context.xml 配置
对localhost生效
3.在自己的web工程项目中的 META-INF/context.xml 配置
只对当前工程生效
maxIdleSwap = “1”: 1分钟不用就钝化
directory: 钝化后的那个文件存放的目录位置
<context>
<Manager ClassName="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="it315"/>
</Manager>
</context>