下面编写一个实例,使它能够对ServletContext以及属性进行监听。由以上介绍可知,该类需要实现ServletContextAttributeListener和ServletContextListener接口类,其详细代码如下:
package servlet;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener
implements ServletContextListener,ServletContextAttributeListener{
private ServletContext context = null; //定义一个ServletContext对象变量,赋为null
public void contextInitialized(ServletContextEvent s) {
//TODO 该方法实现了ServletContextListener接口定义的方法,对ServletContext进行初始化
this.context = s.getServletContext(); //初始化一个ServletContext对象
print("ServletContext初始化......"); //打印出该方法的操作信息
}
public void contextDestroyed(ServletContextEvent s) {
//TODO 该方法实现了ServletContextListener接口类定义方法,用于释放ServletContext对象
this.context = null;
print("ServletContext被释放......");
}
public void attributeAdded(ServletContextAttributeEvent sa) {
//TODO 当上下文添加属性时,将调用该方法。这里只是将添加的属性信息打印出来
print("增加ServletContext对象的一个属性:attributeAdded('"+sa.getName()+"',' "+sa.getValue()+"')");
}
public void attributeRemoved(ServletContextAttributeEvent sa) {
//TODO 当把ServletContext中的某个属性删除时,调用该方法
print("删除ServletContext对象的某一个属性:attributeRemoved('
"+sa.getName()+"','")");
}
public void attributeReplaced(ServletContextAttributeEvent sa) {
//TODO 当上下文进行属性值更新时,将调用该方法
print("更改ServletContext对象的某一个属性:attributeReplaced('
"+sa.getName()+"','"+sa.getValue()+"')");
}
private void print(String message){
//调用该方法在txt文件中打印出message字符串信息
PrintWriter out = null;
try{
out = new PrintWriter(new FileOutputStream("D:\\output.txt",true));
out.println(new java.util.Date().toLocaleString()+" ContextListener: "+message);
out.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
程序说明:该监听器类实现了ServletContextAttributeListener和ServletContextListener两个接口类中的5个方法:
● contextInitialized(ServletContextEvent s)方法用来初始化ServletContext对象。
● contextDestroyed(ServletContextEvent s)方法在上下文中删除某个属性时调用。
● attributeAdded(ServletContextAttributeEvent sa)方法在上下文中添加一个新的属性时调用。
● attributeReplaced(ServletContextAttributeEvent sa)方法在更新属性时调用。
● attributeRemoved(ServletContextAttributeEvent sa)方法在上下文中删除某个属性时会被调用。
在使用这个监听器之前还需要在Web模块中的web.xml配置文件中进行声明,代码如下:
<listener>
<listener-class>servlet.MyServletContextListener</listener-class>
</listener>
接下来就编写JSP程序来操作ServletContext的属性,看看监听器程序作出什么反应,该JSP的一段代码如下:
<%
out.println(“Test ServletContextListener”);
application.setAttribute(“userid”,”zzb”); //添加一个属性
application.setAttribute(“userid”,”zzb2”); //替换掉已经添加的属性
application.removeAttribute(“userid”); //删除该属性
%>
代码说明:当第一次添加属性userid时,监听器调用contextInitialized(ServletContextEvent s)初始化监听方法和attributeAdded(ServletContextAttributeEvent sa)添加属性监听方法。
可以查看D根目录下的output.txt文件内容,如下:
2006-7-12 14:07:50 ContextListener: ServletContext初始化......
2006-7-12 14:13:55 ContextListener: 增加ServletContext对象的一个属性:attributeAdded('userid','zzb')
2006-7-12 14:13:55 ContextListener: 更改ServletContext对象的某一个属性:attributeReplaced ('userid','zzb2')
2006-7-12 14:13:55 ContextListener: 删除ServletContext对象的某一个属性:attributeRemoved ('userid')
该log文件记录了监听器所做的动作。