网站计数器

在一些博客或论坛里经常出现一些访问次数的字样,这就是通常说的网站计数器。进行网站计数器开发需要注意以下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位访客”,如下图所示:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章