Java 利用监听器来实现记录用户访问网站次数

  假如有这么一个需求,要记录所有用户访问某一页面的次数。

  最先想到的可能是在该Controller定义一个静态成员,然后在相应Action里自增。但这样有一个问题,就是Tomcat或者其他服务器重启的话,这个值是没办法保存的。

  当然在数据库中直接保存也是可以的,但因此便要去单独建张表,日后用户访问相应页面都要去访问数据库维护该表有点不值得。

  利用自定义ServletContextListener可以很方便做到这一点。思路如下:

      1 、在 Web 应用启动时从文件中读取计数器的数值,并把表示计数器的 Counter 对象存放到 Web应用范围内。存放计数器的文件的路径为helloapp/count/count.txt 。

      2 、在Web 应用终止时把Web 应用范围内的计数器的数值保存到count.txt 文件中。

  

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();  // 把计数器对象保存到 Web 应用范围  
  
       context.setAttribute("count",count);  
  
       } catch(IOException e) {  
  
          e.printStackTrace();  
  
       }  
  
   }  
  
   public void contextDestroyed(ServletContextEvent sce){  
  
       System.out.println("helloapp application is Destroyed.");  
  
       // 获取 ServletContext 对象  
  
       ServletContext context=sce.getServletContext();  
  
       // 从 Web 应用范围获得计数器 
  
       int count=(int)context.getAttribute("count");  
  
       if(count!=0){  
  
       try{  
  
          // 把计数器的数值写到 count.txt 文件中  
  
          String filepath=context.getRealPath("/count");  
  
          filepath=filepath+"/count.txt";  
  
          PrintWriter pw=new PrintWriter(filepath);  
  
          pw.println(count);  
  
          pw.close();  
  
         } catch(IOException e) {  
  
             e.printStackTrace();  
  
         }  
  
     }  
  
   }  
  
}   

同时在web.xml文件中要配置

<listener>  
<listener-class> ServletContextTest.MyServletContextListener<listener-class />  
</listener>

通过ServletContext对象便能获取到保存的count值。

posted @ 2017-08-31 10:41  leftcity  阅读(8612)  评论(1编辑  收藏  举报