java—实现一个监听器HttpServletRequest的创建销毁、在线人数 (56)

在JavaWeb中的监听器分类

       在Javaweb中存在三个被监听对象:

       HttpServletRequest

       HttpSessoin

       ServletContext

监听者

被监听者

监听到事件对象

HttpSessionActivationListener

HttpSession – 监听HttpSession活化和顿化。

HttpSessionEvent 

HttpSessionAttributeListener[W1] 

HttpSession – 监听session的属性变化的。S.setAttributee();

HttpSessionBindingEvent 

HttpSessionBindingListener

HttpSession - 监听哪一个对象,绑定到了session上。S.setAtrri(name,User);

HttpSessionListener[W2] 

HttpSesion – 监听sessioin创建销毁

HttpSessionEvent

ServletContextAttributeListener

ServletContext – 属性变化的

ServletContextListener

servletContext 创建销毁

ServletRequestListener - serlvetRequestAttibuteListner

Rrequest -创建销毁


实现一个监听器HttpServletRequest的创建销毁

第一步:实现一个类:

package cn.hx.listener;

import javax.servlet.ServletRequestEvent;

import javax.servlet.ServletRequestListener;

public class RequestListener implements ServletRequestListener {

    public void requestDestroyed(ServletRequestEvent sre) {

        System.err.println("request销毁了:");

        Object o = sre.getSource();

        System.err.println("这个o is :"+o);//apache.RequestFaced@22222

    }

    public void requestInitialized(ServletRequestEvent sre) {

        System.err.println("request创建了:");

        Object o = sre.getSource();

        System.err.println("这个o是 :"+o);//apache.RequestFaced@22222

    }

}

第二步:必须要配置到web.xml

<listener>

    <listener-class>cn.itcast.listener.RequestListener</listener-class>

  </listener>

说明:

1:配置一个Listener只要求提供类名就可以了。

2:在tomcat启动时,会自动的初始化这个监听器类。

3:tomcat创建的Listner,Serlvet,Filter都是单列的.

 在线人数

只要有人访问本站点,成功创建一个Session就是一个会话,一个会话就是一个在线人数。

用HttpSSessionListener来监听Session的创建。

第一步:

package cn.hx.listener;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.ServletContext;

import javax.servlet.http.HttpSession;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

/**

 * 以下实现在线人数的统计

 */

public class MySessionListener implements HttpSessionListener {

    private Integer online=1;

    //request.getSession();

    public void sessionCreated(HttpSessionEvent se) {

        System.err.println("有人访问本网点了");

        HttpSession hs1 = (HttpSession) se.getSource();

        HttpSession hs2 = se.getSession();

        System.err.println("hs1:"+hs1.getId()+","+hs2.getId()+",ip:");

        //获取整个域的对象

        ServletContext sc= se.getSession().getServletContext();

        sc.setAttribute("online",online++);

        //将所有session放到servletContext

        //先从application获取所有已经维护的sesison

        List<HttpSession> list = (List<HttpSession>) sc.getAttribute("sessions");

        if(list==null){//第一个访问的人

            list = new ArrayList<HttpSession>();

            sc.setAttribute("sessions", list);

        }

        list.add(hs2);

    }

    //过期(30),s.invalidate();

    public void sessionDestroyed(HttpSessionEvent se) {

        System.err.println("有人退出了..."+se.getSession().getId());

        ServletContext sc= se.getSession().getServletContext();

        sc.setAttribute("online",online--);

    }

}

原文地址:https://www.cnblogs.com/zhenghongxin/p/4482855.html