[转]jsp统计在线人数和在线注册人数 - 军军小站|张军博客

[转]jsp统计在线人数和在线注册人数

系统 2172 0

一、统计在线人数
1.监听器

Java代码 复制代码
  1. package  com.logcd.listener;   
  2.   
  3. import  javax.servlet.ServletContext;    
  4. import  javax.servlet.http.HttpSessionEvent;    
  5. import  javax.servlet.http.HttpSessionListener;    
  6.   
  7. public   class  SessionCounter  implements  HttpSessionListener {    
  8.      public   void  sessionCreated(HttpSessionEvent event) {    
  9.         ServletContext ctx = event.getSession( ).getServletContext( );    
  10.         Integer numSessions = (Integer) ctx.getAttribute( "numSessions" );    
  11.          if  (numSessions ==  null ) {    
  12.             numSessions =  new  Integer( 1 );    
  13.         } else  {    
  14.              int  count = numSessions.intValue( );    
  15.             numSessions =  new  Integer(count +  1 );    
  16.         }    
  17.         ctx.setAttribute( "numSessions" , numSessions);    
  18.     }    
  19.      public   void  sessionDestroyed(HttpSessionEvent event) {    
  20.         ServletContext ctx = event.getSession( ).getServletContext( );    
  21.         Integer numSessions = (Integer) ctx.getAttribute( "numSessions" );    
  22.          if  (numSessions ==  null ) {    
  23.             numSessions =  new  Integer( 0 );    
  24.         }    
  25.          else  {    
  26.              int  count = numSessions.intValue( );    
  27.             numSessions =  new  Integer(count -  1 );    
  28.         }    
  29.         ctx.setAttribute( "numSessions" , numSessions);    
  30.     }    
  31. }   
    package com.logcd.listener;

import javax.servlet.ServletContext; 
import javax.servlet.http.HttpSessionEvent; 
import javax.servlet.http.HttpSessionListener; 

public class SessionCounter implements HttpSessionListener { 
    public void sessionCreated(HttpSessionEvent event) { 
        ServletContext ctx = event.getSession( ).getServletContext( ); 
        Integer numSessions = (Integer) ctx.getAttribute("numSessions"); 
        if (numSessions == null) { 
            numSessions = new Integer(1); 
        }else { 
            int count = numSessions.intValue( ); 
            numSessions = new Integer(count + 1); 
        } 
        ctx.setAttribute("numSessions", numSessions); 
    } 
    public void sessionDestroyed(HttpSessionEvent event) { 
        ServletContext ctx = event.getSession( ).getServletContext( ); 
        Integer numSessions = (Integer) ctx.getAttribute("numSessions"); 
        if (numSessions == null) { 
            numSessions = new Integer(0); 
        } 
        else { 
            int count = numSessions.intValue( ); 
            numSessions = new Integer(count - 1); 
        } 
        ctx.setAttribute("numSessions", numSessions); 
    } 
} 
  


说明:实现了HttpSessionListener定义的两个方法:sessionCreated()和sessionDestroyed()。这两个方法可以监听到当前应用中session的创建和销毁情况。
以下两种情况下就会发生sessionDestoryed(会话销毁)事件:
(1)执行session.invalidate()方法时。
(2)如果用户长时间没有访问服务器,超过了会话最大超时时间,服务器就会自动销毁超时的session。

Xml代码 复制代码
  1. < session-config >   
  2.      < session-timeout > 1 </ session-timeout >   
  3. </ session-config >   
    <session-config>
    <session-timeout>1</session-timeout>
</session-config>

  

时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。
2.web.xml中配置

Xml代码 复制代码
  1. < listener >     
  2.       < listener-class > com.logcd.listener.SessionCounter </ listener-class >     
  3. </ listener >    
    	<listener> 
      <listener-class>com.logcd.listener.SessionCounter</listener-class> 
	</listener> 
  


3.jsp调用

Html代码 复制代码
  1. 目前共有 < span   class = "salient" >   < %=application.getAttribute("numSessions")% >   </ span > 人在线  
    							目前共有<span class="salient"> <%=application.getAttribute("numSessions")%> </span>人在线
  


二、统计注册人数
1.监听器

Java代码 复制代码
  1. package  com.logcd.listener;   
  2.   
  3. import  java.util.HashMap;   
  4. import  java.util.Map;   
  5.   
  6. import  javax.servlet.ServletContext;   
  7. import  javax.servlet.http.HttpSession;   
  8. import  javax.servlet.http.HttpSessionBindingEvent;   
  9. import  javax.servlet.http.HttpSessionBindingListener;   
  10.   
  11. public   class  OnlineUserBindingListener  implements  HttpSessionBindingListener{   
  12.   
  13.      private  String userId;   
  14.      private  String userName;   
  15.        
  16.      public  OnlineUserBindingListener(String userId,String username){   
  17.          this .setUserId(userId);   
  18.          this .setUserName(userName);   
  19.     }   
  20.        
  21.      @SuppressWarnings ( "unchecked" )   
  22.      public   void  valueBound(HttpSessionBindingEvent event) {   
  23.         HttpSession session = event.getSession();   
  24.         ServletContext application = session.getServletContext();   
  25.   
  26.          // 把用户放入在线列表   
  27.         Map onlineUserList = (Map) application.getAttribute( "onlineUserList" );   
  28.          // 第一次使用前,需要初始化   
  29.          if  (onlineUserList ==  null ) {   
  30.             onlineUserList =  new  HashMap();   
  31.             application.setAttribute( "onlineUserList" , onlineUserList);   
  32.         }   
  33.         onlineUserList.put( this .userId,  this .userName);   
  34.            
  35.     }   
  36.   
  37.      public   void  valueUnbound(HttpSessionBindingEvent event) {   
  38.         HttpSession session = event.getSession();   
  39.         ServletContext application = session.getServletContext();   
  40.   
  41.          // 从在线列表中删除用户   
  42.         Map onlineUserList = (Map) application.getAttribute( "onlineUserList" );   
  43.         onlineUserList.remove( this .userId);   
  44.            
  45.     }   
  46.   
  47.   
  48.      public  String getUserId() {   
  49.          return  userId;   
  50.     }   
  51.   
  52.      public   void  setUserId(String userId) {   
  53.          this .userId = userId;   
  54.     }   
  55.   
  56.      public  String getUserName() {   
  57.          return  userName;   
  58.     }   
  59.   
  60.      public   void  setUserName(String userName) {   
  61.          this .userName = userName;   
  62.     }   
  63.   
  64. }  
    package com.logcd.listener;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class OnlineUserBindingListener implements HttpSessionBindingListener{

	private String userId;
	private String userName;
	
	public OnlineUserBindingListener(String userId,String username){
		this.setUserId(userId);
		this.setUserName(userName);
	}
	
	@SuppressWarnings("unchecked")
	public void valueBound(HttpSessionBindingEvent event) {
		HttpSession session = event.getSession();
	    ServletContext application = session.getServletContext();

	    // 把用户放入在线列表
	    Map onlineUserList = (Map) application.getAttribute("onlineUserList");
	    // 第一次使用前,需要初始化
	    if (onlineUserList == null) {
	        onlineUserList = new HashMap();
	        application.setAttribute("onlineUserList", onlineUserList);
	    }
	    onlineUserList.put(this.userId, this.userName);
		
	}

	public void valueUnbound(HttpSessionBindingEvent event) {
		HttpSession session = event.getSession();
	    ServletContext application = session.getServletContext();

	    // 从在线列表中删除用户
	    Map onlineUserList = (Map) application.getAttribute("onlineUserList");
	    onlineUserList.remove(this.userId);
		
	}


	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

}

  


说明:实现了HttpSessionBindingListener接口,接口中共定义了两个方法:valueBound()和valueUnbound(),分别对应数据绑定,和取消绑定两个事件。
所谓对session进行数据绑定,就是调用session.setAttribute()把HttpSessionBindingListener保存进session中。
HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session。HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。

从监听范围上比较,HttpSessionListener设置一次就可以监听所有session,HttpSessionBindingListener通常都是一对一的。

valueUnbound的触发条件是以下三种情况:
(1)执行session.invalidate()时。
(2)session超时,自动销毁时。
(3)执行session.setAttribute("onlineUserListener", "其他对象");或session.removeAttribute("onlineUserListener");将listener从session中删除时。
因此,只要不将listener从session中删除,就可以监听到session的销毁。

2.jsp调用
(1)login.jsp

Java代码 复制代码
  1. <%@ page language= "java"   import = "java.util.*"  pageEncoding= "gbk" %>   
  2. <%@ page  import = "com.logcd.listener.OnlineUserBindingListener" %>   
  3. <%   
  4.     String path = request.getContextPath();   
  5.     String basePath = request.getScheme() +  "://"   
  6.             + request.getServerName() +  ":"  + request.getServerPort()   
  7.             + path +  "/" ;   
  8.     String userId =  "2000090603" ;   
  9.     String userName =  "LogCN" ;   
  10.     session.setAttribute(userId,userName);   
  11.     session.setAttribute( "onlineUserBindingListener" new  OnlineUserBindingListener(userId,userName));   
  12.     response.sendRedirect( "counter.jsp" );   
  13. %>  
    <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ page import="com.logcd.listener.OnlineUserBindingListener"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
	String userId = "2000090603";
	String userName = "LogCN";
	session.setAttribute(userId,userName);
	session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(userId,userName));
	response.sendRedirect("counter.jsp");
%>
  


(2)counter.jsp

Java代码 复制代码
  1. <%@ page language= "java"   import = "java.util.*"  pageEncoding= "gbk" %>   
  2. 注册用户<span  class = "salient" ><%=((Map)application.getAttribute( "onlineUserList" )).size()%> </span> 人  

[转]jsp统计在线人数和在线注册人数


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论