先看看关于Listener的相关API:
我选择了使用 HttpSessionAttributeListener。这是个接口提供了3个方法
Method Summary | |
void |
attributeAdded(HttpSessionBindingEventse) Notification that an attribute has been added to a session. |
void |
attributeRemoved(HttpSessionBindingEventse) Notification that an attribute has been removed from a session. |
void |
attributeReplaced(HttpSessionBindingEventse) Notification that an attribute has been replaced in a session. |
那么我具体实现是,当用户向session中添加属性时。一般是网站用户成功登陆后。attributeAdded (HttpSessionBindingEvent se)将其捕获,并且使用se.getSession()获得其session对象。(因为我做的是显示用户的在线人数,必须是注册用户所以用 HttpSessionAttributeListener中的attributeAdded捕获,而没有用HttpSessionListener在创 建session时捕获。因为可能是没有注册的用户访问网站)
捕获后,我将session中的属性取出。这个属性表示的是用户的id No.并且保存到Vector中。这样,一旦又用户成功登陆,并把用户信息保存到session中我就可以将其捕获并把id No放到Vector变量中。
这个监听器的代码如下:
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class SessionListener implements HttpSessionListener,HttpSessionAttributeListener{
private static int activesessions = 0;
private static Vector idnoC=new Vector(); //用户的idno集合
public void sessionCreated(HttpSessionEvent sess) {
System.out.println("sessionCreated()\n");
}
public void sessionDestroyed(HttpSessionEvent sess) {
System.out.println("sessionDestroyed()\n");
}
/**
* 往session中增加属性
*/
public void attributeAdded(HttpSessionBindingEvent arg0) {
int idno=0;
if(arg0.getName().equals("idno")){
idno=(Integer)arg0.getValue();
addNewVector(idno);
System.out.println("attributeAdded("+idno+")\n");
}
}
public void attributeRemoved(HttpSessionBindingEvent arg0) {
int idno=0;
if(arg0.getName().equals("idno")){
idno=(Integer)arg0.getValue();
removeVector(idno);
System.out.println("attributeRemoved("+idno+")\n");
}
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
int idno=0,orgidno=0;
if(arg0.getName().equals("idno")){
orgidno=(Integer)arg0.getValue();
idno=(Integer)arg0.getSession().getAttribute("idno");
modifyVector(orgidno,idno);
System.out.println("attributeReplaced("+orgidno+","+idno+")\n");
}
}
/**
* 将登陆人员的idno加入到vector中
* @param idno 登陆人员的idno
*/
private void addNewVector(int idno){
if(idnoC.indexOf(new Integer(idno))<0)
idnoC.add(new Integer(idno));
}
/**
* 登陆人员改变时改变vector中的对应idno
* @param orgidno原先的idno
* @param newidno修改后的idno
*/
private void modifyVector(int orgidno,int newidno){
int st=idnoC.indexOf(new Integer(orgidno));
if(st>0){
idnoC.removeElement(new Integer(orgidno));
}
addNewVector(newidno);
}
/**
* 登陆人员session作废时从vector中移除idno
* @param idno员工idno
*/
private void removeVector(int idno){
idnoC.removeElement(new Integer(idno));
}
public static int getactivesessions() {
return idnoC.size();
}
public static Vector<Integer> getIdnoCVector(){
return idnoC;
}
}
在web.xml中还需要配置监听器
加入这一段
<!-- LISTENER -->
<listener>
<listener-class>
XX.XXXX.XXX.SessionListener <!--类的路径-->
</listener-class>
</listener>
那么SessionListener类会在tomcat启动时创建对象。并一直存在,其中声明的Vector相当于全局变量。只要在需要显示现在用户的页面里读取Vector里的内容即可以知道。在先用户的id No.了,其他统计人数就可以直接用Vector里的.size()属性得到