J2EE中统计当前在线人数——HttpSessionBindingListener和HttpSessionListener

项目研发问题收集 专栏收录该内容
30 篇文章 0 订阅

javax.servlet.http.HttpSession 是很常用的,当浏览网站,不论是否登陆,都会产生1个session,它记录了和浏览者相关的数据。

 


一 session的2个监听器接口

 

1 javax.servlet.http.HttpSessionBindingListener;

实现这个接口的类,每当被存放到session或从session中移除都会出发接口中相应的方法,从而实现监听的效果。

 

2 javax.servlet.http.HttpSessionListener;

实现这个接口的类,本身就是1个监听器,每当有session生成或消亡时,都触发接口中相应的方法,从而实现监听器的效果;

HttpSessionListener的实现类本身就是一个监听器,要使用它需要在web.xml中启动这个监听器,例如

<listener>  
 <listener-class>packname.classname</listener-class>  
</listener>  


3 这2个监听器是有区别的

前者的触发取决于session中加入的属性。

后者的触发取决于session本身的产生和消亡。


4 与和上述之类似的还有对ServletContext的监听和对Request监听。

 

 

二 应用——当前在线人数列表

 

在线人数列表是对所有人起作用,数据应放到application中,即ServletContext对象。

 

OnLineDemo.java

package demo;  
  
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, HttpSessionListener, HttpSessionAttributeListener {   
   
    // 声明一个ServletContext对象   
    private ServletContext application = null;   
  
    public void contextInitialized(ServletContextEvent sce) {   
        // 容器初始化时,向application中存放一个空的容器   
        this.application = sce.getServletContext();   
        this.application.setAttribute("alluser", new ArrayList());   
    }   
  
    public void contextDestroyed(ServletContextEvent sce) {   
    }   
  
    public void sessionCreated(HttpSessionEvent se) {   
    }   
  
    public void sessionDestroyed(HttpSessionEvent se) {   
        // 将用户名称从列表中删除   
        List l = (List) this.application.getAttribute("alluser");   
        String value = (String) se.getSession().getAttribute("uname");   
        l.remove(value);   
        this.application.setAttribute("alluser", l);   
    }   
  
    public void attributeAdded(HttpSessionBindingEvent se) {   
        // 如果登陆成功,则将用户名保存在列表之中   
        List l = (List) this.application.getAttribute("alluser");   
        l.add(se.getValue());   
        this.application.setAttribute("alluser", l);   
    }   
  
    public void attributeRemoved(HttpSessionBindingEvent se) {   
    }   
  
    public void attributeReplaced(HttpSessionBindingEvent se) {   
    }   
}  

 


online.jsp

<%@ page contentType="text/html;charset=gb2312"%>  
<%@ page import="java.util.*"%>  

<form action="online.jsp" method="post">     
 <input type="text" name="name">  
 <input type="submit" value="登陆">  
 <a href="logout.jsp">注销</a>  
</form>  
 
<%   
    if(request.getParameter("name")!=null)   
        session.setAttribute("uname",request.getParameter("name")) ;   
%>  
<h2>在线人员</h2>  
<hr>  
<%   
    List l = (List)application.getAttribute("allUser");   
    for(Object o : l)   
        out.println(o);   
%>  

 

 

logout.jsp

<%   
    session.invalidate() ;   
%>

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值