在一些博客或论坛里经常出现一些访问次数的字样,这就是通常说的网站计数器。进行网站计数器开发需要注意以下3个问题:
1、网站的来访人数很多,所以必须用大整数来表示;
2、每个用户在第一次访问时需要计数,重复刷新页面不应该重复计数;
3、对网站访问量计数值的修改属于多线程操作,需要进行同步操作。
编写的模拟网站计数器的jsp代码如下所示:
<%@
page contentType="text/html" pageEncoding="GBK"%>
<%@
page import="java.io.*"%> <%--由于要使用IO操作,必须导入java.io包--%>
<%@
page import="java.util.*"%> <%--Scanner在java.util中定义--%>
<%@
page import="java.math.*"%> <%--BigInteger定义在java.math中--%>
<html>
<head>
<title>网站计数器</title>
</head>
<body>
<%!
BigInteger count = null;
%>
<%!//以下方法为了省事,直接在方法中处理了异常,而实际中要交给调用处处理
public BigInteger load(File file) { //读取计数文件
BigInteger count = null; //读取接受的数据
try {
if(file.exists()) {
Scanner scan = null;
scan = new Scanner(new FileInputStream(file)); //从文件中读取
if(scan.hasNext()) {
count = new BigInteger(scan.next());
//将内容放到BigInteger中
}
scan.close(); //关闭输入流
} else {
count = new BigInteger("0"); //第一次访问
save(file,count);
}
} catch(Exception e) {
e.printStackTrace();
}
return count; //返回读取后的数据
}
public void save(File file,BigInteger count) {
try {
PrintStream ps = null; //定义输出流对象
ps = new PrintStream(new FileOutputStream(file)); //打印流对象
ps.println(count);
ps.close();
} catch(Exception e) {
e.printStackTrace();
}
}
%>
<%
String fileName = this.getServletContext().getRealPath("/") + "count.txt";
//文件路径
File file= new File(fileName);
if(session.isNew()) {
synchronized(this) {
count = load(file);
count = count.add(new BigInteger("1")); //自增操作
save(file,count);
}
}
%>
<h3>你是第<%=count==null?0:count%>位访客</h3>
<%--输出内容--%>
</body>
</html>
复制代码
这段代码的运行结果为:
当第一次访问这个页面显示“你是第1位访客”,刷新页面显示不变,如下图所示;
关闭浏览器用新的浏览器打开这个页面时显示“你是第2位访客”,如下图所示:
更多 java学习,java资料 http://techfoxbbs.com
原文地址:http://melorogee.blog.51cto.com/6909056/1632654