最近做网站的开发,需要做网站的访问量统计,以前也做过这方面的东西,不过以前做的时候是在asp下做的,而且只能实现简单的网站历史总访问量的统计,且访问的数据是放在文件一个文件中的,现在在jsp下实现,个人感觉如果再用文件的形式来存贮访问量的话,就有点辱没java语言的强大功能了,所以自己设计了一个网站访问量统计的程序,现帖出如下,希望对jsp开发的同学有帮助
 
      首先说一下设计的思想,由于访问量需要在每个页面进行显示,如果每次都进行文件的读写,或是查询数据库的话,显示是极其浪费资源的,所以以下的程序,采用了缓存的方式,对访问量进行缓存,并在更新缓存的同时同步更新库中的数据,(说点题外话,这一步读者可以自己视情况而改为每隔一定的时间向数据库写一次数据,这样会占用更少的资源,而达到同样的效果,这里笔者只所以没有采用这种方式,是因为当前的java虚拟机还没有一种释放缓存并通知用户程序的机制,也就是说,如果系统资源不足,或是缓存的资源长时间未利用时,java虚拟机很可能会释放缓存,而在释放缓存之前虚拟机并不会通知程序做善后的处理,从而造成数据的丢失,而且虚拟机释放资源的时间也是不确定的,因为如果系统资源充足,有可能即使不用,也会隔很长一段时间系统才会释放缓存资源,所以读者如果采用这种方式进行操作进,对更新数据库的时间间隔一定要把握好),不过再查询访问量的时候,先访问缓存的资源,如果没有再查数据库,并将查到的数据缓存,这样在一段时间间隔内再次显示的时候就不用再次查询数据库了。好了,闲话少说,下面介绍实现方法吧
 
步骤一、建一个表,表名任意,这里取名为:visitorcounter,当然读者可以自己取一个更加规范的数据库表名,表的结构如下所示:

+-------+------------------+------+-----+------------+----------------+
 | Field | Type             | Null | Key | Default    | Extra          |
 +-------+------------------+------+-----+------------+----------------+
 | id    | int(11) unsigned | NO   | PRI | NULL       | auto_increment |
 | vdate | date             | NO   |     | 2000-01-01 |                |
 | vnum  | int(11)          | NO   |     | 0          |                |
 +-------+------------------+------+-----+------------+----------------+


步骤二、建立一个java类,名字也为:visitorcounter,这个文件名字读者也是任意起,按照自己的规范能明白其含义即可,(注意以下在数据库连接的时候使用了数据库连接沲来进行连接,相应的的类可见我博客数据连接沲的应用)类的内容如下:

package com.hdzx.pub;
 import java.sql.ResultSet;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 public class VisitorCounter {
  private final static String TABLE_NAME = "visitorcounter";
  private static String today = null;
  private static long today_num = 0;
  private static long total_num = 0;
  //加载访问量
  public static void loadNum(){
   if(total_num<1)
    loadTotalNum();
   if(today_num<1)
    loadToadyNum();
  }
  //加载今日访问量
  private static void loadToadyNum() {
   // TODO Auto-generated method stub
   DBConnect db = null;
   ResultSet rs = null;
   if(today==null)
    today = getTodayDate();
   String sql = "select vnum from "+TABLE_NAME+" where vdate='"+today+"'";
   try {
    db = new DBConnect();
    rs = db.executeQuery(sql);
    if(rs.next()){
     today_num = rs.getLong("vnum");
    }
    else
    {    
     sql = "insert into "+TABLE_NAME+"(vdate,vnum) values('"+today+"',0)";
     db.executeUpdate(sql);
     today_num = 0;
    }
   } catch (Exception e) {
    // TODO: handle exception
    today_num = 0;
    System.out.println("com.hdzx.pub~VisitorCounter.incTotalCounter:获得访问人数");
   }
  }
  //加载总访问量
  private static void loadTotalNum() {
   // TODO Auto-generated method stub
   // TODO Auto-generated method stub
   DBConnect db = null;
   ResultSet rs = null;
   if(today==null)
    today = getTodayDate();
   String sql = "select vnum from "+TABLE_NAME+" where id=1";
   try {
    db = new DBConnect();
    rs = db.executeQuery(sql);
    if(rs.next()){
     total_num = rs.getLong("vnum");
    }
    else
    {
     total_num = 0;
    }
   } catch (Exception e) {
    // TODO: handle exception
    total_num = 0;
    System.out.println("com.hdzx.pub~VisitorCounter.incTotalCounter:获得访问人数");
   }
  }
  //增加总的访问量
  private static int incTotalCounter(){
   int k = 0;
   DBConnect db = null;
   loadNum(); 
   total_num = total_num+1;
   String sql = "update "+TABLE_NAME+" set vnum="+total_num+" where id=1";
   try {
    db = new DBConnect();
    k = db.executeUpdate(sql);
   } catch (Exception e) {
    // TODO: handle exception
    System.out.println("com.hdzx.pub~VisitorCounter.incTotalCounter:增加访问人数");
   }
   return k;
  }
  //增加今日的访问量
  public static int incTodayCounter(){
   int k  = 0;
   DBConnect db = null;
   String sql = null;
   loadNum();
   today_num += 1;
   sql = "update "+TABLE_NAME+" set vnum="+today_num+" where vdate='"+today+"'";
   try {
    db = new DBConnect();
    k = db.executeUpdate(sql);
    if(k > 0)
     incTotalCounter();
   } catch (Exception e) {
    // TODO: handle exception
    System.out.println("com.hdzx.pub~VisitorCounter.incTotalCounter:增加访问人数");
   }
   return k;
  }
  //获得今天的日期
  private static String getTodayDate(){
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
   return sdf.format(new Date());
  }
  ///获得今日访问量
  public static long getTodayNum(){
   loadNum();
   return today_num;
  }
  //获得总的访问量
  public static long getTotalNum(){
   loadNum();
   return total_num;
  } 
 }


步骤三、经过以上的步骤后,在页面中加入以下的代码,就可以实现网站访问量的统计工作:

if(session.isNew())
        {
             VisitorCounter.incTodayCounter();
        }
       %>
       今日访问量:<%=VisitorCounter.getTodayNum() %><br/>
       总的访问量: <%=VisitorCounter.getTotalNum() %>