J2EE学习笔记 Listener监听器

Listener

Listener 的作用是用于监听 web应用的创建和销毁,以及在其上attribute发生的变化。

web应用即ServletContext对象(jsp的隐式对象application)

除了对web应用的监听外,还能监听session和request的生命周期,以及他们的attribute发生的变化。

对Context的监听

分为两种,一是生命周期的监听,也就是创建和销毁。二是attribute发生变化的监听,分为属性的增加,移除,替换。

生命周期的监听:

package listener;
 
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
 
public class ContextListener implements ServletContextListener {
 
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("web 应用销毁  ");
    }
 
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("web 应用初始化 ");
 
    }
}

Attribute的监听:

package listener;
 
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
 
public class ContextAttributeListener implements ServletContextAttributeListener {
 
    @Override
    public void attributeAdded(ServletContextAttributeEvent e) {
        System.out.println("增加属性 ");
        System.out.println("属性是" + e.getName());
        System.out.println("值是" + e.getValue());
 
    }
 
    @Override
    public void attributeRemoved(ServletContextAttributeEvent e) {
        // TODO Auto-generated method stub
        System.out.println("移除属性 ");
    }
 
    @Override
    public void attributeReplaced(ServletContextAttributeEvent e) {
        // TODO Auto-generated method stub
        System.out.println("替换属性");
    }
 
}

此外呢。还有对session的监听,request的监听,对应之前学过的作用域不同,需要就用啥,就是参数名,方法名和上面的Context监听有区别,其他地方都相同,比如都有对生命周期的监听、Attribute变化的监听,用到的时候再查。

 

用Session监听统计在线人数

HTTP协议是短链接的,所以无法在服务端根据建立了多少连接来统计当前有多少人在线。 不过可以通过统计session有多少来估计在线人数。

一旦一个用户访问服务器,就会创建一个session. 如果该用户持续访问,那么该session会持续有效。

如果经历了30分钟,该用户也没有做任何操作,就表示该用户“下线” 了,其对应的session也会被销毁。

所以可以通过统计有多少session被保留来估计当前在线人数。

package listener;
 
import javax.servlet.ServletContext;
 
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
 
public class OnlineNumberListener implements HttpSessionListener {
 
    @Override
    public void sessionCreated(HttpSessionEvent e) {
 
        ServletContext application = e.getSession().getServletContext();
 
        Integer online_number = (Integer) application.getAttribute("online_number");
 
        if (null == online_number)
            online_number = 0;
        online_number++;
        application.setAttribute("online_number", online_number);
         
        System.out.println("新增一位在线用户");
    }
 
    @Override
    public void sessionDestroyed(HttpSessionEvent e) {
 
        ServletContext application = e.getSession().getServletContext();
 
        Integer online_number = (Integer) application.getAttribute("online_number");
 
        if(null==online_number){
            online_number = 0;
        }
        else
            online_number--;
        application.setAttribute("online_number", online_number);
        System.out.println("一位用户离线");
    }
}

学习网站:https://how2j.cn/p/4660

你可能感兴趣的:(J2EE)