java使用监听器实现一个统计网站在线人数的示例_java

本文主要介绍了java使用监听器实现一个统计网站在线人数的示例,具有一定的参考价值,有需要的朋友可以了解一下。

(1)创建一个监听器实现类

要大致统计一个网站的在线人数,首先,可以通过ServletContextListener监听,当Web应用上下文启动时,在ServletContext中添加一个List,用来准备存放在线的用户名;然后,可以通过HttpSessionAttributeListener监听,当用户登录成功把用户名设置到Session中时同时将用户名存放到ServletContext中的List列表中;最后通过HttpSessionListener监听,当用户注销会话时将用户名从应用上下文范围中的List列表中删除。

所以,编写OnLineListener类实现ServletContextListener、HttpSessionAttributeListener、HttpSessionListener接口,具体代码如下:

package com.web.servlet;
import <a href="http://lib.csdn.net/base/javaee" class='replace_word' title="Java EE知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Java</a>.util.LinkedList;
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 OnlineListener implements ServletContextListener,
    HttpSessionAttributeListener, HttpSessionListener {
  private ServletContext application = null; 

  public void contextDestroyed(ServletContextEvent arg0) {
    // TODO Auto-generated method stub 

  } 

  public void contextInitialized(ServletContextEvent arg0) {
    //初始化一个application对象
    this.application = arg0.getServletContext();
    //设置一个列表属性,用于保存在想用户名
    this.application.setAttribute("online", new LinkedList<String>()); 

  }
  //往会话中添加属性时会回调的方法
  public void attributeAdded(HttpSessionBindingEvent arg0) {
    //取得用户名列表
    List<String> online = (List<String>) this.application
        .getAttribute("online");
    if ("username".equals(arg0.getName())) {
      //将当前用户名添加到列表中
      online.add((String) arg0.getValue());
    }
    //将添加后的列表重新设置到application属性中
    this.application.setAttribute("online", online);
  } 

  public void attributeRemoved(HttpSessionBindingEvent arg0) {
    // TODO Auto-generated method stub 

  } 

  public void attributeReplaced(HttpSessionBindingEvent arg0) {
    // TODO Auto-generated method stub 

  } 

  public void sessionCreated(HttpSessionEvent arg0) {
    // TODO Auto-generated method stub 

  }
  //会话销毁时会回调的方法
  public void sessionDestroyed(HttpSessionEvent arg0) {
    //取得用户名列表
    List<String> online = (List<String>) this.application
        .getAttribute("online");
    //取得当前用户名
    String username = (String) arg0.getSession().getAttribute("username");
    //将此用户名从列表中删除
    online.remove(username);
    //将删除后的列表重新设置到application属性中
    this.application.setAttribute("online", online);
  } 

}

(2)在web.xml中注册监听器

监听器实现好后,还需要在web.xml文件中进行注册才能起作用,只需要在web.xml中像如下添加元素即可

<!-- 注册一个监听器 -->
 <listener>
 <!-- 指定监听器实现类的全限定名 -->
 <listener-class>
 com.web.servlet.OnlineListener
 </listener-class>
 </listener

最后,我们创建几个Servlet来测试这个监听器实现的功能。

处理用户登录的Servlet类代码:

package com.web.servlet; 

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List; 

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; 

//处理用户登录的Servlet
public class LoginServlet extends HttpServlet { 

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    this.doPost(request, response);
  } 

  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");//设置相应内容类型 

    String username= request.getParameter("username");//获取请求参数中的用户名 

    //往session中添加属性,会触发HttpSessionAttributeListener中的attributeAdded方法
    if(username != null && !username.equals("")) {
      request.getSession().setAttribute("username",username);
    }
    //从应用上下文中获取在线用户名列表
    List<String> online = (List<String>)getServletContext().getAttribute("online");   

    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    out.println("<HTML>");
    out.println(" <HEAD><TITLE>用户列表</TITLE></HEAD>");
    out.println(" <BODY>");
    out.println("当前用户是:" + username);
    out.print("  <hr/><h3>在线用户列表</h3>"); 

    int size = online == null ? 0 : online.size();
    for (int i = 0; i < size; i++) {
      if(i > 0){
        out.println("<br/>");
      }
      out.println(i + 1 + "." + online.get(i));
    } 

    //注意: 要对链接URL进行自动重写处理
    out.println("<hr/><a href="/" mce_href="/""" + response.encodeURL("logout") + "/">注销</a>");
    out.println(" </BODY>");
    out.println("</HTML>");
    out.flush();
    out.close();
  }
}

处理用户登录Servlet的类代码

package com.web.servlet; 

import java.io.*;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.*; 

//处理用户注销会话的Servlet
public class LogoutServlet extends HttpServlet { 

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    this.doPost(request, response);
  } 

  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    request.setCharacterEncoding("utf-8"); 

    //销毁会话,会触发SessionLinstener中的sessionDestroyed方法
    request.getSession().invalidate();  

    //从应用上下文中获取在线用户名列表
    List<String> online = (List<String>)getServletContext().getAttribute("online"); 

    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    out.println("<HTML>");
    out.println(" <HEAD><TITLE>用户列表</TITLE></HEAD>");
    out.println(" <BODY>");
    out.print("  <h3>在线用户列表</h3>"); 

    int size = online == null ? 0 : online.size();
    for (int i = 0; i < size; i++) {
      if(i > 0){
        out.println("<br/>");
      }
      out.println(i + 1 + "." + online.get(i));
    } 

    out.println("<hr/><a href="/" mce_href="/""index.html/">主页</a>");
    out.println(" </BODY>");
    out.println("</HTML>");
    out.flush();
    out.close();
  }
}

然后创建一个index.html文件,用来供用户登录,代码如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>index.html</title>
  </head> 

 <body>
  <form action = "login" method = "post">
   用户名:<input type ="text" name = "username"/>
   <input type = "submit" value = "登录"/><br/><br/> 

  </form>
 </body>
</html>

把WEB部署到Tomcat容器总,并启动。打开浏览器访问即可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java实现监听器
java统计在线人数
监听器统计在线人数、php 实现访问人数统计、java监听器实现原理、tomcat监听器实现原理、java实现数据库监听器,以便于您获取更多的相关知识。

时间: 2024-10-29 13:36:19

java使用监听器实现一个统计网站在线人数的示例_java的相关文章

php实现统计网站在线人数的方法

  本文实例讲述了php实现统计网站在线人数的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 <?php functi

php实现统计网站在线人数的方法_php技巧

本文实例讲述了php实现统计网站在线人数的方法.分享给大家供大家参考.具体实现方法如下: <?php function getIpAddress() { // 取得当前用户的IP地址 if (getenv('HTTP_CLIENT_IP')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif (getenv('HTTP_X_FORWARDED_FOR')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif (ge

PHP+MYSQL实现统计网站在线人数

PHP+MYSQL实现网站在线人数,后台有MySQL数据库支持.可以直接统计出网站当前的在线人数. 首先是创建MYSQL数据库表.   CREATE TABLE tablename ( field type(max_length) DEFAULT 'default_value' (NOT) NULL }       可以使用的SQL语句. CREATE TABLE useronline ( timestamp int(15) DEFAULT '0' NOT NULL, ip varchar(40

被动式统计网站在线人数

在学校里不能上网时,没事做就改了下blog程序,加上了个blog在线人数统计.在此之前也看了几种统计在线人数的代码,感觉都不太符合自己的要求,就结合blog程序自己写了一个,应用到我的blog上. 在Fdream的blog里提到了一些关于ASP统计在线人数的方法,具体可以看这里. 为了兼顾准确率与效率,我采用了被动的方式来统计在线人,即当有新访客时才更新在线人数.不知道网上有没有已经有人使用了这种方法,不过我现在用的完全是自己想的^_^. 在L-Blog中采用Session来判断访客是否为新访客

Java编程中字节流与字符流IO操作示例_java

 IO流基本概念IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都是在IO包上 流按操作数据分为两种:字节流和字符流 流按流向分为:输入流,输出流. 字节流的抽象基类:InputStream,OutputStream 字符流的抽象基类:Reader,Writer 注:由这4个类派生出来的子类名称都是以其父类名作为子类名的后缀. 如:InputStream的子类:FileInputStream 如:Reader的子类FileReader 如创建一个Fi

一个统计网站访问IP的实例

一.目录结构: 二.在程序启动时就要创建一个Map,用于装IP和次数 用监听器实现: 三.拦截访问的IP,统计次数 用过滤器: 四.显示页面 五.效果:

asp.net Application统计网站在线人数详解

application对象读取数据的语法: '读 数据=application( "数据名称 ") '写 application( "数据名称 ")=数据 例: dim   i application(i)=application(i)+1 application数据非同步更新: application.lock   '锁定对象 application(i)=application(i)+1 application.unlock   '解除锁定 applicatio

Java实现冒泡排序与双向冒泡排序算法的代码示例_java

冒泡排序:就是按索引逐次比较相邻的两个元素,如果大于/小于(取决于需要升序排还是降序排),则置换,否则不做改变 这样一轮下来,比较了n-1次,n等于元素的个数:n-2, n-3 ... 一直到最后一轮,比较了1次 所以比较次数为递减:从n-1 到 1 那么总的比较次数为:1+2+3+...+(n-1),  以等差公式计算:(1+n-1)/2*(n-1) ==> n/2*(n-1) ==> (n^2-n) * 0.5 用大O表示算法的时间复杂度:O(n^2) ,  忽略了系数0.5和常数-n p

基于Java的Spring框架来操作FreeMarker模板的示例_java

1.通过String来创建模版对象,并执行插值处理  import freemarker.template.Template; import java.io.OutputStreamWriter; import java.io.StringReader; import java.util.HashMap; import java.util.Map; /** * Freemarker最简单的例子 * * @author leizhimin 11-11-17 上午10:32 */ public cl