ServletContextListener接口

一、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

你可能感兴趣的:(servlet)