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值。

  • 相关阅读:
    装饰者设计模式
    Base64技术:把对象转变成字符串
    Android获取网络数据进行GZIP解压
    自定义Button成进度条
    Android:TextView最小行数设置
    介绍两个Android不常用的Drawable:GradientDrawable和 StateListDrawable
    Json介绍
    Android自定义XML属性
    Android手机图片适配问题
    AsyncTask
  • 原文地址:https://www.cnblogs.com/zuochengsi-9/p/7453415.html
Copyright © 2011-2022 走看看