Listener监听器实现统计网站在线人数
开发环境: IntelliJ IDEA
一、什么是监听器
是指专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生变化时,立即采取相应的行动。
具体参考下文:
Java监听器详解
二、创建并配置监听器
1.首先创建一个空的maven项目,在pom.xml配置文件中导入下面这几个包:
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!--连接数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
maven的一个优点:自动帮你从网上下载你需要的jar包
这几个包可能在本篇博客中不会有什么关联,但它们是javaweb项目中经常使用到的jar包
2.在src/java目录下创建包和类(自行命名),比如我的命名是:
包:cn.edu.xit.listener
类:OnlineCountListener
OnlineCountListener这个类就是监听器
package cn.edu.xit.listener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
//统计网站在线人数:统计session
public class OnlineCountListener implements HttpSessionListener {
//创建session监听: 看你的一举一动
//一旦创建一个session,就会触发一次这个
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
//要想统计session,作用域要提到最高
ServletContext servletContext = httpSessionEvent.getSession().getServletContext();
System.out.println(httpSessionEvent.getSession().getId());
Integer onlinecount= (Integer) servletContext.getAttribute("OnlineCount");
if(onlinecount==null){
onlinecount = new Integer(1); //用int也行,这里用的是封装整型类的操作,等价于onlinecount = 1;
}else{
int count = onlinecount.intValue();
onlinecount = new Integer(count+1); //等价于 onlinecount += 1;
}
//每次都在更新自己,有累加
servletContext.setAttribute("OnlineCount", onlinecount);
}
//销毁session监听
//一旦session销毁,就会触发
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
ServletContext servletContext = httpSessionEvent.getSession().getServletContext();
Integer onlinecount= (Integer) servletContext.getAttribute("OnlineCount");
if(onlinecount==null){
onlinecount = new Integer(0);
}else{
int count = onlinecount.intValue();
onlinecount = new Integer(count-1);
}
//每次都在更新自己,有累加
servletContext.setAttribute("OnlineCount", onlinecount);
}
}
- 在web.xml中配置监听器
<!--注册监听器-->
<listener>
<listener-class>cn.edu.xit.listener.OnlineCountListener</listener-class>
</listener>
<!-- <session-config> session一分钟过期
<session-timeout>1</session-timeout>
</session-config>-->
三、观察访问网站的id
上面这些操作都完成之后,就可以在jsp里面测试了。
这里注意,在创建空的maven项目的时候可能会没有webapp文件夹,所以可以右击项目,点击Add FrameWork Support,选择Web Application,就可以创建web文件夹。
把maven自带的index.jsp稍加修改
<%--
Created by IntelliJ IDEA.
User: 86152
Date: 2022/4/28
Time: 12:23
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<h1>当前有 <span><%=this.getServletConfig().getServletContext().getAttribute("OnlineCount")%></span>人在线</h1>
</body>
</html>
jsp写完之后,就可以启动tomcat测试了。
我们来看测试结果:
测试结果显示此网站有2人在线,这是为什么呢?
我们来看看这2个“人”的id
在页面控制台这里看到的只有一个id,那么另一个id是怎么来的?
因为服务器在访问网站的时候,一般会进行不止一次的连接才能访问成功,所以才会出现有多个id的情况。当我们让tomcat重新发布项目的时候,这个无用的id就会消失了。
然后这个时候我们用不同的客户端(浏览器)访问这个网站试试
我分别用了Microsoft Edge和FireFox两个浏览器来访问网站,观察到,人数在递增,id也不一样。
最后看一下后端控制台
这里我们可以看到,那个没用的id被记录下来了:
7F9E3977763B5B0E328283480B3B7D75
按我这个情况,可以解读为:第一个id尝试连接网站,但是失败,直到第二个id访问的时候才成功。
以上的来源是学习狂神说Java的视频: