一、显示当前在线人数:
功能分析:
统计当前系统session的个数,一个session代表一个在线的用户;
在session被创建的时候,计数器加一,退出登录时,计数器减一;
将计数器存储到ServletContent对象中;
问题:
如何在session被创建时触发一个计数器进行计数
方法:
使用监听器
二、监听器
作用:
监听request/session/application三个作用域对象的创建/销毁/数据变更
使用:
1.使用一个普通的java类实现指定接口
2.监听request的创建和销毁: ServletRequestListener
requestDestroyed(ServletRequestEvent arg0)
requestInitialized(ServletRequestEvent arg0)
形参:
ServletRequestEvent获取当前监听到的request对象,对request对象中的资源进行操作
监听request作用域数据的修改: ServletRequestAttributeListener
attributeAdded(ServletRequestAttributeEvent arg0)
attributeRemoved(ServletRequestAttributeEvent arg0)
attributeReplaced(ServletRequestAttributeEvent arg0)
形参:
ServletRequestAttributeEvent 获取当前监听到的request中的数据
getName()返回监听到的数据的键和getValue()返回监听到的数据的值
监听session的创建和销毁: HttpSessionListener
sessionCreated(HttpSessionEvent arg0)
sessionDestroyed(HttpSessionEvent arg0)
形参:
HttpSessionEvent 获取当前监听到的session对象,对session对象中的资源进行操作
监听session作用域数据的修改: HttpSessionAttributeListener
attributeAdded(HttpSessionBindingEvent arg0)
attributeRemoved(HttpSessionBindingEvent arg0)
attributeReplaced(HttpSessionBindingEvent arg0)
形参:
获取当前监听到的session中的数据,getName()返回数据的键名,getValue()返回数据的值
监听application的创建和销毁: ServletContextListener
contextDestroyed(ServletContextEvent arg0)
contextInitialized(ServletContextEvent arg0)
形参:
获取application对象
监听application作用域数据的修改: ServletContextAttributeListener
attributeAdded(ServletContextAttributeEvent arg0)
attributeRemoved(ServletContextAttributeEvent arg0)
attributeRemoved(ServletContextAttributeEvent arg0)
形参:
获取当前监听到的application中的数据,getName()返回数据的键名,getValue()返回数据的值
package com.facai.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyListener implements ServletRequestListener,ServletRequestAttributeListener,HttpSessionListener,HttpSessionAttributeListener,ServletContextListener,ServletContextAttributeListener{
//监听request对象的创建和销毁
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
System.out.println("request被销毁了");
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
System.out.println("request被创建了");
}
//监听Request对象的作用域的增加/删除/修改
@Override
public void attributeAdded(ServletRequestAttributeEvent arg0) {
System.out.println("request中增加了一条数据");
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
System.out.println("request中删除了一条数据");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
System.out.println("request中替换了一条数据");
}
//监听session的创建和销毁
@Override
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("session被创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("session被销毁");
}
//监听session数据的增/删/修改
@Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
System.out.println("session中增加了一条数据");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
System.out.println("session中移除了一条数据");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
System.out.println("session中替换了一条数据");
}
//监听application数据的增/删/修改
@Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
System.out.println("application中增加了一条数据");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
System.out.println("application中移除了一条数据");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
System.out.println("application中替换了一条数据");
}
//监听application对象的创建和销毁
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("application对象被创建了");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("application对象被销毁了");
}
}
2.在项目的xml中配置监听器,让监听器生效
<listener>
<listener-class>包名+类名</listener-class>
</listener>
三、新增显示在线人数功能的实现
创建一个普通的java类实现session监听接口和application监听接口
请求(application)发起时创建计数器
session创建时计数器自增
package com.facai.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyListener implements HttpSessionListener,ServletContextListener{
//监听application对象
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
@Override
public void contextInitialized(ServletContextEvent sce) {
int count=0;
//获取application对象
ServletContext sc=sce.getServletContext();
sc.setAttribute("count", count);
}
//监听session对象
@Override
public void sessionCreated(HttpSessionEvent se) {
// 获取application对象中的计数器
ServletContext sc=se.getSession().getServletContext();
int count=(int) sc.getAttribute("count");
//计数器自增
++count;
//再将计数器存储到application中
sc.setAttribute("count", count);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// 获取application对象中的计数器
ServletContext sc=se.getSession().getServletContext();
int count=(int) sc.getAttribute("count");
//计数器自减
--count;
//再将计数器存储到application中
sc.setAttribute("count", count);
}
}
注:统计在线人数的方法,是指统计只要他SESSION没有销毁,他就记做在线人数。
即如果只是刷新的话,人数是不会自增的,除非用另外一个浏览器。
本文通过jsp和servlet的整合,详细介绍了如何利用监听器来统计当前在线人数。通过实现HttpSessionListener和ServletContextListener接口,在session创建和销毁时动态更新计数器,从而准确地显示系统中的在线用户数量。


被折叠的 条评论
为什么被折叠?



