Listener

【Listener】Listener
监听web应用是否启动,session是否有创建
一.Hello Listener
Listener的作用是用于监听web应用的创建和销毁,及其在其上attribute发生的变化,
web应用即ServletContext对象(jsp的隐式对象application)
除了对web应用的监听外,还能监听session和request的生命周期,以及他们的attribute发生的变化。
二.监听Context
对Context的监听分生命周期的监听,和Context上Attribute变化的监听两种。
1.编写ContextListener
ublic class ContextListener implements ServletContextListener {
//对应当前web应用的销毁
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("web 应用销毁 ");
}
//对应当前web应用的初始化
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("web 应用初始化 ");

}

}
2.配置 web.xml (配置监听器)

listener.ContextListener

3.测试
web应用的自动重载需要如下前提:
  1. 配置: server.xml中对应的
  2. 某个servlet 发生了变化,导致这个web应用自动重启
    4.编写 ContextAttributeListener
    public class ContextAttributeListener implements ServletContextAttributeListener {
    //监听属性的增加
    @Override
    public void attributeAdded(ServletContextAttributeEvent e) {
    // TODO Auto-generated method stub
    }
    //监听属性的移除
    @Override
    public void attributeRemoved(ServletContextAttributeEvent e) {
    // TODO Auto-generated method stub
    }
    //监听属性的替换
    @Override
    public void attributeReplaced(ServletContextAttributeEvent e) {
    // TODO Auto-generated method stub
    }
    }
    5.配置web.xml
    配置ContextAttributeListener

    listener.ContextAttributeListener

    6.testContext.jsp
    故意造成Context属性的增加,替换和移除

    7.测试
    http://127.0.0.1/testContext.jsp
三.监听session
1.编写 SessionListener
public class SessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent e) {
}
@Override public void sessionDestroyed(HttpSessionEvent e) { }

}
2.配置web.xml

listener.SessionListener

3.测试
随意访问任意页面,如果是第一次访问,都会触发session创建,后续访问不会触发session的创建
4.编写 SessionAttributeListener
public class SessionAttributeListener implements HttpSessionAttributeListener {
public void attributeAdded(HttpSessionBindingEvent e) { }
public void attributeRemoved(HttpSessionBindingEvent e) { }
public void attributeReplaced(HttpSessionBindingEvent e) { }
}
5.配置web.xml

listener.SessionAttributeListener

6.testSession.jsp

7.测试
访问页面http://127.0.0.1/testSession.jsp
四.监听Request
RequestListener 实现接口 ServletRequestListener和ServletRequestAttributeListener
测试

五.统计在线人数
Http协议是短链接的,所以无法在服务端根据建立多少连接来统计当前有多少人在场,可以通过session多少来估计在线人数
一旦一个用于访问服务器,就会创建一个session,如果用户持续访问,那么该session会持续有效,如果经理30分钟,对应的session也会被销毁。
1.编写 OnlineNumberListener
public class OnlineNumberListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent e) {
//application对象是ServletConntext接口的实例,可以通过reques.getServletContext()来获取,application映射的就是web应用本身
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); }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); }

2.配置web.xml
配置 listener.OnlineNumberListener

listener.OnlineNumberListener

3.checkOnlineNumber.jsp
通过EL表达式,直接获取application中的值
当前 在线人数 : ${online_number}

    推荐阅读