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("一位用户离线");
}
}