监听器(Listener)
-
介绍及作用:监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建和销毁事件,它还可以监听域对象的属性发生修改的事件,可以在事件发生前或者发生后做一些必要的处理。
-
相关概念:
a.事件源:被监听的对象
b.监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器
c.注册监听器:将监听器与事件源进行绑定
e.响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码 -
监听器的分类:
按照监听的事件可以将监听器划分为以下三类:
a.监听域对象自身的创建和销毁的事件监听器;
b.监听域对象中属性的增加和删除的事件监听器;
c.监听绑定到HttpSession域中某个对象状态的事件监听器。 -
主要的作用域:ServletContext、HttpSession、HttpServletRequest这三个对象中属性变更信息事件的监听器
-
监听器中的方法:
方法 | 描述 |
---|---|
attributeAdded () | 当向被监听对象中增加一个属性时,web容器就调用事件监听器的attributeAdded方法进行响应,这个方法接收一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象 |
attributeRemoved() | 当删除被监听对象中的一个属性时,web容器调用事件监听器的attributeRemoved方法进行响应 |
attributeReplaced() | 当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的attributeReplaced方法进行响应 |
- 以统计学生在线人数为例(HttpSessionAttributeListener)
@WebListener
public class OnlineListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("OnlineListener.attributeAdded");
String name = se.getName();
//登录用户的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) {
System.out.println("OnlineListener.attributeRemoved");
String name = se.getName();
//退出 用户的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);
}
}
}