监听器:在java中,是一个实现了特定接口的java类,用来监听另一个java类的方法调用或属性的变更。当被监听的对象发生了上述的事件后,监听器的某个方法就会立即执行
生活中:类似于汽车上的报警器
监听器的相关术语
1、事件源:被监听的对象(汽车)
2、监听器:正在执行监听的对象(报警器)
3、绑定监听器:在事件源上绑定监听器(在汽车上安装报警器)
4、事件:事件源发生改变,被监听器监听到 例如:脚踹汽车、手拍汽车盖
** 在程序中,事件对象,封装了事件源对象, 简单讲,就是在事件对象(XxxxxEvent)中,可以得到触法改事件的事件源对象
Servlet的监听器分为以下三类:
一类: 监听三个域对象的创建与销毁的监听器
request, session,servletContext
1、监听servletContext, 我们发现该对象随着服务器的启动而创建,随着服务器的关闭而销毁,正常关闭服务器,才会触发destroy方法
2、监听session,
2.1: 在访问Servlet时,会不会创建session对象呢?
servlet自身不会创建session,但是可以手动调用请求的getSession()方法来创建session对象
2.2: 在访问JSP时,会不会创建session对象呢? 一定会创建的
2.3: 在访问HTML时,会不会创建session对象呢? 一定不会创建
session对象的创建,是通过请求对象调用getSession()方法,从而创建的
session对象什么情况下才会销毁呢?
a、手动调用invalidate方法,销毁session对象
b、默认情况下,等待30分后,session过期自动销毁
c、非正常关闭服务器(因为正常关闭服务器,会让HttpSession对象自动钝化到硬盘);
3、监听request对象都创建和销毁:
request对象什么时候被创建呢?
1、访问servlet? 会
2、访问jsp? 会
3、访问html? 会,但是必须是访问服务器路径,而不是双击打开
二类: 监听三个域对象的属性变更的监听器(属性的添加、修改、删除) 即,调用setAttribute,removeAttribute
三类: 监听HttpSession对象中javabean状态的改变,(绑定与解绑,钝化与活化)
主要监听Session对象
1、监听的是javabean的绑定与解绑,而不监听String 或其他基本类型
2、钝化与活化
在使用集合装载javabean,钝化时,由于User类没有实现序列化接口,就不允许该类的对象序列化到本地,所以报以下异常
java.io.NotSerializableException: com.qs.javabean.User
因为第三类监听器,需要javabean来实现,并且不需要配置到web.xml中
钝化是解决session自动销毁的问题,因为作为会话级别对象,不能轻易的被销毁,这样会导致有效访问数据的丢失,客户与公司双方体验都很差
所有为了更好的互联网服务体验,我们建议将所有的javabean进行序列化,当用户退出浏览时,我们设置服务器中的session对象,在用户N分钟内,
没有继续访问公司的网站,就自动钝化到服务端的磁盘中,进行保存,直到下次客户再次访问本网站后,服务器会自动加载钝化的session及其当中的数据
,这个过程叫作活化,用户可以继续访问之前的数据
刚才我们将JSESSIONID所在的cookie的过期时间进行延长,即便客户关闭浏览器,在过期时间内打开,也不会丢失JSESSIONID,此时我们正常关闭服务器,
session继续域中的数据,同步被序列化到服务器的磁盘中,再次启动服务器之后,下次客户在cookie过期时间内打开浏览器,访问我们的服务器,
数据是不会丢失的,会继续保存在session中,但是此时还有个问题,而且很严重的问题,一般来讲,服务器不能随便关闭!但是tomcat默认情况下30分钟会销毁
session,这也是不好的操作,那么我们可以添加一个配置,用户在指定时间内,没有继续访问我们的服务器,我们就让sesion对象自动钝化到服务器的硬盘中,
这个配置可以添加在一下三个地方:
1、tomcat/conf/context.xml :代表所有的项目和所有的虚拟路径都按照这个配置来执行钝化
2、tomcat/conf/Catalina/localhost/context.xml : 代表所有的localhost主机下的项目都可以按照这个配置来执行钝化
3、在当前项目下的META-INF/context.xml : 代表只有当前工程按照这个配置进行钝化