监听器
监听器
一. 监听器接口和注册
监听器接口分类:
- ServletContext
- HttpSession
- ServletRequest
监听器接口主要在javax.servlet和javax.servlet.http的包中。有以下这些接口:
- javax.servlet.ServletContextListener:它能够响应ServletContext声明周期事件,它提供了ServletContext创建之后和ServletContext关闭之前的会被调用的方法。
- javax.servlet.ServletContextAttributeListener:响应ServletContext范围内的属性添加、删除、替换事件。
- javax.servlet.http.HttpSessionListener:响应HttpSession创建、超时和失效时间。
- javax.servlet.http.HttpSessionAttributeListener:响应HttpSession范围内的属性添加、删除、替换事件
- javax.servlet.http.HttpSessionActivationListener:一个HttpSession激活或者失效时被调用。
- javax.servlet.http.HttpSessionBindingListener:可以实现这个接口来保存HttpSession范围的属性。当有属性从HttpSession添加或删除时,HttpSessionBindingListener接口能够做出响应。
- javax.servlet.ServletRequestListener:响应一个ServletRequest的创建或删除。
- javax.servlet.ServletRequestAttributeListener:响应ServletRequest范围的属性值添加、删除、修改事件。
- javax.servlet.AsyncListener:一个用于异步操作的监听器(此章不详细讲解)。
两种注册监听器的方法:
- 一是使用WebListener注解,例如:
@WebListener
public class ListenerClass implements ListenerInterface{
}
- 二是在部署描述文档中增加一个listener元素
<listener>
<listener-class>fully-qualified listener class</listener-class>
</listener>
二. ServletContext监听器
2.1 ServletContextListener
ServletContextListener能对ServletContext的创建和销毁做出响应。当ServletContext初始化时,容器会调用所有注册的ServletContextListener的contextInitialized方法。
void contextInitialized(ServletContextEvent event);
当ServletContext将要销毁时,容器会调用所有注册的ServletContextListener的contextDestroyed方法。
void contextDestroyed(ServletContextEvent event);
contextInitialized方法和contextDestroyed方法中获取ServletContext的方法:
event.getServletContext();
2.2 ServletContextAttributeListener监听器
当一个ServletContext范围的属性被添加、删除或者替换时,ServletContextAttributeListener接口的实现类会接受消息。接口中定义了如下方法:
void attributeAdded(ServletContextAttributeEvent event);
void attributeRemoved(ServletContextAttributeEvent event);
void attributeReplaced(ServletContextAttributeEvent event);
获取属性名称和值
event.getName();
event.getValue();
三. Session监听器
3.1 HttpSessionListener
当一个HttpSesion创建或者销毁时,容器都会通知所有的HttpSessionListener监听器,HttpSessionListener接口方法:
void sessionCreated(HttpSessionEvent event);
void sessionDestroyed(HttpSessionEvent event);
获取HttpSession的方法:
event.getSession();
3.2 HttpSessionAttributeListener
HttpSessionAttributeListener接口中方法:
void attributeAdded(HttpSessionAttributeEvent event);
void attributeRemoved(HttpSessionAttributeEvent event);
void attributeReplaced(HttpSessionAttributeEvent event);
event.getName();
event.getValue();
3.3 HttpSessionActivationListener
在分布式环境下,会用多个容器来进行负载均衡,有可能需要将session保存起来,在容器之间传递。例如当一个容器内存不足时,会把很少用到的对象转存到其他容器上。这时候,容器就会通知所有HttpSessionActivationListener接口的实现类。
HttpSessionActivationListener接口有两个方法:
//当HttpSession被转移到其它容器之后调用
void sessionDidActivate(HttpSessionEvent event);
//当一个HttpSession将要失效时调用
void sessionWillPassivate(HttpSessionEvent event);
3.4 HttpSessionBindingListener
当有属性绑定或者解绑到HttpSession上时,HttpSessionBindingListener监听器会被调用。
四. ServletRequest监听器
4.1 ServletRequestListener
ServletRequestListener会对ServletRequest的创建和销毁事件进行响应。容器会通过一个池来存放并重复利用多个ServletRequest,ServletRequest的创建时从容器池里被分配出来的时刻开始,而它的销毁时刻是放回容器池里的时间。
ServletRequestListener接口有两个方法:
//当一个ServletRequest创建时调用
void requestInitialized(ServletRequestEvent event);
//当ServletRequest销毁时调用
void requestDestroyed(ServletRequestEvent event);
ServletRequestEvent 接口的两个方法;
event.getServletRequest();
event.getServletContext();
4.2 ServletRequestAttributeListener
ServletRequestAttributeListener接口中方法:
void attributeAdded(ServletRequestAttributeEvent event);
void attributeRemoved(ServletRequestAttributeEvent event);
void attributeReplaced(ServletRequestAttributeEvent event);
event.getName();
event.getValue();
五. 小结
主要明白了Servlet API提供的多个监听器类型。这些监听器可以分成三类:application范围、session范围和request范围。监听器的使用很简单,可以通过两种方式注册监听器:在实现类上使用@WebListener注解或者在部署描述文件中增加listener元素。
相关阅读
package swing;import java.awt.Container;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import ja