在JavaWeb中有个叫监听器的东西,这监听器主要用来监听三大对象:HttpServletRequest、HttpSession、ServletContext,每个对象对应着各自的监听器接口。监听器可以监听这三个对象中的对象创建、初始化与销毁信息的事件,也可以监听对象中的属性变更信息的事件,例如对象的属性添加或删除属性等变更信息。
所以会有六个主要的监听器接口,ServletRequestListener、ServletContextListener和HttpSessionListener接口是用于监听对象的创建与销毁信息。
ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口则是定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同。
配置监听器的方式有两种,第一种是以注解的方式配置,第二种则是以web.xml文件的方式配置。
一、注解
使用注解的方式配置监听器很简单,实现一个或多个监听器接口,然后写上@WebListener注解即可。
二、XML文件配置
使用web.xml文件配置监听器,示例如下:
<!--配置监听器(包名+类名)-->
<listener>
<listener-class>cn.edu.cuit.listener.OnLineCountListener</listener-class>
</listener>
三、监听器运作
代码示例:
package cn.edu.cuit.listener;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* @author fhzheng
* <h1> 监听器实现如下监听 </h1>
* <li> 1.ServletContextListener 上下文变更监听器
* <li> 2.HttpSessionListener 会话变更监听器
* <li> 3.HttpSessionAttributeListener 会话属性变更监听器
* <li> 4.当相应的对象发生变更时,就触发监听事件
*
*/
public class OnLineCountListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {
private ServletContext application = null; // 上下文对象
private ArrayList<String> users = null; // 用户列表
private HttpSession session = null; // 用户会话对象
private String user = null;
/**
* <li> 上下文的初始化
*/
public void contextInitialized(ServletContextEvent sce) {
this.application = sce.getServletContext();
this.application.setAttribute("users", new ArrayList<String>());
System.out.println("监听器日志:/t监听器完成上下文对象的获取");
System.out.println("监听器日志:/t监听器完成用户列表的初始化");
}
/**
* <li> 上下文的销毁
*/
public void contextDestroyed(ServletContextEvent sce) {
}
/**
* <li> session的创建
*/
public void sessionCreated(HttpSessionEvent se) {
System.out.println("监听器日志:/t一个Session创建了!");
}
/**
* <li> session的销毁
*/
public void sessionDestroyed(HttpSessionEvent se) {
session = se.getSession();
user = (String) session.getAttribute("username");
users = (ArrayList<String>) session.getServletContext().getAttribute("users");
for (String u : users) {
if (u.equals(user)) {
users.remove(u);
break;
}
}
session.invalidate();
System.out.println("监听器日志:/t一个Session被销毁掉了!");
}
/**
* <li> 属性的添加
*/
public void attributeAdded(HttpSessionBindingEvent se) {
users = (ArrayList<String>) application.getAttribute("users");
users.add(se.getValue().toString());
this.application.setAttribute("users", users);
System.out.println("监听器日志:/t一个属性添加完成了");
}
/**
* <li> 属性的移除
*/
public void attributeRemoved(HttpSessionBindingEvent se) {
}
/**
* <li> 属性的替换【更新】
*/
public void attributeReplaced(HttpSessionBindingEvent se) {
}
}
输出结果: