现在许多网站都有计数器, 您也许也很想拥有一个自己制作的计数器, 其实利用ASP您可以轻而易举地制作出自己的计数器。 不需要太多的专业知识,只要懂一点点HTML,Now, let's begin。
First, 我想先介绍一下ASP的内建(built-in)对象Application。Application对象用来存储变量或对象, 以便在网页再次被访问时(不管是不是同一个连接者或访问者), 所存储的变量或对象的内容还可以被重新调出来使用, 也就是说Application对于各个连接者和同一网站的asp文件来说是公用的。其存储的语法为: Application("变量名")=变量名 或 Set Application("对象名")=对象名 其调出的语法为: 变量名=Application("变量名") 或 Set 对象名=Application("对象名") 为了简便, 我们还可以把Application("变量名")直接当作变量来使用。
计数器不就是服务器每次向客户机的浏览器传送网页时在网页中加1嘛, 很简单, 假设我们用变量Num来计数, 则在asp文件中加入语句:“Application("Num")=Application("Num")+1”即可, 如下边的例子。
例1 计数器测试版 <html> <head> <title>计数器测试版</title> </head> <body> <p align="center">您是本网站的第 <font color="blue"> <% Application("Num")=Application("Num")+1 Response.Write Application("Num") %> </font> 位访问者</p> </body> </html>
就这么简单? Of course not。在程序访问共享变量时, 必须进行进程互斥, 否则将发生"与时间有关的错误",也就是进程同步问题。举例来说, 当有两个或两个以上的用户同时访问例1中的asp文件时, 它们同时让Application("Num")加1, 例如此时Application("Num")等于6, 两个或两个以上的用户同时访问后, Application("Num")的值却只是加了1(因为自增是在客户机分别运行的), Application("Num")等于7, 造成少加的错误, 导致计数语句Application("Num")=Application("Num")+1存储的访问者数将不再是准确的了。现在我们来改进一下, 使用Application对象的 "Lock" 和 "UnLock" 来解决这个问题, 请看例2。
例2 计数器改进版 <html> <head> <title>计数器改进版</title> </head> <body> <p align="center">您是本网站的第 <font color="blue"> <% Application.Lock Application("Num")=Application("Num")+1 Response.Write Application("Num") Application.UnLock %> </font> 位访问者</p> </body> </html>
Application.Lock是锁定对象Application, 使得除了正在访问此变量的用户(或正在运行的进程)外的其它用户(或进程)不能在此时同时访问它, 而Application.UnLock是在对Application("Num")进行修改后, 解除对Application对象的锁定。这样, 就不会出现"与时间有关的问题了", 从而达到进程互斥的目的,也就解决了上述问题。
但是, 新的问题随之迩来, Application对象是有时间限制的(默认是20分钟), 当超过限制的时间或服务器关机时, Application所记录的访问者数都会消失, 您的工作就前功尽弃了。所以,单纯依靠Application是不行的,该怎么办呢? 请看下集…… 上次我们说到要保存计数结果的问题, 单纯依靠Application是不行的, 我的做法是将计数的结果保存到一个文本文件(假设为Num.txt文件)中。具体步骤如下:
(1).在服务器上新建一个文本文件, 文件命名为"Num.txt"。打开该文件, 在其第一个字符中输入数字0, save, 这表示最初计数器的值为0;
(2).用Server.CreateObject(ASP的内建对象Server的"CreateObject函数")创建一个Scripting对象库中的FileSystemObject对象.语句为( 假设对象名为files): Set files=Server.CreateObject("Scripting.FileSystemObject")
(3).用对象files的"OpenTextFile函数"以只读方式打开一个文本文件Num.txt, 并创建一个文本文件对象(假设此对象名为"numtxt"),。此文本文件的路径由对象Server的"MapPath函数"确定(此函数将网络中的"虚拟路径"转换成服务器的"绝对路径")。语句为: Set numtxt=files.OpenTextFile(Server.MapPath("文件路径")) 上边语句中OpenTextFile函数可以有三个参数, 第一个参数是必选的, 其余两个未可选可不选。第一个参数为"文件路径"; 第二个参数为"打开方式", 其值可以为ForReading(或1)或ForAppending(或8), 只读方式为"ForReading", 是默认的方式; 第三个参数是当要打开的文件不存在时, 是否创建此文件, 其值可以是True(不存在则创建此文件)或False(反之)。
(4).用对象 numtxt 的"ReadLine"逐行读取出文件Number.txt中存储的数据, 并将其赋给Application("Num"), 接着用对象numtxt的"Close"关闭文件Number.txt。语句为: Application("Num")=numtxt.ReadLine numtxt.Close
(5).将Application("Number")加1,并将计数结果输出到客户机的浏览器上, 语句为: Application("Num")=Application("Num")+1 Response.Write Application("Num")
(6).用对象files的CreateTextFile函数创建一个新的文件Num.txt, 将原来的那个文件给覆盖掉, 并创建一个文件对象"numtxt": Set numtxt=files.CreateTextFile(Server.MapPath("文件路径"),True) 上述语句中CreateTextFile函数的第一个参数是"文件路径"; 第二个参数表示的是"是否覆盖原有的文件", 其值可以是True或False。
(7).用新创建的文件对象numtxt的 WriteLine 函数将Application("Num")写入新的Num.txt文件中去, 再用numtxt的"Close"将文件Number.txt关闭: numtxt.WriteLine(Application("Num")) numtxt.Close
如此一来,不论任何时候,访问量都可以准确安全的保存在文本文件中了。
例3 计数器正式版 <html> <head> <title>计数器正式版</title> </head> <body> <p align="center">您是本网站的第 <font color="blue"> <% Sub Numberpad() Set files=Server.CreateObject("Scripting.FileSystemObject") Set numtxt=files.OpenTextFile(Server.MapPath("/Num.txt")) Application("Num")=numtxt.ReadLine numtxt.Close Application("Num")=Application("Num")+1 Response.Write Application("Num") Set numtxt=files.CreateTextFile(Server.MapPath("/Num.txt"),True) numtxt.WriteLine(Application("Num")) numtxt.Close End Sub
Application.Lock Numberpad Application.UnLock %> </font> 位访问者</p> </body> </html>
|