文章目录
什么是监听器
监听器就是一个实现了特定接口的java类,这个java类用于监听另一个java类的方法调用或者属性的改变。当被监听对象发生上述事件后,监听器某个方法将会立即执行。
监听器的用途
用来监听其他对象的变化,主要应用在图形界面的开发上。
监听器的术语
- 事件源:被监听的对象。(汽车)
- 监听器:监听的对象。(报警器)
- 事件源和监听器绑定:在汽车上安装报警器
- 事件:指的是事件源对象的改变(踹了汽车一脚)——主要功能获得事件源对象。
监听器的执行过程
Servlet中的监听器
- 在Servlet中定义了多种类型的监听器,他们用于监听的事件源分别是ServletContext、HttpSession、ServletRequest这三个域对象。
- Servlet中的监听器的分类
- 一类:监听三个域对象的创建和销毁的监听器(三个);
- 二类:监听三个域对象属性变更的监听器(三个);
- 三类:监听HttpSession中JavaBean的状态的改变(钝化、活化、绑定、解除绑定)的监听器(两个)。
监听三个域对象的创建和销毁的监听器
- ServletContextListener监听器的使用
- 新建一个类实现ServletContextListener接口,重写contextInitialized()(监听ServletContext对象的创建)、contextDestroyed()(监听ServletContext对象的销毁)方法
- 分析:事件源:ServletContext;监听器:新建的监听类;事件源和监听器的绑定:配置:
- ServletContextListener的企业用途:加载框架的配置文件;定时任务调度。
- HttpSessionListener监听器的使用
- 用来监听HttpSession对象的创建和销毁。
- 新建一个类实现HttpSessionListener接口,重写sessionCreated()(监听HttpSession对象的创建)、sessionDestroyed()(监听HttpSession对象的销毁)方法,配置同上。
- 访问html页面和Servlet不会创建Session对象,访问JSP页面会创建,因为JSP在被编译成Servlet时会默认调用getSession()方法,即Session对象被创建了,监听器的sessionCreated()方法执行了。
- Session对象销毁:①过期(默认30分钟);②手动销毁;③服务器非正常关闭(正常关闭时Session会被系列化)。
- ServletRequestListener监听器的使用
- 用来监听ServletRequest对象的创建和销毁。
- 新建一个类实现ServletRequestListener接口,重写requestInitialized()(监听ServletRequest对象的创建)、requuestDestroyed()(监听ServletRequest对象的销毁)方法,配置同上。
- 访问html、JSP、Servlet都会创建ServletRequest对象,即监听器的requestInitialized()方法执行了。
监听三个域对象属性变更的监听器
- ServletContextAttributeListener监听器、HttpSessionAttributeListener监听器、ServletRequestAttributeListener监听器
- 方法:attributeAdded()、attributeRemoved()、attributeReplaced()
监听HttpSession中Java类状态改变的监听器
状态:保存在Session域中的java类可以有多种状态:绑定到Session中;从Session中解除绑定;随Session对象持久化到一个存储设备中(钝化);随session对象从一个存储设备中恢复(活化)。
Servlet规范中定义了两个特殊的监听接口,帮助java类了解自己在Session域中的状态:
- HttpSessionBindingListener接口
- HttpSessionActivationListener接口
实现这两个接口的类不需要在web.xml中进行配置。
- HttpSessionBindingListener监听器
- 监听Java类在HttpSession中的绑定和解除绑定的状态的监听器(javabean setAttribute即绑定,rempoveAttribute即解绑)。
- 方法:valueBound()、valueUnbound()
- 使用方式:javabean直接实现HttpSessionBindingListener接口,重写方法即可。
- HttpSessionActivationListener监听器
监听Java类在HttpSession中的钝化和活化的监听器(序列化与反序列化)。- 方法:sessionDidActivate()、sessionWillPassivate()
- 使用方式:javabean直接实现HttpSessionActivationListener接口,序列化还需实现Serializable接口,重写方法即可。
- 作用:假设一个购物网站同时有30万人访问,那么服务器需要开辟30万个Session空间,假如30分钟内都没有操作,那空间就被浪费掉了。可以通过配置短时间无操作使Session序列化,达到节约资源的目的。
- 配置完成Session的序列化与反序列化
新建context.xml进行配置。Context标签可以配置在:
- tomcat/conf/context.xml:所有tomcat下虚拟主机和虚拟目录下的工程都会序列化session;
- tomcat/config/catalina/localhost/context.xml:localhost虚拟主机下的所有项目会序列化session;
- 工程/META-INF/context.xml:当前工程才会序列化session。