9.Listener

Listener

8个 

三种类型  
	针对三个作用域的创建和销毁
	针对三个作用域的值改变 【添加 | 替换 | 移除】
	针对session中的值 【钝化 活化】 , 【绑定  解绑】

钝化 ( 序列化 )
内存中的对象存储到硬盘

	超时失效。 session销毁了。 

非正常关闭服务器,钝化  。 正常关闭服务器 销毁

设置了session,多久时间。 context.xml


活化 (反序列化)
	从硬盘里面读取到内存

ServletContextListner : 应用被部署的时候, 服务器加载这个项目的时候,做一些初始化工作, 任务调度。
HttpSessionListener : 统计在线人数
HttpSessionActivationListener : 钝化活化处理

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

监听器

  • 能做什么事?

监听某一个事件的发生。 状态的改变。

  • 监听器的内部机制

其实就是接口回调.

接口回调
  • 需求:

A在执行循环,当循环到5的时候, 通知B。

事先先把一个对象传递给 A , 当A 执行到5的时候,通过这个对象,来调用B中的方法。 但是注意,不是直接传递B的实例,而是传递一个接口的实例过去。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cAs2Nvvv-1570949447213)(en-resource://database/19398:1)]

package com.itheima.test;

/**
 * 1988年写的
 * @author xiaomi
 *
 */
public class A {

	/**
	 * 这是以前的java基础使用的代码。
	 * 但是假设这个A这个类是早在上个世纪80年 就写好的A类, 这个方法 内部是不能直接new B()
	 * 1. 不能直接new B
	 * 
	 * 2. 页不能传递B的实例进来。
	 * 
	 * 所以在定义这个方法的时候,不管未来写的是B 类, 还是C类,还是D类, 人家为了通用。
	 * 所以定义了一种接口,只要让未来的那些类,实现这个接口。 然后这个方法的参数写 接口类型即可。
	 */

	/*public void print(){
		for (int i = 0; i < 10; i++) {
			System.out.println("循环到了--"+i);
			if(i == 5){
				System.out.println("循环到了5了,该通知B 了。");
				B b = new B();
				b.printFive();
			}
		}
	}*/
	
	public void print(PrintListener listener){
		for (int i = 0; i < 10; i++) {
			System.out.println("我在1988年就开始打印这个语句了。。循环到了--"+i);
			if(i == 5){
				System.out.println("循环到了5了,该通知B 了。");
				listener.print();
				/*B b = new B();
				b.printFive();*/
			}
		}
	}
}

package com.itheima.test;

/**
 * 2018
 * @author xiaomi
 *
 */
public class B  implements PrintListener{

	/*public void printFive(){
		System.out.println("A已经循环到了5, 所以B的这个方法将被调用");
	}*/

	@Override
	public void print() {
		System.out.println("2018年。。。A已经循环到了5, 所以B的这个方法将被调用");
	}
}

package com.itheima.test;

/**
 * 1988年写
 * 打印监听器
 * @author xiaomi
 *
 */
public interface PrintListener {

	/**
	 * 一旦出现了某一种事件, 达到了某一个状态,就调用这个方法。
	 */
	void print();
}

package com.itheima.test;

public class Test {

	public static void main(String[] args) {
		A a = new A();
		
		//这是多态的体现,
		
		/*
		 * 这个方法咋i1988年就定义了要收 printlistener 这个接口的类型。
		 * 在2018年的时候有一个类 B 实现了这个接口printlistener ,
		 * 所以现在可以传递B进来
		 */
		a.print(new B());
	}
}

###Web监听器

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

  1. 定义一个类,实现接口

  2. 注册 | 配置监听器

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

request —httpServletRequest
session —httpSession
aapplication — ServletContext

  1. ServletContextListener

servletcontext创建:

  1. 启动服务器的时候

    servletContext销毁:

  2. 关闭服务器. 从服务器移除项目

    1. ServletRequestListener

    request创建:

    访问服务器上的任意资源都会有请求出现。

访问 html: 会
访问 jsp: 会
访问 servlet : 会

request销毁:

服务器已经对这次请求作出了响应。


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

			  
			  <listener>
			  	<listener-class>com.itheima.listener.MyRequestListener</listener-class>
			  </listener>

  1. HttpSessionListener

    session的创建
    只要调用getSession

     html:		不会
     	jsp:		会	  getSession();
     	servlet: 	会
    
     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了");
				}
			}

作用:

ServletContextListener

	利用它来,在servletcontext创建的时候, 
		1. 完成自己想要的初始化工作

		2. 执行自定义任务调度。 执行某一个任务。 Timer  

HttpSessionListener

	统计在线人数.

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

监听ServletContext 域中的属性改变 , 添加 | 替换 | 移除

ServletRequestAttributeListener

        监听ServletRequest 域中的属性改变 , 添加 | 替换 | 移除

HttpSessionAttributeListener

        监听HttpSession 域中的属性改变 , 添加 | 替换 | 移除

用法一样:

        1. 定义一个了类,实现对应的接口





        2. 在web.xml中使用listener 注册



        3. 对三个域分别作出 添加 | 替换 | 移除的动作。 即可看出变化

可以监听在作用域中值 添加 | 替换 | 移除的动作。

  • servletContext — ServletContextAttributeListener

  • request — ServletRequestAttributeListener

  • session — HttpSessionAttributeListener

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

这一类监听器与前两种监听器不太一样。这种监听器无需在web.xml中配置, 只需要让javaBean实现对应的接口即可

这一类监听器不用注册。

  • HttpSessionBindingListener

监听对象与session 绑定和解除绑定 的动作

1. 让javaBean 实现该接口即可

		@Override
		public void valueBound(HttpSessionBindingEvent event) {
			System.out.println("对象被绑定进来了");
		}
	
		@Override
		public void valueUnbound(HttpSessionBindingEvent event) {
			System.out.println("对象被解除绑定");
		}
  • HttpSessionActivationListener

用于监听现在session的值 是 钝化 (序列化)还是活化 (反序列化)的动作

  • 钝化 (序列化)

把内存中的数据存储到硬盘上

  • 活化 (反序列化)

把硬盘中的数据读取到内存中。

  • session的钝化活化的用意何在

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

  • 如何让session的在一定时间内钝化.

Session中通常可以存数据的,那么我们可以把一些长时间不使用的数据给序列化到硬盘上
,等再使用的时候,可以从硬盘反序列化回来。这样节省了不少内存空间。

如果想做到这个事情,我们可以通过配置,让服务器帮我们去完成这项工作。 配置主要有以下三种方式:

做配置即可

	1. 在tomcat里面 conf/context.xml 里面配置

			对所有的运行在这个服务器的项目生效  

	2. 在conf/Catalina/localhost/context.xml 配置

			对 localhost生效。  localhost:8080

	3. 在自己的web工程项目中的 META-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、付费专栏及课程。

余额充值