监听器是监听某些对象状态变化的组件。
被监听的对象为三个域对象:ServletRequest,HttpSession和ServletContext,分别可以监听它们自身的创建和销毁和它们对象属性的变化。
监听域对象本身创建和销毁需要实现的接口分别为:ServletRequestListener,HttpSessionListener,ServletContextListener。需要用类实现接口,然后重写方法,其中带有created或initialized的方法名的方法为创建时要执行的方法,带有destroy的方法名的方法为销毁时要执行的方法。另外需要要在工程下的Web.xml中配置该类文件,在<listener>标签中的<listener-class>中写入该类的位置。
监听域对象属性的变化需要实现的接口分别为:ServletRequestAttributeListener,HttpSessionAttributeListener,ServletAttributeContextListener,
需要实现接口然后重写方法,不同之处在于它有三个方法:attributeAdded(),attributeRemoved()和attributeReplaced(),分别对应着添加属性,删除属性与更改属性,在域中setAttribute(),如果键值和之前setAttribute()的相同,则视为修改。当然,它们同样需要在Web.xml中配置路径。
Session域对象感知监听器,它可以监视Session域中对象的状态,并做出回应。它总共可以监视四种状态,即绑定状态,解绑状态,钝化状态,活化状态。分别代表了对象被加入到Session域,对象被从Session域中移除,对象被持久化到了磁盘中,对象从磁盘中回到了Session的内存中。
绑定与解绑需要实现的接口为HttpSessionBindingListener,钝化与活化需要实现的接口为HttpSessionActivationListener和Serializable,可以通过context.xml(在META-INF下创建)来修改钝化时间,默认为1分钟。
下面是个实现监视Session域对象的钝化和活化的小例子:
package com.java.demo02; import java.io.Serializable; import javax.servlet.http.HttpSessionActivationListener; import javax.servlet.http.HttpSessionEvent; public class User implements HttpSessionActivationListener,Serializable{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public User(String name, int age) { super(); this.name = name; this.age = age; } public User() { super(); } //活化 public void sessionDidActivate(HttpSessionEvent arg0) { System.out.println("user活化了"); } //钝化 public void sessionWillPassivate(HttpSessionEvent arg0) { System.out.println("user钝化了"); } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } }