zoukankan      html  css  js  c++  java
  • 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值。

  • 相关阅读:
    祭蟑螂文
    端午随笔
    有感于一个用户的留言
    jQuery UI dialog插件出错信息:$(this).dialog is not a function
    @@ERROR, BEGIN TRY/CATCH and XACT_ABORT
    检索 COM 类工厂中 CLSID 为{0002450000000000C000000000000046} 的组件时失败,原因是出现以下错误: 80070005。
    【SSB】使用命令行来检测Broker是否正常通信
    C#保留2位小数总结
    引用了混乱的组件或类库可能会导致WCF代理类无法正确生成
    [转]从属性赋值到MVVM模式详解
  • 原文地址:https://www.cnblogs.com/zuochengsi-9/p/7453415.html
Copyright © 2011-2022 走看看