0%

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>