监听器
监听器
一、概述:监听器就是一个实现了特定接口的Java类,这个Java类用于监听另一个Java类的方法调用或者属性的改变。
当被监听对象发生上述事件后,监听器某个方法将会立即被执行。
二、监听器的术语:
事件源:指的是被监听对象(汽车)
监听器:指的是监听的对象(报警器)
事件源和监听器绑定:在汽车上安装报警器
事件:指的是事件源对象的改变(踹了汽车一脚)----主要功能获得事件源对象。
三、servlet中的监听器:
在Servlet中定义了多种类型的监听器,它们用于监听的事件源分别是ServletContext、HttpSession和
ServletRequest这三个域对象。
Servlet中的监听器的分类:
一类:监听三个域对象的创建和销毁的监听器(三个)
二类:监听三个域对象的属性变更(属性添加、移除、替换)的监听器(三个)
三类:监听HttpSession中JavaBean的状态改变(钝化、活化、绑定、解除绑定)的监听(两个)
一类:
1、servletContextListener监听器的使用:
1、作用:用来监听ServletContext域对象的创建和销毁的监听器。
2、servletContext创建和销毁
1、创建:在服务器启动的时候,为每个web应用创建单独的ServletContext对象。
相应的servletContextListener监听器的方法:
--- contextInitialized(ServletContextEvent sce); 用于监听servletcontext对象的创建;
2、销毁:在服务器关闭的时候,或者项目从web服务器中移除的时候。
相应的servletContextListener监听器的方法:
--- contextDestroyed(ServletContextEvent sce); 用于监听servletcontext对象的销毁;
3、使用方式:
1、自定义一个监听器的类,然后实现ServletContextListener类;
2、重写ServletContextListener类中的方法,见上面的两个方法;
3、在web.xml文件中配置:
<listener>
<listener-class>自定义监听器类的全类名</listener-class>
</listener>
4、当我们的项目启动时,就会创建一个servletcontext对象,相应的就会执行自定义类中的监听方法;
2、HttpSessionListener监听器的使用:
1、作用:用来监听HttpSession对象的创建和销毁。
2、httpsession的创建和销毁:
1、创建:服务器端第一次调用getSession()方法时候。
相应的HttpSessionListener监听器的方法:
--- sessionCreated(HttpSessionEvent se); 用于监听HttpSession对象创建
2、销毁:
1、非正常关闭服务器(正常关闭服务器session会被序列化)。
2、Session过期(默认过期时间30分钟)。
3、手动调用session.invalidate()方法。
相应的HttpSessionListener监听器的方法:
--- sessionDestroyed(HttpSessionEvent se); 监听HttpSession对象销毁
3、使用方式:同上。实现的接口和重写的方法不同。
4、问题:
访问HTML是否创建Session :不会
访问JSP是否创建Session :会
访问Servlet是否创建Session :不会(默认没有调用getSession方法)
3、ServletRequestListener监听器的使用:
1、作用:用户监听ServletRequest对象的创建和销毁
2、ServletRequest对象的创建和销毁:
1、创建:从客户端向服务器发送一次请求,服务器就会创建request对象。
相应的ServletRequestListener监听器的方法:
--- requestInitialized(ServletRequestEvent sre); 监听ServletRequest对象的创建
2、销毁:服务器对这次请求作出了响应之后,request对象就销毁了。
相应的ServletRequestListener监听器的方法:
--- requestDestroyed(ServletRequestEvent sre); 监听ServletRequest对象的销毁
3、使用方式:同上。实现的接口和重写的方法不同。
4、问题:
访问HTML页面是否创建请求对象 :会
访问JSP页面是否创建请求对象 :会
访问Servlet是否创建请求对象 :会
二类:监听三个域对象的属性变更的监听器
1、ServletContextAttributeListener 监听ServletContext对象中的属性变更(属性添加,移除,替换)的监听器
相应的方法:
--- attributeAdded(ServletContextAttributeEvent scab);
--- attributeRemoved(ServletContextAttributeEvent scab);
--- attributeReplaced(ServletContextAttributeEvent scab);
2、HttpSessionAttributeListener 监听HttpSession对象中的属性变更(属性添加,移除,替换)的监听器
相应的方法:
--- attributeAdded(HttpSessionBindingEvent se);
--- attributeRemoved(HttpSessionBindingEvent se);
--- attributeReplaced(HttpSessionBindingEvent se);
3、ServletRequestAttributeListener 监听ServletRequest对象中的属性变更(属性添加,移除,替换)的监听器
相应的方法:
--- attributeAdded(ServletRequestAttributeEvent srae);
--- attributeRemoved(ServletRequestAttributeEvent srae);
--- attributeReplaced(ServletRequestAttributeEvent srae);、
三类:监听HttpSession中Java类状态改变的监听器
1、概述:
保存在Session域中的Java类可以有多种状态:绑定到session中;从session中解除绑定;
随session对象持久化到一个存储设备中(钝化);随session对象从一个存储设备中恢复(活化)。
Servlet对方中定义了两个特殊的监听的接口来帮助Java类了解自己在Session域中的状态:
HttpSessionBindingListener接口
HttpSessionActivationListener接口,
实现这两个接口的类不需要在web.xml中进行配置。
1、HttpSessionBindingListener监听器:
HttpSessionBindingListener接口:用来监听Java类在HttpSession中的绑定和解除绑定的状态的监听器:(绑定必须是java对象 才是绑定)
valueBound(HttpSessionBindingEvent event);绑定监听器
valueUnBound(HttpSessionBindingEvent event);解除绑定监听器
绑定也是用set ,解除绑定用remove
2、HttpSessionActivationListener监听器
监听HttpSession中Java类的钝化和活化监听器。(大白话来说,也就是将保存到session中的数据序列化保存到
本地服务器上,形成一个文件,反之活化,也就是在我们需要用到session中的数据的时候,将保存与本地服务器
上的文件反序列化,保存到session中,以便我们调用。)
sessionDidActivate(HttpSessionEvent se); 活化监听器
sessionWillPassivate(HttpSessionEvent se); 钝化监听器 需要实现序列化接口
测试代码:
配置完成session的序列化和反序列化
Context标签可以配置在:
tomcat/conf/context.xml :所有tomcat下虚拟主机和虚拟目录下的工程都会序列化session
tomcat/conf/Catalina/localhost/context.xml :localhost虚拟主机下的所有项目会序列化session
工程/META-INF/context.xml :当前工程才会序列化session。
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="javaee"/>
</Manager>
</Context>