转自 http://blog.sina.com.cn/s/blog_621a42970100gblw.html

Servlet监听器主要有三种,在ServletContext(上下文对象)、Session(会话)和request(请求)这三对象上进行监听,可以监听对象的创建、销毁、添加属性、删除属性、属性值的改变等。ServletContext对象的作用域在整个WEB应用程序,类似于Static属性;Session的作用域在一个会话,一个会话可以理解为一个从一个浏览器发出请求到服务器开始,一直到浏览器关闭(但通常我们可以设置会话的生命期,防止那些获得连接后却长时间没有再向服务器发出请求的情况),相当于类的成员变量;request的作用域仅在一次请求,即浏览器发送一次请求到服务器处理该请求并发回响应就结束了,相当于局部变量。

要实现统计网站的历史访问量就要利用ServletContext的全局属性的特点了,为了在服务器停止后,之前的访问量不会消失,我们就应该在服务器关闭前将当前的访问量存放到文件里面,以便下一次重启服务器后,可以继续使用。在ServletContext上面创建监听器,监听上下文对象的销毁和创建,并同时在创建上下文的时候从文件读取历史数据,在上下文销毁的时候将当前访问量写入到文件保存起来。以后每当创建一个会话(Session)的时候,就将当前的计数值加一。在线人数的统计是利用在创建会话的时候,将在线人数之加一,在会话对象销毁的时候,将在线人数值减一。因为两种人数统计都是被所有用户共享的信息,所以使用ServletContext的setAttribute()和getAttribut()方法来对总人数和在线人数进行管理。

创建对上下文对象的监听器:

public class ContextListener implements ServletContextListener{

public void contextDestroyed(ServletContextEvent arg0) {
  // TODO Auto-generated method stub
  Properties pro = new Properties();  
  try {
   pro.setProperty("counter", arg0.getServletContext().getAttribute("counter").toString());
   String filePath = arg0.getServletContext().getRealPath("/WEB-INF/classes/db/count.txt");

//上下文对象销毁时,将当前访问量写入文件
   OutputStream os = new FileOutputStream(filePath);
   pro.store(os, null);
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }

public void contextInitialized(ServletContextEvent arg0) {
  // TODO Auto-generated method stub
  arg0.getServletContext().setAttribute("online", 0);
  Properties pro = new Properties();
  InputStream in = ContextListener.class.getResourceAsStream("/db/count.txt");
  String n = null;
  try {
   pro.load(in);
   n = pro.getProperty("counter");//从计数文件中读取该站的历史访问量
   arg0.getServletContext().setAttribute("counter", Integer.parseInt(pro.getProperty("counter")));
  } catch (IOException e) {
   // TODO Auto-generated catch block
   System.out.println("读取计数文件失败");
  }
  System.out.println("创建上下文对象" + n);
 }

}

创建对会话对象的监听:

public class SessionListener implements HttpSessionListener{

public void sessionCreated(HttpSessionEvent arg0) {
  // TODO Auto-generated method stub
   HttpSession session = arg0.getSession();
  int i = (Integer)session.getServletContext().getAttribute("online");//获得当前在线人数,并将其加一
  session.getServletContext().setAttribute("online", i+1);
  int n = (Integer)session.getServletContext().getAttribute("counter");//创建一个会话就将访问量加一
  session.getServletContext().setAttribute("counter", n+1);
  Properties pro = new Properties();  
  try {//访问人数加一后就将结果写入文件(防止不正常关闭服务器)
   pro.setProperty("counter", session.getServletContext().getAttribute("counter").toString());
   String filePath = session.getServletContext().getRealPath("/WEB-INF/classes/db/count.txt");
   OutputStream os = new FileOutputStream(filePath);
   pro.store(os, null);
  } catch (IOException e) {
   // TODO Auto-generated catch block
   System.out.println("写入计数文件失败");
  }
  System.out.println("创建一个会话");
 }

public void sessionDestroyed(HttpSessionEvent arg0) {
  // TODO Auto-generated method stub
  //销毁会话的时候,需要将在线人数减一
  ServletContext context = arg0.getSession().getServletContext();
  Integer i = (Integer)context.getAttribute("online");
  context.setAttribute("online", i-1);
  arg0.getSession().invalidate();
  System.out.println("销毁一个会话");
 }

}

在web.xml文件中将监听器注册,在创建和销毁对象时就会触发该事件了。 因为我们通常做测试的时候,服务器的关闭是没有通过正常的方式来进行的,所以程序中在创建一个会的时候将网站历史访问数据值加一后就将该值在文件中进行更新,否则可能该值不会改变。创建一个会话是通过request.getSession()来触发的,所以在做测试的Servlet中需要加上HttpSession session = request.getSession();
  //设置会话的最大不活动时间为60秒
  session.setMaxInactiveInterval(60);。

上面的只是一个简单的模拟程序,存在许多缺陷。

利用Servlet监听器实现简单网站访问量和在线人数统计相关推荐

  1. java 统计网站访问量_javaweb之统计网站访问量小案例

    效果图 图片.png 项目目录: 图片.png 图片.png 切换浏览器,数据连续累加(全局作用域,服务器不重启,数据会一直保留) html代码 hello world! click1 CountSe ...

  2. 利用Python爬虫刷新某网站访问量

    前言:前一段时间看到有博友写了爬虫去刷新博客访问量一篇文章,当时还觉得蛮有意思的,就保存了一下,但是当我昨天准备复现的时候居然发现文章404了. 所以本篇文章仅供学习交流,严禁用于商业用途 很多人学习 ...

  3. 网站访问量等数据统计

    访问此网站:查看文档即可 转载于:https://www.cnblogs.com/candy-Yao/p/8866428.html

  4. 基于redis简单实现网站访问量计数

    环境准备: 如果不熟悉redis和springboot简单整合的小伙伴可以先移步我之前的文章喔,里面有详细教学~ https://blog.csdn.net/weixin_47025166/artic ...

  5. php记录网站访问,PHP简单实现记录网站访问量的功能

    这篇文章主要介绍了PHP简单实现记录网站访问量功能,涉及php针对文件加锁读写及日期时间转换等相关操作技巧,需要的朋友可以参考下 本文实例讲述了PHP简单实现记录网站访问量功能.分享给大家供大家参考, ...

  6. 【PHP】简单的网站访问量计数器实现

    简单的网站访问量计数器实现 首先说明思路: 1.用户向服务器发出访问请求 2.服务器读取访问次数文件,+1,向客户端返回 3.服务器保存新的浏览次数 4.新用户访问,重复123即可 解决方案(主要算法 ...

  7. Servlet中统计网站访问量

    统计网站访问量 访问量 放入到servletContext里,,setAttribute("count"); 其他servlet获取该变量,然后进行自增 再重新放入到 servle ...

  8. Javaweb Listener监听器的简单应用:统计网站在线人数

    Listener监听器实现统计网站在线人数 开发环境: IntelliJ IDEA 一.什么是监听器 是指专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生变化时, ...

  9. php网站统计浏览量,PHP简单实现记录网站访问量功能示例

    本文实例讲述了PHP简单实现记录网站访问量功能.分享给大家供大家参考,具体如下: tongji/index.php文件: $file = dirname(__FILE__).'/tongji.db'; ...

最新文章

  1. 调用预训练好的XLnet词向量
  2. 如何利用1%推广费用提高50%的用户增长
  3. QML基础类型之geoshape
  4. JUC锁-互斥锁ReentrantLock(二)
  5. Android Studio --- [学习笔记]TCP(第2弹)、GridView、ScrollView
  6. leetcode 322. 零钱兑换 思考分析
  7. 三种banner基础形态
  8. 白话算法(1) for循环不是随便写的
  9. Linux的环境变量.bash_profile .bashrc profile文件
  10. html文件form根目录,HTML ,form 和 link 使用根目录 的问题,我已经上图了!
  11. 小米路由器3潘多拉固件刷机教程
  12. Windows远程桌面连接Ubuntu 16.04
  13. KindEditor上传图片及使用
  14. 论文数模真的好难?那是你还不会Matlab!
  15. 计算机软件师社会需求,java软件工程师的社会环境如何?
  16. phpcms一键清理数据后完整找回数据
  17. python笔记003
  18. 计算机从应用上看向那个方向发展,(总)2019年6月一级Ms Office试题
  19. liunx启动时:initramfs unpacking failed:write error
  20. 统计学原理----算术平均数和调和平均数

热门文章

  1. keba驱动器_KEBA系统,控制及模块-工业控制领域一站式服务商-华联欧
  2. python图片转化字节流_python字节流怎么转化成图片
  3. 个人站点配置免费HTTPS证书、nginx配置ssl证书、阿里云盾和站长之家两种
  4. Stream操作时Collectors工具类中常用方法
  5. ubuntu系统升级
  6. MainActivity.this是什么意思以及为什么这样表达
  7. 各种计算机语言的区别
  8. 微型计算机完成一个基本运算和判断,计算机二级考试试题
  9. java计算机毕业设计微博系统网站源代码+数据库+系统+lw文档
  10. tp6使用redis消息队列