新增显示在线人数功能:jsp和servlet的整合案例

本文通过jsp和servlet的整合,详细介绍了如何利用监听器来统计当前在线人数。通过实现HttpSessionListener和ServletContextListener接口,在session创建和销毁时动态更新计数器,从而准确地显示系统中的在线用户数量。

一、显示当前在线人数:

功能分析:
统计当前系统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没有销毁,他就记做在线人数。
即如果只是刷新的话,人数是不会自增的,除非用另外一个浏览器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值