Servlet监听器统计在线人数

监听器的作用是监听Web容器的有效事件,它由Servlet容器管理,利用Listener接口监听某个执行程序,并根据该程序的需求做出适应的响应。

例1 应用Servlet监听器统计在线人数。

(1)创建UserInfoList.java类文件,主要是用来存储在线用户和对在线用户进行具体操作。该文件的完整代码如下:

package com.cn.gao;

import java.util.Vector;

public class UserInfoList {
    private static UserInfoList user = new UserInfoList();
    private Vector vector = null;
    /*
     * 利用private调用构造函数,防止被外界产生新的instance对象
     */
    public UserInfoList(){
        this.vector = new Vector();
    }
    
    //外界使用的instance对象
    public static UserInfoList getInstance(){
        return user;
    }
    
    //增加用户
    public boolean addUserInfo(String user){
        if(user!=null){
            this.vector.add(user);
            return true;
        }else{
            return false;
        }
    }
    
    //获取用户列表
    public Vector getList(){
        return vector;
    }
    
    //移除用户
    public void removeUserInfo(String user){
        if(user!=null){
            vector.removeElement(user);
        }
    }
}

(2)创建UserInfoTrace.java类文件,主要实现valueBound(HttpSessionBindingEvent arg0)和valueUnbound(HttpSessionBindingEvent arg0)两个方法。当有对象加入session时,valueBound()方法会自动被执行;当有对象从session中移除时,valueUnbound()方法会被自动执行,在valueBound()和valueUnbound()方法中都加入了输出信息的功能,可使用户在控制台中更清楚地了解执行过程。该文件的完整代码如下:

 

package com.cn.gao;

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

public class UserInfoTrace implements HttpSessionBindingListener {
    private String user;
    private UserInfoList container = UserInfoList.getInstance();
    
    public UserInfoTrace(){
        user = "";
    }
    
    //设置在线监听人员
    public void setUser(String user){
        this.user = user;
    }
    
    //获取在线监听
    public String getUser(){
        return this.user;
    }
    
    public void valueBound(HttpSessionBindingEvent arg0) {
        System.out.println("上线"+this.user);
    }

    public void valueUnbound(HttpSessionBindingEvent arg0) {
        System.out.println("下线"+this.user);
        if(user!=""){
            container.removeUserInfo(user);
        }

    }

}

 

(3)创建index2.jsp页面文件,用于用户登录,该页面的关键代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index2.jsp' starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
    <form action="showUser.jsp" method="post" >
        <table align="center">
            <tr>
                <td align="center" class="2">在线系统</td>
            </tr>
            <tr>
                <td align="center">
                    <input type="text" name="user"/>
                </td>
            </tr>
            <tr>
                <td align="center">
                    <input type="submit" value="登陆"/>
                </td>
            </tr>
        </table>
    </form>
  </body>
</html>

 

 

(3)创建showUser.jsp页面文件,在页面中设置session的setMaxInactiveInterval()为10秒,这样可以缩短session的生命周期。该页面的关键代码如下:

 

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ page import="com.cn.gao.*" %>
<%
UserInfoList list = UserInfoList.getInstance();
UserInfoTrace ut = new UserInfoTrace();
String name=request.getParameter("user");
ut.setUser(name);
session.setAttribute("list",ut);
list.addUserInfo(ut.getUser());
session.setMaxInactiveInterval(10);
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>   
    <title>My JSP 'showUser.jsp' starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
  <form method="post">
      <table align="center">
          <tr>
              <td align="center" class="2">
                  <h2>在线用户名单</h2>
              </td>
          </tr>
          <tr>
              <td align="center">
                  <textarea rows="8" cols="20"><%
                      Vector vector=list.getList();
                      if(vector!=null&&vector.size()>0){
                          for(int i=0;i<vector.size();i++){
                              out.println(vector.elementAt(i));
                          }
                      }
                   %>
                  </textarea>
              </td>
          </tr>
      </table>
  </form>
  </body>
</html>

当用户单击“登录”按钮,就会进入到统计在线人数的界面。

posted @ 2015-04-19 11:13  ~风轻云淡~  阅读(1123)  评论(0编辑  收藏  举报