Listener 监听器学习笔记

本文详细介绍了Java Web监听器的概念,包括如何创建监听器以及三种类型的监听器:监听域对象的创建和销毁、监听域对象属性的变更以及监听session中的特殊JavaBean状态的改变。通过具体示例展示了各种监听器的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

监听器 Listener

1. 监听器简述

在实际生活着,我们很多商场有摄像头,监视着客户的一举一动。如果客户有违法行为,商场可以采取相应的措施。同样,在我们的java程序中,有时也需要监视某些事情,一旦被监视的对象发生相应的变化,我们应该采取相应的操作。这就需要用到java中的监听器。
web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如:ServletContext,HttpSession,ServletRequest的创建和销毁等。可以在某些动作前后增加处理,实现监控。

2.监听器创建

2.1 方法1:新建Listener

在这里插入图片描述
在这里插入图片描述

2.2 方法2:新建class,实现需要的监听器接口,并实现方法。手动添加@WebListener注解

3. 常用监听器

在这里插入图片描述

3.1 第一类:监听 “域对象” 创建 和 销毁

3.1.1 ServletContextListener

监听ServletContext域对象的创建和销毁:
创建:服务器开启
销毁:服务器关闭

@WebListener
public class MyServletContextListener implements ServletContextListener {

    public void contextDestroyed(ServletContextEvent sce)  { 
         // contextServlet域对象 销毁
    	System.out.println("ContextServlet对象销毁了。。。");
    }

    public void contextInitialized(ServletContextEvent sce)  { 
         // contextServlet域对象 初始化
    	System.out.println("ContextServlet对象初始化。。。");
    }
}
3.1.2 HttpSessionListener

监听HttpSession域对象的创建和销毁
创建:第一次执行req.getSession()
销毁: 执行 session.invalidate();或过期后自动销毁。

@WebListener
public class MyHttpSessionListener implements HttpSessionListener{
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		// TODO Auto-generated method stub
		System.out.println("某个Session对象被创建了。。。");
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		// TODO Auto-generated method stub
		System.out.println("某个Session对象销毁了。。。");
	}
}
测试:servlet代码:
HttpSession session = request.getSession();
session.invalidate();
3.1.3 ServletRequestListener

监听HttpServeltRequest的创建和销毁:
创建:请求过来时
销毁:响应结束后

@WebListener
public class MyRequestListener implements ServletRequestListener {
    public void requestDestroyed(ServletRequestEvent sre)  { 
       System.out.println("request对象被销毁了");
    }
    public void requestInitialized(ServletRequestEvent sre)  { 
    	 System.out.println("request对象被创建了");
    }
}

3.2 第二类:监听 “域对象属性” 创建、修改、删除

3.2.1 ServletContextAttributeListener

监听ServletContext域对象中的属性变更

@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener{
	@Override
	public void attributeAdded(ServletContextAttributeEvent scae) {
		System.out.println("ServletContext域对象中属性 添加");
	}
	@Override
	public void attributeRemoved(ServletContextAttributeEvent scae) {
		System.out.println("ServletContext域对象中属性 删除");
	}
	@Override
	public void attributeReplaced(ServletContextAttributeEvent scae) {
		System.out.println("ServletContext域对象中属性 修改");
	}
}
	测试:servlet代码:
		ServletContext context = req.getServletContext();
		context.setAttribute("NAME", "jack");// context添加属性
		context.setAttribute("NAME", "tom");// context修改属性
		context.removeAttribute("NAME");// context删除属性
3.2.2 HttpSessionAttributeListener

监听HttpSession域对象中的属性变更

@WebListener
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
	public void attributeAdded(HttpSessionBindingEvent se) {
		System.out.println("HttpSession属性 添加");
	}

	public void attributeRemoved(HttpSessionBindingEvent se) {
		System.out.println("HttpSession属性 删除");
	}

	public void attributeReplaced(HttpSessionBindingEvent se) {
		System.out.println("HttpSession属性 修改");
	}
}

	测试:Servlet代码
		HttpSession session = req.getSession();// 创建
		session.setAttribute("NAME", "jack");// session添加属性
		session.setAttribute("NAME", "tom");// session修改属性
		session.removeAttribute("NAME");// session删除属性
		session.invalidate();//销毁
3.2.3 ServletRequestAttributeListener

监听HttpServletRequest域对象中的属性变更

@WebListener
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {

	public void attributeRemoved(ServletRequestAttributeEvent srae) {
		System.out.println("HttpServletRequest域对象属性 -删除");
	}

	public void attributeAdded(ServletRequestAttributeEvent srae) {
		System.out.println("HttpServletRequest域对象属性 -添加");
	}

	public void attributeReplaced(ServletRequestAttributeEvent srae) {
		System.out.println("HttpServletRequest域对象属性 -修改");
	}
}

	测试:servlet代码
		req.setAttribute("NAME", "jack");
		req.setAttribute("NAME", "tom");
		req.removeAttribute("NAME");

3.3 第三类:监听session中的特殊javaBean状态的改变

注意:这类监听器:在JavaBean中实现监听器接口,并实现方法。不需要@WebListener注解
3.3.1 HttpSessionBindingListener

监听Session域对象属性中 JavaBean的绑定和解绑。

  • 绑定:将JavaBean对象添加到Session域对象属性中
  • 解绑:将绑定JavaBean的域对象属性,修改成非本Bean数据,或删除该属性。
public class Person implements HttpSessionBindingListener{
	private String name;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void valueBound(HttpSessionBindingEvent event) {
		System.out.println("Person对象被【绑定】到了Session域对象属性中");
	}

	@Override
	public void valueUnbound(HttpSessionBindingEvent event) {
		System.out.println("Person对象从Session域对象属性中 【解绑】");
	}
}

	测试:servlet代码
		HttpSession session = req.getSession();// 创建
		session.setAttribute("Person", new Person());// session添加属性
		session.setAttribute("Person", "tom");// session修改属性; 修改和删除都算解绑
		session.removeAttribute("Person");// session删除属性
		session.invalidate();//销毁

3.3.2 HttpSessionActivationListener

监听Session域中JavaBean的活化和钝化
前提:必须将JavaBean保存到Session域对象属性中。且JavaBean必须实现可序列化接口Serializable

  • 钝化:序列化(将内存中的数据保存在硬盘上):将session对象序列化到tomcat/work目录中 的SESSION.ser文件。正常关闭服务器。

  • 活化:反序列化(将硬盘上的数据加载到内存中):将SESSION.ser文件反序列化成Session对象。开启服务器,且session没过期

public class Dog implements Serializable,HttpSessionActivationListener{
	private String dname;
	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	@Override
	public void sessionWillPassivate(HttpSessionEvent se) {
		System.out.println("Dog对象钝化了:"+getDname());
	}
	public void sessionDidActivate(HttpSessionEvent se) {
		System.out.println("Dog对象活化了:"+getDname());
	}
}

测试:servlet代码。然后关闭服务器,再开启,看日志
		HttpSession session = req.getSession();// 创建
		Dog dog = new Dog();
		dog.setDname("小白");
		session.setAttribute("dog", dog);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值