Servlt之事件监听器
一、事件三要素
事件源:要触发的对象(一般是名词,事件发起者,比如qq的启动图标)
事件:触发事件的方式(一般是动词,出发事件,比如双击图标)
事件处理程序:发生了生么事(处理的结果,比如弹出登录界面)
二、什么是监听器
简介:监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性的改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX0smaONTWU9EMnpnT4plMkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jMzkjM0YzMwIjMwATM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
监听器典型案例:监听window窗口事件的监听器
监听器: 主要是用来监听特定对象的创建或销毁、属性的变化的!
是一个实现特定接口的普通java类!
对象:
- 自己创建自己用 (不用监听)
- 别人创建自己用 (需要监听)
Servlet中哪些对象需要监听?
request / session / servletContext
分别对应的是request监听器、session相关监听器、servletContext监听器
监听器(listener)
三、Servlet中的监听器
1.在Servlet规范中定义了多种类型的监听器,但是他们用于监听的时间源分别有三个域对象:
- ServletRequest
- HttpSession
- ServletContext
2.Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型。
- 监听三个域对象创建和销毁的事件监听器
- 监听域对象中属性的增加和删除的事件监听器
- 监听绑定到HttpSession域中的某个对象的状态的事件监听器
四、监听三个域对象的创建和销毁
1.监听ServletContext域对象创建和销毁
servletContext域对象的生命周期:
创建:服务器启动针对每一个web应用创建servletcontext
销毁:服务器关闭前先关闭代表每一个web应用的servletContext
(生命周期最长,在服务器关闭前才会关闭)
ServletContextListener 接口:用于监听 ServletContext对象的创建和销毁事件。
当 ServletContext 对象被创建时,激发contextInitialized (ServletContextEvent sce)方法
当 ServletContext 对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。
2.监听HttpSession域对象创建和销毁
HttpSessoin域对象的生命周期:
创建:用户每一次访问时,服务器创建session
销毁:如果用户的session 30分钟没有使用,服务器就会销毁session,我们在web.xml里面也可以配置session失效时间
(生命周期相对ServletContext较短,如果没有设置销毁的时间默认30分钟关闭)
<!-- session的销毁时间配置 配置的时间是按照分钟来算的不能有小数 (默认是30分钟)-->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
HttpSessionListener接口用于监听HttpSession的创建和销毁
创建一个Session时,sessionCreated(HttpSessionEvent se)方法将会被调用。
销毁一个Session时,sessionDestroyed (HttpSessionEvent se)方法将会被调用。
3.监听HttpRequest域对象创建和销毁
servletRequest域对象的生命周期:
创建:用户每一次访问,都会创建一个reqeust
销毁:当前访问结束,request对象就会销毁
(生命周期较短,当访问一个页面时创建,结束访问时就会销毁)
ServletRequestListener 接口用于监听ServletRequest 对象的创建和销毁。
Request 对象被创建时,监听器的requestInitialized方法将会被调用。
Request对象被销毁时,监听器的requestDestroyed方法将会被调用。
五、监听三个域对象属性变化
Servlet规范定义的监听三个对象属性变更信息事件的监听器接口分别是:
- ServletContextAttributeListener,
- HttpSessionAttributeListener ,
- ServletRequestAttributeListener
这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同。
属性监听器主要有三种方法:
1. attributeAdded方法
当向被监听器对象中增加一个属性时,web容器就调用事件监听器的attributeAdded方法进行相应,这个方法接受一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象
2. attributeRemoved方法
当删除被监听对象中的一个属性时,web容器调用事件监听器的这个方法进行相应的监听
3. attributeReplaced方法
当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的这个方法进行相应的监听
生命周期,和属性监听器需要配置web.xml文件
需要添加:
<listener>
<listener-class>监听器的全类名</listener-class>
</listener>
六、感知Session绑定事件的监听器
保存在 Session 域中的对象可以有多种状态:
- 绑定到 Session 中;
- 从 Session 域中解除绑定;
- 随 Session 对象持久化到一个存储设备中(钝化)
- 随 Session 对象从一个存储设备中恢复(活化)
Servlet 规范中定义了两个特殊的监听器接口来帮助 JavaBean对象了解自己在Session域中的这些状态:
- HttpSessionBindingListener接口
- HttpSessionActivationListener接口
(实现这两个接口的类不需要 web.xml文件中进行注册)
1.实现HttpSessionBindingListener接口
实现了HttpSessionBindingListener接口的JavaBean对象可以感知自己被绑定到Session中和从Session中删除的事件:
绑定对象:
当对象被绑定到 HttpSession 对象中时,web 服务器调用该对象的
当对象从 HttpSession 对象中解除绑定时,web 服务器调用该对象的
void valueUnbound(HttpSessionBindingEvent event)方法
2.实现httpSessionActivationListenter接口:
实现了HttpSessionActivationListener接口的JavaBean对象可以感知自己被活化和钝化的事件
当绑定到HttpSessoion 对象中的对象将要随HttpSession对象被钝化之前,web服务器调用如下方法,
sessionWillPassivate(HttpSessionBindingEvent event)方法;
当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后,web服务器调用该对象的
void sessionDidActive(HttpSessionBindingEvent event)方法
(注意:实现HttpSessionBindingListener接口还必须实现Serializable序列化接口。)
详解请看本博客 HttpSession的四个常用监听器的区别
重点:三类事件概述,八个接口六个Event类别
Servlet 中的 Listener 和 Event:
1. 在 JSP 2.0/Servlet 2.4 中,共有八个 Listener 接口,六个 Event 类别。
ServletContextListener 接口
[ 接口方法 ] contextInitialized() 与 contextDestroyed()
[ 接收事件 ] ServletContextEvent
[ 触发场景 ] 在 Container 加载 Web 应用程序时(例如启动 Container 之后),会呼叫 contextInitialized() ,而当容器移除 Web 应用程序时,会呼叫 contextDestroyed () 方法。
2. ServletContextAttributeListener
[ 接口方法 ] attributeAdded() 、 attributeReplaced() 、 attributeRemoved()
[ 接收事件 ] ServletContextAttributeEvent
[ 触发场景 ] 若有对象加入为 application ( ServletContext )对象的属性,则会呼叫 attributeAdded() ,同理在置换属性与移除属性时,会分别呼叫 attributeReplaced() 、 attributeRemoved() 。
3. HttpSessionListener
[ 接口方法 ] sessionCreated() 与 sessionDestroyed ()
[ 接收事件 ] HttpSessionEvent
[ 触发场景 ] 在 session ( HttpSession )对象建立或被消灭时,会分别呼叫这两个方法。
4. HttpSessionAttributeListener
[ 接口方法 ] attributeAdded() 、 attributeReplaced() 、 attributeRemoved()
[ 接收事件 ] HttpSessionBindingEvent
[ 触发场景 ] 若有对象加入为 session ( HttpSession )对象的属性,则会呼叫 attributeAdded() ,同理在置换属性与移除属性时,会分别呼叫 attributeReplaced() 、 attributeRemoved() 。
5. HttpSessionActivationListener
[ 接口方法 ] sessionDidActivate() 与 sessionWillPassivate()
[ 接收事件 ] HttpSessionEvent
[ 触发场景 ] Activate 与 Passivate 是用于置换对象的动作,当 session 对象为了资源利用或负载平衡等原因而必须暂时储存至硬盘或其它储存器时(透 过对象序列化),所作的动作称之为 Passivate ,而硬盘或储存器上的session 对象重新加载 JVM 时所采的动作称之为 Activate ,所以容 易理解的, sessionDidActivate() 与sessionWillPassivate() 分别于 Activeate 后与将 Passivate 前呼叫。
6. ServletRequestListener
[ 接口方法 ] requestInitialized() 与 requestDestroyed()
[ 接收事件 ] RequestEvent
[ 触发场景 ] 在 request ( HttpServletRequest )对象建立或被消灭时,会分别呼叫这两个方法。
7. ServletRequestAttributeListener
[ 接口方法 ] attributeAdded() 、 attributeReplaced() 、 attributeRemoved()
[ 接收事件 ] HttpSessionBindingEvent
[ 触发场景 ] 若有对象加入为 request ( HttpServletRequest )对象的属性,则会呼叫 attributeAdded() ,同理在置换属性与移除属性时,会分别呼叫 attributeReplaced() 、 attributeRemoved() 。
8. HttpSessionBindingListener
[ 接口方法 ] valueBound() 与 valueUnbound()
[ 接收事件 ] HttpSessionBindingEvent
[ 触发场景 ] 实现 HttpSessionBindingListener 接口的类别,其实例如果被加入至 session ( HttpSession )对象的属性中,则会 呼叫 valueBound() ,如果被从 session ( HttpSession )对象的属性中移除,则会呼叫valueUnbound() ,实现 HttpSessionBindingListener 接口的类别不需在 web.xml 中设定。
具体使用方法:在 web.xml 中添加如下语句:
< listener >
< listener -class > com.servlet .listener .实现Listenter接口的类 < /listener -class >
< /listener >
类 com.servlet .listener . 为你的包名。