网站年、日、月,周访问量统计 JSP怎么实现? 谢谢。

谁有它的实现[b]代码[/b], 想学习下。。 网上找了好久都没。 不胜感谢。

有一个方法可以一步到位进行查询。但限于在mysql上,使用BIT_COUNT函数。
下面给一个示例,资料来自互联网。

建表语句:

DROP DATABASE IF EXISTS test;
CREATE DATABASE test /*!40100 DEFAULT CHARACTER SET utf8 */;
USE test;

#

Table structure for table t1

#

CREATE TABLE t1 (
year year(4) default NULL,
month int(2) unsigned zerofill default NULL,
day int(2) unsigned zerofill default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

查询语句:

select year, month, BIT_COUNT(BIT_OR(1<<day)) as days from t1 group by year, month;

即按年月日自动统计并分组。

这要看是练习使用还是实际多大规模的使用了吧?访问量不高的话,网上应该有很多计数器的例子啊

拦截器
filter

一、这是jsp调用页testcount.jsp

<%@ page import="java.util.Date" %>
<%@ page import="count.CountXml" %>

计算器测试

<%
CountXml xmlcount=CountXml.getInstance();

 if (session.isNew()){
  xmlcount.addcount(new Date());//增加访问量 
  int n =xmlcount.getTotalCount();//取总访问量  
  String count=Integer.toString(n); 
  session.putValue("count",count);  

 } 

%>
您是第<%=session.getValue("count")%>位访问者

总访问量: <%=xmlcount.getTotalCount() %>

本年访问量:<%=xmlcount.getYearCount() %>

本月访问量:<%=xmlcount.getMonthCount() %>

本周访问量:<%=xmlcount.getWeekCount() %>

本日访问量:<%=xmlcount.getDayCount() %>

二、用到的两个类
1、CountXml.java

package count;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;
import java.util.Properties;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;

public class CountXml{
private String fileName = "h:\Tomcat 5.0\webapps\zz3zcwbwebhome\WEB-INF\xmlcount.xml";
private static CountObjectInf obj=null;
private static CountXml instance=null;

     public static CountXml getInstance(){ 
         if(instance==null){ 
                 instance=new CountXml(); 
          } 
          return instance; 
      } 

private CountXml() {
try{
obj=read(fileName);
}catch(Exception e){
System.out.println(e);
}

}

 public int getTotalCount(){ 
     return obj.getTotalCount(); 
 } 

 public int getDayCount() { 

return obj.getDayCount();
}

public int getMonthCount() {
return obj.getMonthCount();
}

public int getWeekCount() {
return obj.getWeekCount();
}

public int getYearCount() {
return obj.getYearCount();
}

public synchronized void addcount(Date da){//比较日期增加计数

         if (new SimpleDateFormat("yyyy-MM-dd").format(this.obj.date) 
                       .equals(new SimpleDateFormat("yyyy-MM-dd").format(da))) 
            this.obj.setDayCount(this.obj.getDayCount() + 1); 
        else 
            this.obj.setDayCount(1); 

        if (new SimpleDateFormat("yyyy-MM").format(this.obj.date) 
                        .equals(new SimpleDateFormat("yyyy-MM").format(da))) 
            this.obj.setMonthCount(this.obj.getMonthCount() + 1); 
        else 
            obj.setMonthCount(1); 

        Calendar ca = Calendar.getInstance(); 
        ca.setTime(da); 
        ca.setFirstDayOfWeek(Calendar.MONDAY); 

        if (ca.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY && !new SimpleDateFormat("yyyy-MM-dd").format(this.obj.date).equals(new SimpleDateFormat("yyyy-MM-dd").format(da))) 
             obj.setWeekCount(1); 
        else 
             obj.setWeekCount(obj.getWeekCount() + 1); 

        if (new SimpleDateFormat("yyyy").format(this.obj.date) 
                     .equals(new SimpleDateFormat("yyyy").format(da))) 
            this.obj.setYearCount(this.obj.getYearCount() + 1); 
       else 
            obj.setYearCount(1); 
       obj.setDate(da); 

obj.setTotalCount(obj.getTotalCount()+1);

obj.setTempCount(obj.getTempCount()+1);
if(obj.getTempCount()>=20){//只有当临时访问量大于等于20时才保存一次
obj.setTempCount(0);//临时计数器置0
write(fileName);

       } 
    } 

private void write(String fileName) {
try {
FileWriter writer = new FileWriter(fileName);
Marshaller.marshal(obj, writer);
writer.close();
} catch (Exception e) {
System.out.println(e);

            } 
    } 

    private CountObjectInf read(String fileName) throws Exception { 
            FileReader reader = new FileReader(fileName); 
            CountObjectInf result = (CountObjectInf)  

Unmarshaller.unmarshal(CountObjectInf.class, reader);
reader.close();
return result;
}
}

2、

package count;

import java.util.Date;
public class CountObjectInf {
// 总访问量合计
protected int totalCount = 0;
//日访问量
protected int dayCount = 0;
//周访问量
protected int weekCount = 0;
// 月访问量
protected int monthCount = 0;
//年访问量
protected int yearCount = 0;

//临时访问量
protected int tempCount=0;

protected Date date =new Date();

/**

  • @return */ public int getDayCount() { return dayCount; }

/**

  • @return */ public int getMonthCount() { return monthCount; }

/**

  • @return */ public int getTotalCount() { return totalCount; }

/**

  • @return */ public int getWeekCount() { return weekCount; }

/**

  • @return */ public int getYearCount() { return yearCount; }

/**

  • @param i */ public void setDayCount(int i) { dayCount = i; }

/**

  • @param i */ public void setMonthCount(int i) { monthCount = i; }

/**

  • @param i */ public void setTotalCount(int i) { totalCount = i; }

/**

  • @param i */ public void setWeekCount(int i) { weekCount = i; }

/**

  • @param i */ public void setYearCount(int i) { yearCount = i; }

/**

  • @return */ public Date getDate() { return date; }

/**

  • @param date */ public void setDate(Date date) { this.date = date; }

/**

  • @return */ public int getTempCount() { return tempCount; }

/**

  • @param i */ public void setTempCount(int i) { tempCount = i; }

}

楼上的不错

有成熟的开源框架,为什么不用,非要自己发明一个轮子,还不知道你的轮子能跑多远呢。

要是想学习的话,不用非得自己搞一个,去学习一下人家的不是更好。

个人觉得使用过滤器就可以了 ,具体的每天,每年,的访问量,可以再filter类中进行判断,mysql中的BIT_OR 这个还没用过,一会看看,对于一楼,感觉态度比我好多了,自己亲自体验,自己亲自写代码,值得学习

为什么不用 站长统计工具呢

用第三工具是个不错的选择。。。很多网站提供这样的服务。

推荐一个
51.la
正在使用中,非常好用

最好的方式是用GOOGLE ANALYTIC,目前最强大的最时髦的

只要在你要的jsp上加上

var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); try { var pageTracker = _gat._getTracker("UA-1577733-48"); pageTracker._trackPageview(); } catch(err) {}

这段代码就可以了.如果你对这个不了解你可以百度一下,有问题再跟我交流

2楼的方法很不错!!!

使用 session 监听器 是个很好的选择;