J2EE开发 Listener事件监听器的使用

Listener用于监听某些事件的发生,在指定事件发生时,触发相应的方法。
Servlet监听器有三种:ServletContext监听器,HttpSession监听器,ServletRequest监听器。
ServletContext监听接口:ServletContextAttributeListener(监听属性改变),ServletContextListener(监听ServletContext本身的改变)

HttpSession监听接口:HttpSessionAttributeListener(监听属性改变),HttpSessionListener(监听HttpSession本身的改变),HttpSessionActivationListener(监听HttpSession对象的状态,激活或钝化),HttpSessionBindingListener(监听对象的绑定状态)

ServletRequest监听接口:ServletRequestAttributeListener(监听属性改变),ServletRequestListener(监听对象本身)

下面实现HttpSessionListener接口,写个在线人数统计。原理:因为HttpSessionListener可以监听Session的创建与销毁,所以我们只需要在创建时计数加一,销毁时计数减一就可以。Session会在服务端和客户端都保存,所以,并不是客户端关闭网页,关闭浏览器,服务端上的Session就销毁了,服务端有个超时时间,当超过一定时间,用户没有活动时,session才会过期。基于上面的原因,我们的统计不可能是实时准确的。
还有,如果测试使用Chrome,有点小问题,因为,重启浏览器后,还是同一个Session,就不会触发监听器,所以重启浏览器后,会发现在线人数并没有增加,使用IE和Firefox没有这个问题。

OnlineCounter.java:


package pocketdigi;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnlineCounter implements HttpSessionListener {

	
	private int count;
	public OnlineCounter()
	{
		count=0;
	}

	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		// TODO Auto-generated method stub
		//session创建时触发,即此时有新用户访问
		count++;
		arg0.getSession().getServletContext().setAttribute("Count", new Integer(count));
		//写入全局属性,arg0.getSession().getServletContext()得到的是javax.servlet.ServletContext对象,即JSP内置对象application
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		// TODO Auto-generated method stub
		//session过期销毁时触发
		count--;
		arg0.getSession().getServletContext().setAttribute("Count", new Integer(count));
		
	}

}

web.xml注册Listener:


	<listener>
		<listener-class>pocketdigi.OnlineCounter</listener-class>
	</listener>

JSP页面读取:


<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>My JSP '1.jsp' starting page</title>
</head>
	<body>
	<%=(Integer)application.getAttribute("Count")%>
	</body>
</html>

© 2012, 冰冻鱼. 请尊重作者劳动成果,复制转载保留本站链接! 应用开发笔记