servlet监听器主要是实现ervletContext,HttpSession,ServletRequest三个域对象的监听。只要在web.xml中使用了<listener>标签进行说明,web容器就自动的把配置的监听器注册到事件源上了
监听器对象主要分一下三部分
第一、是监听三个域对象的创建和销毁。
ServletContextListener接口,HttpSessionListener接口,ServletRequestListener接口分别用来监听ServletContext对象,HttpSession对象,ServletRequest对象的创建和销毁。当这些对象创建或销毁时,对应的监听器中各自有争对创建和销毁的方法进行监听。
第二、是监听三个域对象属性的变化
Servlet规范定义了监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。
这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener ServletRequestAttributeListener
这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同。
第三、
JavaBean 对象本身如果实现了HttpSessionBindingListener,HttpSessionActivationListener接口就可以感知自己被绑定到session中,从session删除和随session对象持久化到存储设备中,从存储设备中恢复。而且不用再web.xml中注册监听器。
要获得以上的功能,监听器必须实现以下3个接口:
HttpSessionListener
ServletContextListener
ServletContextAttributeListener
import javax.servlet.http.*;
import javax.servlet.*;
public class OnLineCountListener implements HttpSessionListener,ServletContextListener,ServletContextAttributeListener
{
private int count;
private ServletContext context = null;
public OnLineCountListener()
{
count=0;
}
//创建一个session时激发
public void sessionCreated(HttpSessionEvent se)
{
count++;
setContext(se);
}
//当一个session失效时激发
public void sessionDestroyed(HttpSessionEvent se)
{
count--;
setContext(se);
}
//设置context的属性,它将激发attributeReplaced或attributeAdded方法
public void setContext(HttpSessionEvent se)
{
se.getSession().getServletContext().setAttribute("onLine",new Integer(count));
}
//增加一个新的属性时激发
public void attributeAdded(ServletContextAttributeEvent event) {
log("attributeAdded('" + event.getName() + "', '" +event.getValue() + "')");
}
//删除一个新的属性时激发
public void attributeRemoved(ServletContextAttributeEvent event) {
log("attributeRemoved('" + event.getName() + "', '" +event.getValue() + "')");
}
//属性被替代时激发
public void attributeReplaced(ServletContextAttributeEvent event) {
log("attributeReplaced('" + event.getName() + "', '" +event.getValue() + "')");
}
//context删除时激发
public void contextDestroyed(ServletContextEvent event) {
log("contextDestroyed()");
this.context = null;
}
//context初始化时激发
public void contextInitialized(ServletContextEvent event) {
this.context = event.getServletContext();
log("contextInitialized()");
}
private void log(String message) {
System.out.println("ContextListener: " + message);
}
}