一、ServletContextListener简介:
ServletContextListener 接口,监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。在 ServletContextListener 接口中定义了ServletContextEvent 事件的两个方法。
public abstract interface javax.servlet.ServletContextListener extends java.util.EventListener { // 容器初始化的时候调用 public abstract void contextInitialized(javax.servlet.ServletContextEvent arg0); // 容器destroyed的时候调用 public abstract void contextDestroyed(javax.servlet.ServletContextEvent arg0); }
二、ServletContextListener的使用
1、新建一个类继承ServletContextListener接口,实现它的两个抽象方法:
public class InitListener implements ServletContextListener { public void contextDestroyed(ServletContextEvent arg0) { } public void contextInitialized(ServletContextEvent context) { initConfig(context); } /** * 初始化系统配置 */ private void initConfig(ServletContextEvent context) { ServletContext sc = context.getServletContext(); try { loadConfig(sc); } catch (IOException e) { throw new SystemException("系统初始化配置错误"); } } /** *初始化系统参数 */ private void loadConfig(ServletContext sc) throws IOException { //从web.xml页面中获取config文件的路径 URL url = sc.getResource(sc.getInitParameter("config")); properties = new Properties(); InputStream inputStream=url.openStream(); try { properties.load(); } catch (IOException e) { } finally { if (inputStream != null) try { inputStream.close(); } catch (IOException e) { } } ConfigData configData = ConfigData.getInstance(); configData.setProtocolVersion(Integer.parseInt(properties.getValue("protocolVersion"))); configData.setReqSysNo(properties.getValue("reqSysNo")); configData.setPage(Integer.parseInt(properties.getValue("page"))); configData.setUploadTempPath(properties.getValue("upload.tempPath")); configData.setHttpPath(properties.getValue("httpPath")); configData.setBuildNo(properties.getValue("buildNo")); //将configData放置在ServletContext中,使整个web应用都能通过ServletContext上下文进//行访问 sc.setAttribute(Constants.SYSTEM_CONFIG, configData); }
}
2、web.xml配置
<listener> <listener-class>com.cnacex.pmgr.web.servlet.InitListener</listener-class> </listener> <context-param> <param-name>config</param-name> <param-value>/WEB-INF/config.properties</param-value> </context-param>
三、使用ServletContextListener来实现统计网页被客户端分文的数量
1、需求
书写一个类用于统计当Web 应用启动后,网页被客户端访问的次数。如果重新启动Web 应用,计数器不会重新从1 开始统计访问次数,而是从上次统计的结果上进行累加。
2、实现分析:
统计自Web 应用被发布后网页被客户端访问的次数,要求当Web 应用被终止时,计数器的数值被永久存储在一个文件中或者数据库中,等到Web 应用重新启动时,先从文件或数据库中读取计数器的初始值,然后在此基础上继续计数。
3.代码实现:
向文件中写入或读取计数器的数值的功能可以由自定义的 MyServletContextListener 类来完成,它具有以下功能:
A、在 Web 应用启动时从文件中读取计数器的数值,并把表示计数器的 Counter 对象存放到 Web应用范围内。存放计数器的文件的路径为helloapp/count/count.txt 。
B、在Web 应用终止时把Web 应用范围内的计数器的数值保存到count.txt 文件中。
public class MyServletContextListener implements ServletContextListener{ public void contextInitialized(ServletContextEvent sce){ System.out.println("应用已经初始化"); // 获取 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(); } } } }
web.xml 文件中, <listener> 元素用于向容器注册监听器:
<listener> <listener-class> ServletContextTest .MyServletContextListener<listener-class /> </listener>
原文地址:http://blog.csdn.net/zhaozheng7758/archive/2010/12/28/6103700.aspx