监听器Listener
Java Web的三大组件
Servlet中组件一共有三种:Servlet、过滤器、监听器
概念:
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。。
监听器有很多种分类这里主要讲HttpSessionLisener统计在线人数
监听器有三个组件:
-
事件源:拥有事件
-
事件对象:事件对象封装了事件源对象
- 事件源要与监听器有关系,就得注册监听器【提供方法得到监听器对象】
- 触发事件源的事件,实际会提交给监听器对象处理,并且把事件对象传递过去给监听器。
-
事件监听器
监听器执行顺序如下:
1、给事件源注册监听器。
2、组件接受外部作用,也就是事件被触发。
3、组件产生一个相应的事件对象,并把此对象传递给与之关联的事件处理器。
4、事件处理器启动,并执行相关的代码来处理该事件。
下面是统计在线人数的一个demo
@WebListener
public class OnlineListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("OnlineListener.attributeAdded");
String name = se.getName();
//System.out.println("name = " + name);
//登录用户的session发生变化
if("account".equals(name)){
ServletContext application = se.getSession().getServletContext();
int online_num = application.getAttribute("online_num") == null ? 0 : (Integer) application.getAttribute("online_num");
System.out.println("online_num = " + online_num);
online_num++;
application.setAttribute("online_num",online_num);
}
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
String name = se.getName();
//System.out.println("name = " + name);
//退出用户的session发生变化
if("account".equals(name)){
ServletContext application = se.getSession().getServletContext();
int online_num = application.getAttribute("online_num") == null ? 0 : (Integer) application.getAttribute("online_num");
System.out.println("online_num = " + online_num);
online_num--;
application.setAttribute("online_num",online_num);
}
}
}
<p>该系统当前在线人数:${applicationScope.online_num}</p>