Listener:监听器,用于监听某一个事件的发生
监听器的内部机制:其实就是接口回调
接口回调:
需求:A在执行循坏,当循环到5的时候,通知B
>实现先把一个对象传递给A,当A执行到5的时候,通过这个对象,来调用B中的方法。但是注意,不是直接传递B的实例,而是传递一个接口的实例过去。如下图:
ge
web监听器,总共有8个,划分成三种类型
1、定义一个类,实现接口
2、注册 | 配置监听器
监听三个作用域创建和销毁
三个作用域:
request------【httpRequestSession】
session------【httpSeesion】
application------【ServletContext】
1、ServletContextListener
>监听ServletContext的创建销毁
>创建:服务器启动为每一个应用创建一个ServletContext实例
>销毁:关闭服务器,或者项目从服务器中移除
2、ServletRequestListener
>监听ServletRequest创建销毁
>创建:只要有请求过来,不管请求什么东西,服务器都会帮我们创建一个request实例
(访问 html:会;访问 jsp:会;访问 servlet : 会 )
>销毁:当服务器对这次请求做出了响应,那么就销毁了这个实例
public class MyRequestListener implements ServletRequestListener {
@ Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("servletrequest 销毁了");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("servletrequest 初始化了");
}
}
//在web.xml中注册该类
<listener>
<listener-class>com.itheima.listener.MyRequestListener</listener-class>
</listener>
3、HttpSessionListener
>监听session的创建和销毁
>创建:服务器调用getSession或者访问jsp会创建session实例
(html:不会;jsp:会getSession();servlet:会)
>销毁:会话超时,非正常关闭服务器(正常关闭服务器,session会序列化)
public class MySessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("创建session了");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁session了");
}
}
用法:
三个用法都一样,
1、定义一个类,实现对应的接口
2、在web.xml中使用<listener>元素来注册
作用:
ServletContextListener:
>利用它来,在servletcontext创建的时候,
1. 完成自己想要的初始化工作
2. 执行自定义任务调度。 执行某一个任务。 Timer
HttpSessionListener:
>统计在线人数.
监听三个作用域对象值的变更
1、ServletContextAttributeListener
>监听ServletContext域中的属性改变,添加 | 替换 | 移除
2、ServletRequestAttributeListener
>监听ServletRequest域中属性的改变,添加 | 替换 | 移除
3、HttpSessionAttributeListener
>监听HttpSession狱中属性的改变,添加 | 替换 | 移除
用法一样:
1、定义一个子类,实现对应的接口
2、在web.xml中使用listener注册
3、对三个域中分别作出 添加 | 替换 | 移除 的动作,即可看出变化。
监听httpSession中值的改变
这一类监听器与前两种监听器不太一样。这种监听器无需在web.xml中配置,只需要让javaBean实现对应的接口即可
HttpSessionBindingListener
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("对象被绑定到了session上面去了");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("对象从session中移除了。");
}
HttpSessionBindingListener主要监听的是对象与session域的绑定和解绑的事件
HttpSessionActivationListener
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("对象被钝化了...");
}
@Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("对象被活化了...");
}
HttpSessionActivationListener监听的是对象被钝化和活化的事件
钝化:
正常关闭服务器或者超过了规定的时间,那么对象将会被钝化(序列化)到硬盘上(把内存中的数据 存储到硬盘上)
活化:
重新启动服务器,那么之前钝化的数据将会被活化(反序列化),那么我们在页面上也可访问。(把硬盘中的数据读取到内存中)
Session优化:
Session中通常可以存数据的,那么我们可以把一些长时间不使用的数据给序列化到硬盘上,等再使用的时候,可以从硬盘反序列化回来。这样节省了不少内存空间。如果想做到这个事情,我们可以通过配置,让服务器帮我们去完成这项工作。配置主要有以下三种方式:
1、在conf/context.xml中配置 : 对服务器上部署的作用域名都生效
2、在 conf/Catalina/location/context.xml中配置:只针对localhost 域名生效 localhost:8080
3、在web工程项目中 MATA-INF/context.xml中配置 :只针对当前的工程生效
maxIdleSwap : 1分钟不用就钝化
directory : 钝化后的那个文件存放的目录位置。
D:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\ListenerDemo\itheima
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
</Manager>
</Context>