复习_监听器

1.WEB监听器简介

JavaWeb中的监听器有3个大类,一共8个监听器.

1.监听域对象的创建和销毁

  • 监听ServletContext的创建和销毁
  • 监听session的创建和销毁
  • 监听request的创建和销毁

2.监听域对象的属性变更

  • 监听ServletContext域对象的属性变更
  • 监听Session域对象的属性变更
  • 监听request域对象的属性变更

所谓的域对象的属性变更,就是向域对象中进行以下操作时
*.setAttribute(name,obj); *.removeAttribute(name);
*.getAttributeNames(); *.getAttribute(name);

3.监听JAVABEAN对象在Sessioin中的状态变更(绑定,解绑,钝化,活化)

  1. 当我们将一个JAVABEAN对象绑定在Session中时,称为JAVABEAN对象被绑定了
    session.setAttribute(“k1“,new User());
  2. 当我们将一个JAVABENA对象从Session中移除时,称为JAVABEAN对象被解绑了.
    session.removeAttribute(“k1“);
  3. 服务器正常关闭的时候,session被序列化到硬盘上了.当session中的对象也被序列化到硬 盘上,这个过程称之为钝化
  4. 当服务器再次启动的时候,将硬盘上的session读取到内存,而且session中的对象也被读
    取到内存,这个过程称之为JAVABEAN对象的活化

1.1 监听域对象的创建和销毁

1.监听ServletContext的创建和销毁

应用场景:将读取配置文件在此处执行

public class MyListener01 implements ServletContextListener {

    static{
        System.out.println("当前的字节码MyListener01.class文件正在被JVM加载");
    }
    public MyListener01() {
        System.out.println("构造函数被执行了");
    }

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        // 如果ServletContext被创建,这个方法会被执行
        System.out.println("ServletContext被创建了");
        // 应用场景: 将读取配置文件在此处执行
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        //如果ServletContext被销毁,这个方法会被执行
        System.out.println("ServletContext被销毁了");
        //回收系统中资源
    }
}

web.xml

<listener>
    <listener-class>cn.itcast.testListener01.MyListener01</listener-class>
</listener>

启动服务器,监听器就被创建了.正常停止服务器或者重新加载项目会执行监听器的销毁方法.
在这里插入图片描述

代码执行流程

  • 我们启动服务器,tomcat就已经将监听器创建好了.
  • 当ServletContext被创建的时候,就可以触发监听器中的contextInitialized方法
  • 当服务器正常停止或者重新加载项目的时候,触发监听器中的contextDestroyed方法

PS:监听器的生命周期和ServletContext几乎一致,都和WEB应用共存亡. (Filter)

应用场景
监听ServletContext创建的方法contextInitialized可以说是只要WEB项目启动就必须执行的一段代码,相当于我们JAVASE中的main函数之前的static代码块,main函数还没有运行呢,static已经开始运行了. 有什么意义呢? 读取配置文件是非常耗时的事情,我们可以将读取配置文件等类似程序放置在监听ServletContext的区域来执行
监听ServletContext销毁的方法没有太大意义,可以将WEB中我们声明过的资源在这里统一进行回收,但是大家记住:WEB项目是不应该被停止的.例如:淘宝的服务器停一下?百度的服务器停一下?要求级别很高的项目,及时是发布新功能,都要求是热部署的.

2.监听Session的创建和销毁

public class MyListener02 implements HttpSessionListener {

    static{
        System.out.println("当前的字节码MyListener02.class文件正在被JVM加载");
    }
    public MyListener02() {
        System.out.println("MyListener02构造函数被执行了");
    }


    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("session被创建了");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("session被销毁了");
    }
}
<listener>
    <listener-class>cn.itcast.testListener01.MyListener02</listener-class>
 </listener>

问1:访问Servlet时会不会创建session对象?
访问servlet首次遇到request.getSession(),才会创建session

问2:访问JSP时会不会创建session对象?
session是jsp的内建对象,所当我们在jsp里面用session的时候不需要创建,但是session不是servlet的内建对象,你在servlet用session的时候需要创建一个session。

问题3?访问html时会不会创建session对象?
不会

session的生命周期?
何时创建? 访问服务端的动态资源首次遇到request.getSession();
何时销毁?
1_session.invalidate();
2_session超时
3_非正常关闭服务器

应用场景
通过监听session的创建和销毁我们可以粗略的估计某段时间内,访问web的人数,如果有需要,我们可以通过监听session的销毁:我们可以将session中的数据保存下来

3.监听Request的创建和销毁

public class MyListener03 implements ServletRequestListener {

    static{
        System.out.println("当前的字节码MyListener03.class文件正在被JVM加载");
    }
    public MyListener03() {
        System.out.println("MyListener03构造函数被执行了");
    }


    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        System.out.println("request被销毁了");
    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("request被创建了");
    }
}

web.xml

<listener>
    <listener-class>cn.itcast.listenr.MyListener03</listener-class>
</listener>

问题1?访问servlet会不会创建request

问题2?访问jsp会不会创建request

问题3?访问html会不会创建requests

应用场景:
通过测试request的创建,可以粗略的统计系统的瞬间被访问的情况,为系统压力测试做一个参考
因为我们再监听request创建时,是可以获取到request对象的.当然也可以获取到request中的所有内容.我们可以通过request打印客户请求的路径,看那些资源是被客户频繁访问的,为系统后期性能提升做一个辅助参考,观察用户行为

1.2 监听域对象的属性变更

1.监听ServletContext域对象属性变更

public class MyListener04 implements ServletContextAttributeListener {

    public void attributeAdded(ServletContextAttributeEvent scab)  { 
    	System.out.println("serlvetContext的属性被添加...");
    }
    public void attributeReplaced(ServletContextAttributeEvent scab)  { 
    	System.out.println("serlvetContext的属性被替换...");
    }
    public void attributeRemoved(ServletContextAttributeEvent scab)  { 
    	System.out.println("serlvetContext的属性被移除...");
    }
}

2.监听Session域对象的属性变更

public class MyListener05 implements HttpSessionAttributeListener {
    public void attributeRemoved(HttpSessionBindingEvent se)  {
    	System.out.println("session的属性被移除了...");
    }
    public void attributeAdded(HttpSessionBindingEvent se)  { 
    	System.out.println("session的属性被移添加...");
    }
    public void attributeReplaced(HttpSessionBindingEvent se)  { 
    	System.out.println("session的属性被替换了...");
    }
}

3.监听request域对象的属性变更

public class MyListener06 implements ServletRequestAttributeListener {
    public void attributeAdded(ServletRequestAttributeEvent srae)  { 
    	System.out.println("request的属性被添加了");
    }
    public void attributeRemoved(ServletRequestAttributeEvent srae)  { 
    	System.out.println("request的属性被移除了");
    }
    public void attributeReplaced(ServletRequestAttributeEvent srae)  { 
    	System.out.println("request的属性被替换了");
    }
}

1.3 监听JAVABEAN对象在session中的状态变更
public class Stu implements HttpSessionBindingListener {
    public void valueUnbound(HttpSessionBindingEvent event)  { 
    	System.out.println("javabean对象被解绑了");
    }
    public void valueBound(HttpSessionBindingEvent event)  { 
    	System.out.println("javabean对象被绑定了");
    }
}

public class Tea implements HttpSessionActivationListener , Serializable{
	private String name="";
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public void sessionWillPassivate(HttpSessionEvent se) {
		System.out.println("JAVABEN对象被钝化了了");
	}
	@Override
	public void sessionDidActivate(HttpSessionEvent se) {
		System.out.println("JAVABEN对象被活化了");
	}
}

应用场景:
通过监听session的中JAVABean对象的绑定和解绑,我们可以观察到用户在和WEB系统交互的过程中,频繁的将那些对象放入到了session中
通过监听JAVABEAN对象在session中的钝化和活化,用户放在session中的数据如果被序列化到硬盘或者从硬盘上加载JAVABEAN对象,知道用户和服务端的一个交互情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值