一 .监听器(Listener)
监听器(Listener)可以监听客户端的请求、服务器端的操作。通过监听器可以自动触发一些事件,比如监听在线的用户数量。监听器对象可以在事件发生前、发生后做一些必要的处理。
Listener接口和Event类
在web.xml中配置监听器的格式如下:
<listener>
<listener-class>监听类</listener-class>
</listener>
在3.0以后 一般直接用注解即可
@WebListener
1.监听ServletContextListener的实例代码
/**
* ServletContextListener接口用于监听Servlet上下文的变化
* 其两个方法被称为“Web应用程序的生命周期方法”。在这两个方法中,
* 都需要一个ServletContextEvent类型的参数,该类只有以下一个方法。
* ■ ServletContext getServletContext():获得ServletContext对象。
*/
@WebListener
public class MyContextListener implements ServletContextListener{
public MyContextListener() {
}
/**
* 上下文初始化
* 当ServletContext对象创建的时候,将会调用此方法进行处理。
*
* @param sce
*/
public void contextInitialized(ServletContextEvent sce) {
logout("contextInitialized()-->ServletContext初始化了");
}
/**
* 上下文销毁
* 当ServletContext对象销毁的时候(例如关闭Web容器或者重新加载应用),将会调用此方法进行处理。
*
* @param arg0
*/
public void contextDestroyed(ServletContextEvent arg0) {
logout("contextDestroyed()-->ServletContext被销毁");
}
}
2.ServletAttributeListener接口
/**
*ServletAttributeListener接口用于监听ServletContext中属性的变化,
* 该接口提供3个方法,分别用于处理ServletContext中属性的增加、删除和修改。
*/
@WebListener
public class MyContextListener implements ServletContextAttributeListener {
public MyContextListener() {
}
/**
* 添加属性
* 当ServletContext中增加一个属性时,将会调用此方法进行处理。
* @param scae
*/
public void attributeAdded(ServletContextAttributeEvent scae) {
logout("增加了一个ServletContext属性:attributeAdded('" +
scae.getName()+ "', '" + scae.getValue() + "')");
}
/**
* 修改属性
* 当ServletContext中修改一个属性值时,将会调用此方法进行处理。
* @param scae
*/
public void attributeReplaced(ServletContextAttributeEvent scae) {
logout("某个ServletContext的属性被改变:attributeReplaced ('"
+scae.getName()+ "', '" + scae.getValue() + "')");
}
/**
* 移除属性
*当ServletContext中删除一个属性时,将会调用此方法进行处理。
* @param scae
*/
public void attributeRemoved(ServletContextAttributeEvent scae) {
logout("删除了一个ServletContext属性:attributeRemoved ('"
+scae.getName()+ "', '" + scae.getValue() + "')");
}
// 写日志信息
private void logout(String message) {
PrintWriter out = null;
try {
out = new PrintWriter(new FileOutputStream("C:\\log.txt",
true));
SimpleDateFormat datef = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String curtime = datef.format(new Date());
out.println(curtime + "::Form ContextListener: " + message);
out.close();
} catch (Exception e) {
out.close();
e.printStackTrace();
}
}
}
在应用中,如果监听类同时实现ServletContextListener和ServletContextAttributeListener两个接口,其工作流程如下:
01 Web应用启动的时候,contextInitialized(ServletContextEvent event)方法进行初始化。
02 如果在Application范围内添加一个属性,将会触发ServletContextAttributeEvent事件,通过AttributeAdded(ServletContextAttributeEvent event)方法进行处理。
03 如果在Application的范围内修改属性值,将会触发ServletContextAttributeEvent事件,通过AttributeReplaced(ServletContextAttributeEvent event)方法进行处理。
04 如果在Application的范围内删除一个属性,将会触发ServletContextAttributeEvent事件,通过AttributeRemoved(ServletContextAttributeEvent event)方法进行处理。
05 Web应用关闭时,contextDestroyed(ServletContextEvent event)方法进行卸载。
上下文监听器的工作流程如图所示。
注意在实际应用中,自定义的类可以实现ServletContextListener和ServletContextAttributeListener其中之一,从而完成特定的应用。