谁有它的实现[b]代码[/b], 想学习下。。 网上找了好久都没。 不胜感谢。
有一个方法可以一步到位进行查询。但限于在mysql上,使用BIT_COUNT函数。
下面给一个示例,资料来自互联网。
建表语句:
DROP DATABASE IF EXISTS test
;
CREATE DATABASE test
/*!40100 DEFAULT CHARACTER SET utf8 */;
USE test
;
#
#
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();
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
}
楼上的不错
有成熟的开源框架,为什么不用,非要自己发明一个轮子,还不知道你的轮子能跑多远呢。
要是想学习的话,不用非得自己搞一个,去学习一下人家的不是更好。
个人觉得使用过滤器就可以了 ,具体的每天,每年,的访问量,可以再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 监听器 是个很好的选择;