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属性的增加,替换和移除
    <%
    application.setAttribute("test", 1);
    application.setAttribute("test", 2);
    application.removeAttribute("test");
    %>
    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
<%
session.setAttribute("test", 1);
session.setAttribute("test", 2);
session.removeAttribute("test");
%>
7.测试
访问页面http://127.0.0.1/testSession.jsp

四.监听Request
RequestListener 实现接口 ServletRequestListener和ServletRequestAttributeListener
测试
<%
request.setAttribute("test", 1);
request.setAttribute("test", 2);
request.removeAttribute("test");
%>

五.统计在线人数
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}

你可能感兴趣的:(Listener)