java web视频学习-Listener

监听器:监听某一个事件的发生、 状态的改变。监听到以后执行一个方法。

监听器的内部机制就是接口回调,面向接口编程。
例如:
A在执行循环,当循环到5的时候, 通知B。
事先先把一个对象传递给 A , 当A 执行到5的时候,通过这个对象,来调用B中的方法。 但是注意,不是直接传递B的实例,而是传递一个接口的实例过去。

A就是一个监听器,监听的事件是循环到5,然后执行回调。

img01.png

Web监听器

总共有8个 划分成三种类型

  • 监听三个作用域创建和销毁
  • 监听三个作用域属性状态变更
  • 监听HttpSession里面存值的状态变更

监听器的使用:

  1. 定义一个类,实现接口
  2. 注册 | 配置监听器

一、监听三个作用域创建和销毁

作用域一共有四个

  • aapplication:ServletContext ServletContextListener
  • request:httpServletRequest ServletRequestListener
  • session:httpSession HttpSessionListener
  • pageContext

1.ServletContextListener

servletcontext创建:启动服务器的时候
servletContext销毁:关闭服务器. 从服务器移除项目

2. ServletRequestListener

request创建:访问服务器上的任意资源都会有请求出现。包括(html,jsp,servlet)
request销毁:服务器已经对这次请求作出了响应。
作用:
利用它来,在servletcontext创建的时候,

  1. 完成自己想要的初始化工作
  2. 执行自定义任务调度,执行某一个任务,Timer
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和servlet中都会,在HTML中则没有
session的销毁:超时 30分钟;非正常关闭(销毁);正常关闭服务器(序列化,存到硬盘)

作用:统计在线人数

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了");
}

二、监听三个作用域属性状态变更

可以监听以上三个作用域中值 添加 | 替换 | 移除的动作。
使用方式相同:①自定义类实现相应接口②注册监听

  • servletContext — ServletContextAttributeListener

img03.png

  • request — ServletRequestAttributeListener

img04.png

  • session — HttpSessionAttributeListener

img02.png

自定义回调类

public class AttributeListener implements HttpSessionAttributeListener{
	@Override
	public void attributeAdded(HttpSessionBindingEvent arg0) {
		System.out.println("添加了");
		
	}
	@Override
	public void attributeRemoved(HttpSessionBindingEvent arg0) {
		System.out.println("移除了");
	}
	@Override
	public void attributeReplaced(HttpSessionBindingEvent arg0) {
		System.out.println("修改了");
	}
}

servlet中:

session.setAttribute("姓名", "张三");
session.setAttribute("姓名", "张三");
session.removeAttribute("姓名");

web.xml

<listener>
	<listener-class>listener.AttributeListener</listener-class>
</listener>

三、监听httpSession里面存值的状态变更

这类接口不用注册
直接让javaBean 实现该这两个接口即可

public class Student implements HttpSessionBindingListener ,HttpSessionActivationListener, Serializable {
	String name;

	public Student(String name) {
		this.name = name;
	}

	@Override
	public void valueBound(HttpSessionBindingEvent arg0) {
		System.out.println("绑定");
	}

	@Override
	public void valueUnbound(HttpSessionBindingEvent arg0) {
		System.out.println("解除");
	}

	@Override
	public void sessionDidActivate(HttpSessionEvent arg0) {
		System.out.println("活化");
	}

	@Override
	public void sessionWillPassivate(HttpSessionEvent arg0) {
		System.out.println("钝化");
	}
}

1、HttpSessionBindingListener

监听对象与 session 绑定和解除绑定 的动作
对象来自需要实现HttpSessionBindingListener的类
在将该对象设置或解除session属性时,触发接口方法

2、HttpSessionActivationListener

用于监听现在session的值 是 钝化 (序列化)还是活化 (反序列化)的动作
session中的值可能会很多, 并且我们有很长一段时间不使用这个内存中的值, 那么可以考虑把session的值可以存储到硬盘上【钝化】,等下一次在使用的时候,在从硬盘上提取出来。 【活化】

  • 钝化 (序列化)把内存中的数据 存储到硬盘上。正常关闭服务器的时候自动钝化。在Tomcat服务器位置:\work\Catalina\localhost\Test\SESSIONS.ser

  • 活化 (反序列化)把硬盘中的数据读取到内存中。重启服务器以后,将session活化;活化要求bean类实现Serializable接口

自定义钝化时间设置:

  • 1.在tomcat里面conf / context.xml里面配置
    对所有的运行在这个服务器的项目生效
    1. 在conf / Catalina / localhost / context.xml配置
      对localhost生效。localhost: 8080
    2. 在自己的web工程项目中的META - INF / context.xml
      只对当前的工程生效。

maxIdleSwap:1分钟不用就钝化
directory:钝化后的那个文件存放的目录位置:
D: \tomcat\apache - tomcat - 7.0.52\work\Catalina\localhost\ListenerDemo\serializable

< Context > 
<Manager className = "org.apache.catalina.session.PersistentManager" maxIdleSwap = "1" >
  <Store className = "org.apache.catalina.session.FileStore" directory = "serializable" / >
</Manager>
</Context > 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值