用ASP编写计数器 杨俊 2001年 12期 首先我们应该知道计数器的原理是在上一次的数量上加1的一个过程,也就是说将ASP文件结束执行之后,能够把变量(对象)的内容记录下来。我们可以用下列语句将变量(对象)的内容储存在Application对象之中: Application("变量名称")=变量名称Set Application("对象名称") =对象名称 而下次网页重新启动时,则使用以下语句将变量(对象)的内容还原回来: 变量名称=Application("变量名称") Set 对象名称=Application("对象名称") 如果觉得编写以上的语句很烦,可以直接把Application("变量名称")当成变量使用,如: Application(counter")=Application("counter")+1 其作用相当于counter=counter+1, 所不同是Application对象的生命周期不会受限于网页的生命周期,所以Application("counter")的值在网页结束时还保留着。 假设我们提前将访问计数器存放在Application("counter")里面, 那么首页被启动一次,我们就将Application"counter"加1,这样就可以达到累计访问计数器的目的: <% Application("counter")= Application("counter")+ 1 %>
您是本站点第<%=Application"counter"%>位贵宾!
其实以上程序并不能完全正确地访问计数器,因为以上程序执行有三个步骤: 1.读取Application("counter")的值。 2.将读取的值加1。 3.将加1之后的值返回Application("counter")。 如果有两位上网者同时启动网页,并且同时执行了以上的步骤1,那么他们所读取的值相同(假设等于100),接着虽然也都执行了步骤2、3把加1的结果相加Application("counter")而得到101的结果,但实际上却少加了一次。 怎样解决这个问题呢?那就是不让任何两位上网者同时执行以上的程序,而要避免这个事情的发生,只要把程序改成: Application.Lock '锁定Application对象 Application.("counter")=Application("counter")+1 Application.unlock '解除Application对象的锁定 当某一程序执行了Application.Lock之后,其他程序便暂时不能使用Application对象,直到Application对象被解除锁定为止,所以我们把访问计数器加一的语句放在Application.Lock及Application.UnLock之间,便不会有计数器少加的情况发生了。 但是Application也不是无限期的,当服务器IIS/PWS关闭时,所累计的人次就会化为乌有。要克服这个问题,我们可以将访问计数器写到文件中,我写了一个Counter子程序,用途就是访问计数器写入到文件中,以上程序改成: <% Sub IncrementCounter ' 建立一个FileSystemObject对象 Set fs = Server.CreateObject"Scripting.FileSystemObject" counter_file = Server.MapPath("counter.txt") ' 启动counter.txt文件,并且读取记录在文件中的counter Set txt = fs.OpenTextFile(counter_file) Application("counter")= txt.ReadLine txt.Close ' 将计数器加1 Application("counter")= Application("counter") + 1 ' 将计数器写入counter.txt文件中 Set txt = fs.CreateTextFile(counter_file,True) txt.WriteLine(Application("counter")) txt.Close End Sub Application.Lock IncrementCounter ' 将访问计数器加1并写入到文件中 Application.UnLock %>您是本站第 <%=Application"counter"%> 位贵宾!
以上制作的访问计数器是以文字来输出的,如果我们想显示图形的访问计数器,只要把计数器的数值转换成图形计数器的HTML标记即可。 首先必须准备好0~9共10个阿拉伯数字的图形文件,接下来的工作是编写程序将数值转换成图形的HTML标记: <% Application.Lock Application("counter")= Application("counter")+ 1 Application.UnLock Function GCounter(counter) Dim S,i,G S = CStr(counter)'先将数值转换成字符串 '逐个取字符串S的每个字节,然后串成图形标记 For i = 1 to Len(S) G = G & "" Next GCounter = G End Function %>您是本站第 <%=GCounter(Application("counter"))%> 位贵宾!
到此为止,计数器完整的制作过程介绍完了,还不错吧!如你也是ASP的爱好者,请来信yjtom@yeah.net与我交流!