Servlet API里面有一个ServletContextListener的接口,它可以监听ServletContext对象的生命周期。
当Servlet容器启动或者终止的时候就会出发ServletContextEvent时间,这个事件就由ServletContextListener来处理。ServletContextListener接口中定义了处理ServletContextEvent事件的两个方法。
/**
Servlet容器启动web应用的时候就会调用此方法进行初始化,在初始化结束之后容器对Filter初始化
**/
contextInitialized(ServletContextEvent event)
/**
当Servlet容器终止web应用的时候调用这个方法。调用此方法之前会先小灰所有的Servlet和Filter
contextDestroyed(ServletContextEvent event)
**/
可以利用这个写一个统计网页被客户端访问的次数。
package ServletContextTest;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent sce){
System.out.println("helloapp application is Initialized.");
// 获取 ServletContext 对象
ServletContext context=sce.getServletContext();
try{
// 从文件中读取计数器的数值
BufferedReader reader=new BufferedReader(
new InputStreamReader(context.
getResourceAsStream("/count/count.txt")));
int count=Integer.parseInt(reader.readLine());
reader.close();
// 创建计数器对象
Counter counter=new Counter(count);
// 把计数器对象保存到 Web 应用范围
context.setAttribute("counter",counter);
} catch(IOException e) {
e.printStackTrace();
}
}
public void contextDestroyed(ServletContextEvent sce){
System.out.println("helloapp application is Destroyed.");
// 获取 ServletContext 对象
ServletContext context=sce.getServletContext();
// 从 Web 应用范围获得计数器对象
Counter counter=(Counter)context.getAttribute("counter");
if(counter!=null){
try{
// 把计数器的数值写到 count.txt 文件中
String filepath=context.getRealPath("/count");
filepath=filepath+"/count.txt";
PrintWriter pw=new PrintWriter(filepath);
pw.println(counter.getCount());
pw.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
}