Listener监听器

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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值