监听器
-
功能
- Servlet中的监听器功能是负责监听WEB的各种操作,当相关的事件触发之后将产生事件,并对此事件进行处理,在WEB中可以对application、session、request三种操作进行监听。 分类
- 分别对application,session,request事件的监听 实现
- 实现监听功能,主要是由一个普通类,实现监听器的接口,在web.xml中配置监听器或者添加注解
以下是主要使用的六个监听器接口
接口 | 作用 |
---|---|
ServletRequestListener | 监听request的生命周期 |
ServletRequestAttributeListener | 监听request域里面attribute参数的添加、删除或是修改 |
HttpSessionListener | 监听session的 生命周期(创建以及销毁) |
HttpSessionAttributeListener | session域中的Attribute参数的添加、删除或是修改 |
ServletContextListener | 监听application生命周期 |
ServletContextAttributeListener | 全局域application域里面attribute参数的添加修改或是删除 |
监听器监听在线人数
-
思路
- 首先,需要利用session的有关参数的监听器。在登录时使用session域存储登录的用户信息user。当监听到参数的改变之后,在监听器里面实现记录当前在线人数操作。其次,记录的人数需存储于application域里面。使用application的生命周期监听器ServletContextListener来存储在Attribute中。 代码
- CountOnLineListener.java文件
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import priv.zs.upload.beans.User;
/**
* Application Lifecycle Listener implementation class CountOnLine
*
*/
@WebListener
public class CountOnLine implements ServletContextListener, HttpSessionAttributeListener {
private ServletContext app ;
/**
* Default constructor.
*/
public CountOnLine() {
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent sce) {
}
/**
* @see HttpSessionAttributeListener#attributeAdded(HttpSessionBindingEvent)
*/
//session参数添加 在线人数
public void attributeAdded(HttpSessionBindingEvent se) {
// System.out.println("session添加一个参数");
// System.out.println("监听到的添加属性名:" + se.getName());
//设置参数,若是添加的参数名不是"user",证明不是用户添加,而是session域中存储量其他的参数
if(se.getName().equals("user")) {
/*
* 添加注解消除掉警告 此警告是由于app.getAttribute()方法所获得的的 参数为Object类型,
* 若不是User对象则会出现异常,无法将参数值转换为List<User>类型
*/
@SuppressWarnings("unchecked")
List<User> users = (List<User>) app.getAttribute("users");
User user = (User) se.getValue();
users.add(user);
int count = (int) app.getAttribute("count");
count++;
app.setAttribute("count", count);
/*
* count为基本数据类型,若是不存储进参数里面,则会无法修改在线人数
* 而List<User>为引用数据类型,不需要存储回去亦可改变参数
*/
}
// System.out.println("count数目:" + count);
}
/**
* @see HttpSessionAttributeListener#attributeRemoved(HttpSessionBindingEvent)
*/
//session参数减少 离线人数
public void attributeRemoved(HttpSessionBindingEvent se) {
// System.out.println("有人注销.....");
@SuppressWarnings("unchecked")
List<User> users = (List<User>) app.getAttribute("users");
User user = (User) se.getValue();
users.remove(user);
int count = (int) app.getAttribute("count"</