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

  假若有这么一个需求,要记录全部用户访问某一页面的次数。web

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

  固然在数据库中直接保存也是能够的,但所以便要去单独建张表,往后用户访问相应页面都要去访问数据库维护该表有点不值得。服务器

  利用自定义ServletContextListener能够很方便作到这一点。思路以下:app

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

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

  

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文件中要配置xml

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

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

相关文章
相关标签/搜索