`
bolovesang
  • 浏览: 16942 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

两个简单网站计数器的比较

    博客分类:
  • JSP
阅读更多
第一个:
<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.io.*"%>
<%!
	// 读取文件
	public int load(String path){
		int temp = 0 ;
		try{
			File f = new File(path) ;
			BufferedReader buf = new BufferedReader(new InputStreamReader(new FileInputStream(f))) ;
			String str = buf.readLine() ;
			temp = Integer.parseInt(str) ;
			buf.close() ;
		}catch(Exception e){}
		return temp ;
	}
	public synchronized void save(int c,String path){	// 需要同步
		try{
			File f = new File(path) ;
			PrintStream ps = new PrintStream(new FileOutputStream(f)) ;
			ps.print(c) ;
			ps.close() ;
		}catch(Exception e){}
	}
%>
<%
	String path = getServletContext().getRealPath("/") + "count.txt" ;
	int count = load(path) ;
%>
<%
	if(session.isNew()){		// 如果是第一次访问
		save(++count,path) ;
	}
%>
<h2>您是第位<%=count%>访问者!!</h2>



第二个:
<%@ page contentType="text/html" pageEncoding="GBK"%> 
<%@ page import="java.io.*"%> 
<%@ page import="java.util.*"%> 
<%@ page import="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 = new Scanner(new FileInputStream(file)) ; 
    if(scan.hasNext()){ 
     count = new BigInteger(scan.next()) ; 
    } 
    scan.close() ; 
   } else { // 应该保存一个新的,从0开始 
    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"; // 这里面保存所有的计数的结果
 System.out.println(fileName) ; 
File file = new File(fileName) ; 
if(session.isNew()){ 
  synchronized(this){ 
   count = load(file) ; // 读取 
   count = count.add(new BigInteger("1")) ; // 再原本的基础上增加1。 
   save(file,count) ; 
  } 
} 
%> 
<h2>您是第<%=count==null?0:count%>位访客!</h2> 
</body> 
</html> 


    2个页面都是用application完成的一个网站的计数器操作,每次当有新的用户来的时候,就要求记录的数字加1,在用来第一次来的时候进行计算.在WEB根目录中创建count.txt的文件.
    application保存的内容可以让所有人共同访问,getServletContext()方法就是application. getRealPath方法可以取得虚拟目录对应的绝对路径.
    application是ServletContext接口的对象,表示的是整个容器的上下文.

    通过IO操作,读取count.txt中的数字并保存.两者的save方法基本相似,但在load方法上有所不同,第一个只是简单的读取了count.txt中的内容,而第二个在读取时判断的文件的完整性,而且使用了BigInteger作为返回类型,有利于大流量的访问统计.
1
0
分享到:
评论
4 楼 canghailan 2012-03-02  
BigInteger也没什么必要,long完全足够了,100亿人每分钟访问一次都能撑上1000多年的。
3 楼 canghailan 2012-03-02  
你这么做,性能够呛啊:每次访问,synchronized里还有IO。
第一段代码里的同步貌似还有些问题。
最简单的做法就是bolovesang说的缓存,可以使用static AtomicLong,服务器启动时读取,停止时写回。
2 楼 bolovesang 2012-03-02  
mfkvfn 写道
不需要每次写文件。
在服务器启动时从文件读取一次缓存在Java单例中,每次只用读取和修改这个缓存就可以了。服务器停止的时候写回到文件中。
只做一次读取和写入了。其它时候都是操作内存。


读取缓存也是种好方法,适用于在日维护或周维护时的流量统计,但对于实时的流量统计,还是要进行文件读取吧?
1 楼 mfkvfn 2012-03-02  
不需要每次写文件。
在服务器启动时从文件读取一次缓存在Java单例中,每次只用读取和修改这个缓存就可以了。服务器停止的时候写回到文件中。
只做一次读取和写入了。其它时候都是操作内存。

相关推荐

    JAVAWEB网站在线人数计数器

    这两个监听器在Servlet容器启动和关闭时,以及用户会话创建和销毁时分别触发相应的回调方法。 - `contextInitialized()`方法在Servlet容器启动时执行,初始化在线人数计数器并将初始值设置为0,存储在...

    网站计数器--jsp动态网站开发技术与实践

    在这个主题中,我们将深入探讨JSP的核心概念、动态网站开发的基本流程以及如何实现一个简单的网站计数器。 首先,JSP是基于Java的服务器端脚本语言,它将HTML、XML或其他标记语言与Java代码结合,使得开发者能够在...

    vuex简易计数器

    【vuex简易计数器】是一个使用Vue.js和Vuex框架构建的简单示例应用,主要展示如何在Vue组件之间共享状态和管理数据流。Vuex是Vue.js的一个官方插件,它为Vue应用程序提供了集中式的的状态管理模式,帮助开发者更好地...

    模24计数器_quartusII_模24计数器_FPGAverilog_74390模24计数器_

    在Quartus II中,将这两个Verilog文件编译并综合,然后进行仿真。通过仿真波形图,我们可以直观地看到计数器在不同输入条件下的行为,验证其是否满足模24计数器的要求。 总的来说,这个项目提供了使用Quartus II和...

    简易计时计数器51单片机

    - **方式3**:仅对Timer1有效,两个8位定时器分别工作在方式0或方式1。 3. **计时器的编程** - **设置工作模式**:通过写入TMOD寄存器的不同位来选择定时器的工作模式。 - **设定初始值**:通过写入THx和TLx...

    计数器

    在这个场景下,它可能包含了如何设置和使用这两个计数器的详细步骤,包括如何在服务器上配置SSI支持,如何将计数器代码嵌入到网页中,以及如何查看和解释统计结果。 总的来说,"计数器一"和"计数器二"代表了两种...

    java简易计数器java简易计数器.doc

    Java 简易计数器由两个主要类组成:`Main` 类和 `MyFrame` 类。其中,`Main` 类是应用程序的入口点,负责创建 `MyFrame` 对象,而 `MyFrame` 类则是应用程序的主要类,负责创建图形用户界面和处理用户交互。 ...

    51单片机做的一个两位计数器

    标题中的“51单片机做的一个两位计数器”指的是使用51系列单片机设计的一个能够进行两位数字加减计数的装置。51单片机是微电子技术中广泛应用的一种8位微处理器,由Intel公司开发,现在主要由其他厂商生产,如Atmel...

    mfc简易加法计数器

    在"mfc简易加法计数器"项目中,我们将会探讨如何在Windows 7平台上使用MFC来开发一个简单的加法计算器。 **一、MFC基础** 1. **MFC架构**:MFC由多个部分组成,包括框架类、视图类、文档类、对话框类等。这些类为...

    单片机计数器led简单例子

    单片机计数器是电子工程领域中一个...通过这个简单的例子,我们可以学习到单片机基础操作、计数器原理、中断处理以及输入输出控制等关键知识。这不仅是一个很好的实践项目,也是进一步探索复杂嵌入式系统设计的基础。

    Struts网站计数器

    首先,我们需要设计一个简单的数据库表来存储网站的访问计数。这个表通常包含两个字段:`id`(主键,标识计数器)和`count`(整型,表示访问次数)。例如,创建一个名为`visits`的表,SQL语句如下: ```sql ...

    ASP.NET简单计数器

    在这个"ASP.NET简单计数器"的示例中,我们将探讨如何使用ASP.NET的两种关键概念——`Application`对象和`Session`对象来实现一个简单的访问计数功能。 首先,我们来看`Application`对象。在ASP.NET中,`Application...

    Struts网站计数器(附带数据库文件)

    5. **JSP页面**:创建两个JSP页面,一个用于显示计数器的值,另一个可能是用于触发计数器增加的页面。在显示计数器值的页面中,可以通过`&lt;jsp:useBean&gt;`和`&lt;jsp:getProperty&gt;`标签来获取ActionForm中的计数器值。 6...

    memcache实现网站全局计数器

    2. **分桶计数**:在高并发场景下,为了避免单个计数器的性能瓶颈,可以使用多个计数器(分桶),每个桶负责一部分流量,定期进行汇总。 3. **持久化**:虽然Memcached数据存储在内存中,但可以通过定期将计数器数据...

    一款小巧的网站条形码计数器

    总的来说,这款“小巧的网站条形码计数器”是一款针对个人或小型网站的简易统计工具,旨在提供基本的访问量统计,帮助网站管理者获取直观的数据反馈,进行有效的网站管理和优化。对于那些不需要复杂分析功能,只需要...

    jsp+javaBean的计数器

    本文将详细介绍如何使用jsp和javaBean技术实现一个简单的网站访问计数器功能。此计数器适用于初学者,不仅可以帮助理解jsp的基本用法,还能加深对javaBean在实际项目中的运用。以下内容将涵盖项目的整体架构、各个...

    Qt实现2个计数器页面,通过菜单切换

    在本文中,我们将深入探讨如何使用Qt框架来创建一个具有两个计数器页面的应用程序,并通过菜单栏进行页面切换。Qt是一个跨平台的C++图形用户界面库,它提供了丰富的功能,可以方便地构建桌面、移动甚至嵌入式系统的...

    用vhdl设计的数字频率计数器

    本设计使用VHDL语言实现了一个简单的三位显示的数字频率计数器,且已经通过了综合验证,这意味着该设计可以成功地在硬件上实现。 首先,我们来看二分频模块(div_2)。二分频是频率计数器的基础,它将输入时钟...

    环形计数器、扭环计数器(内含文档及verilog HDL代码)

    扭环计数器,也称为扭环形计数器,与环形计数器类似,但其反馈路径不是简单的反相器,而是通过多个反相器和非门组合,形成一个“扭环”形状的逻辑路径。扭环计数器可以实现非模2的计数,即它的计数步长可以是任意正...

Global site tag (gtag.js) - Google Analytics