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>