监听器是serlvet的一种,用于web整个环境的监听。包括application,session,request监听。
其最常见的应用是在线人数统计。原理是在系统初始化时建立一个application范围的user链表,然后对session的各种动作进行监听,当增加一个session后,往user链表中添加对象,当用户注销时从链表中删除对象。
监听器代码如下:
package com.listner;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class OnlineDemo implements ServletContextListener,
HttpSessionAttributeListener, HttpSessionListener {
private ServletContext application = null;
public void contextDestroyed(ServletContextEvent sce) {
}
/**
此方法是监听器初始化方法,声明一个user链表
*/
public void contextInitialized(ServletContextEvent sce) {
application = sce.getServletContext() ;
application.setAttribute("userlist", new ArrayList()) ;
}
/**
当一个新的session被赋值是触发该方法
*/
public void attributeAdded(HttpSessionBindingEvent sbe) {
List list = (List)application.getAttribute("userlist") ;
list.add(sbe.getValue()) ;
application.setAttribute("userlist", list) ;
}
public void attributeRemoved(HttpSessionBindingEvent sbe) {
}
public void attributeReplaced(HttpSessionBindingEvent sbe) {
}
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
}
/**
在清除session之前调用,将session中的值从list中删除
*/
public void sessionDestroyed(HttpSessionEvent sbe) {
List list = (List)application.getAttribute("userlist") ;
String value = (String)sbe.getSession().getAttribute("username") ;
list.remove(value) ;
application.setAttribute("userlist", list) ;
}
}