首页 > 编程 > JSP > 正文

JSP如何统计在线人数和注册人数

2024-09-05 00:23:38
字体:
来源:转载
供稿:网友
一、统计在线人数
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. }   

说明:实现了HttpSessionListener定义的两个方法:sessionCreated()和sessionDestroyed()。这两个方法可以监听到当前应用中session的创建和销毁情况。
以下两种情况下就会发生sessionDestoryed(会话销毁)事件:
(1)执行session.invalidate()方法时。
(2)如果用户长时间没有访问服务器,超过了会话最大超时时间,服务器就会自动销毁超时的session。
Xml代码 复制代码
  1. <session-config>  
  2.     <session-timeout>1</session-timeout>  
  3. </session-config>  
时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。
2.web.xml中配置
Xml代码 复制代码
  1. <listener>    
  2.      <listener-class>com.logcd.listener.SessionCounter</listener-class>    
  3. </listener>   

3.jsp调用
Html代码 复制代码
  1. 目前共有<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. }  

说明:实现了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. %>  

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

三、RequestDispatcher
     RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。RequestDispatcher接口中定义了两个方法:include/forward。
      由于<jsp:include>只能指定固定的jsp文件名,不能动态指定jsp文件名。需要把<jsp:include>翻译为Java code – RequestDispatcher.include();
用法:
<% request.getRequestDispatcher(filename).include(request, response); />
     RequestDispatcher.forward()方法将当前的request和response重定向到该RequestDispacher指定的资源。只有在尚未向客户端输出响应时才可以调用forward()方法,如果页面缓存不为空,在重定向前将自动清除缓存。否则将抛出一个IllegalStateException异常。
      JSP中的三种页面跳转方式:
1. response.sendRedirect();
2. response.setHeader("location","");
3. <jsp:forward page="" />
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表