1.工程说明
a.要求:使用监听器统计在线用户及人数
b.思考:想要统计当前网站上在线的人数,应该通过哪一种方法去实现呢?request是一次请求
application是随整个服务器生而生,亡而亡
session是一次会话
由上可见,session跟适合用来统计当前的在线用户
我们都知道当用户打开一个页面的时候,服务器就会创建一个session,当用户彻底关闭页面的时候msession就会被销毁.
因此,要统计当前的的在线用户即是写一个session创建销毁的监听器:session被创建就是一个用户来了,session被销毁即是一个用户离开了。所以,用session的创建销毁监听器来统计再适合不过了。
ok,思路屡清楚了,接下来就撸起袖子干起来。
2.创建并注册监听器
package listener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class MySessionListener implements HttpSessionListener {
//统计在线人数的变量
private int onlineNumber;
@Override
public void sessionCreated(HttpSessionEvent arg0) {
onlineNumber++;
arg0.getSession().getServletContext().setAttribute("OnlinePeople", onlineNumber);
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
onlineNumber--;
arg0.getSession().getServletContext().setAttribute("OnlinePeople", onlineNumber);
}
}
3.index.jsp显示当前的用户人数
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"%>
<%
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 'index.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>
<center>
<h2>我是一个长的不咋样的主页面</h2>
<hr>
<h4>当前在线的用户人数: ${OnlinePeople }</h4>
</center>
</body>
</html>
4.运行结果
使用另一个浏览器打开,可以看见:
但是为什么我们关闭浏览器的时候,这个在线用户人数不会减少呢?是因为session的生命周期决定的,我们没有去定义session的什么周期的时间,所以session销毁会默认到session过期才销毁的。
好啦,以上是通过监听session创建和销毁来实现一个在线人数的统计效果。