设为首页
收藏本站
联系我们
当前位置:首页 >> 技术学院 >> 文章正文
用ASP制作计数器
来源:互联网 作者:佚名 添加时间:2007-3-23 10:38:32 选择字体大小:

    现在的网站都有计数器, 您也许也很想自己制作一个计数器, 其实利用ASP, 您将可以轻而易举地制作出自己的计数器。OK, 既然您选择了ASP, 那我就不能让您失望, 是吧?我们现在就开始制作简单的计数器。

    首先, 我先介绍一下ASP的内建(built-in)对象Application。Application对象用来存储变量或对象, 以便在网页再次被访问时(不管是不是同一个连接者或访问者), 所存储的变量或对象的内容还可以被重新调出来使用, 也就是说Application对于各个连接者和同一网站的asp文件来说是公用的。其存储的语法为:
        Application("变量名")=变量名         或         Set Application("对象名")=对象名
    其调出的语法为:
        变量名=Application("变量名")         或         Set 对象名=Application("对象名")
    为了简便, 我们还可以把Application("变量名")直接当作变量来使用。

    计数器不就是服务器每次向客户机的浏览器传送网页时在网页中加1嘛, 很简单, 假设我们用变量Number来计数, 则在asp文件中加入语句:“Application("Number")=Application("Number")+1”即可, 如下边的例6。

例6 一个简单的计数器
<html>
<head>
<title>ASP示例6</title>
</head>
<body>
<p align="center">您是本网站的第
<font color="blue">
<%
Application("Number")=Application("Number")+1
Response.Write Application("Number")
%>
</font>
位访问者</p>
</body>
</html>

    难道就这么简单? 答案当然是"NO!"。我记得我们上"操作系统"这门课时, 就学过进程同步的问题, 在程序访问共享变量(这些程序所构成的区域称为"临界区域")时, 必须进行进程互斥, 否则将发生"与时间有关的错误", 也就是说, 当有两个或两个以上的用户同时访问例6中的asp文件时, 它们同时让Application("Number")加1, 例如此时Application("Number")等于6, 两个或两个以上的用户同时访问后, Application("Number")的值却只是加了1, Application("Number")等于7, 造成少加的错误, 那是由于他们所读取的Application("Number")的值都是6, 所以计数语句Application("Number")=Application("Number")+1存储的访问者数将不再是准确的了。不信您可以试一下。现在我们来改进一下, 我们要使用Application对象的 "Lock方法" 和 "UnLock方法" 来解决这个问题, 请看下例。

例7 改进的计数器
<html>
<head>
<title>ASP示例7</title>
</head>
<body>
<p align="center">您是本网站的第
<font color="blue">
<%
Application.Lock
Application("Number")=Application("Number")+1
Response.Write Application("Number")
Application.UnLock
%>
</font>
位访问者</p>
</body>
</html>

    Application.Lock是锁定对象Application, 使得除了正在访问此变量的用户(或正在运行的进程)外的其它用户(或进程)不能在此时同时访问它, 而Application.UnLock是在对Application("Number")进行修改后, 解除对Application对象的锁定。这样, 就不会出现"与时间有关的问题了", 从而达到进程互斥的目的。到此, 上述问题就解决了。

    但是, 新的问题有出来了, Application对象是有时间限制的(默认是20分钟), 当限制的时间或IIS/PWS被关闭了, 或服务器关机了, 都会使Application所记录的访问者数消失, 您的工作就前功尽弃了, 没关系, 我将在下一个教程中解决这个问题。

教程五、用ASP制作计数器(二)
 

    上次我们说到要保存计数结果的问题, 单纯依靠Application是不行的, 我的做法是将计数的结果保存到一个文本文件(假设为Number.txt文件)中。具体步骤如下:

    (1).首先在www根目录(IIS/PWS默认的www的根目录为"C:\InetPub\wwwroot")下新建一个文本文件, 将文件命名为"Number.txt", 并打开文件, 在其第一个字符中输入数字0, 然后将文件关闭, 这表示最初计数器的值为0;

    (2).用Server.CreateObject(ASP的内建对象Server的"CreateObject函数")创建一个Scripting对象库中的FileSystemObject对象, 假设此对象名为files, 则此步骤的语句为:
        Set files=Server.CreateObject("Scripting.FileSystemObject")

    (3).用对象files的"OpenTextFile函数"以只读方式打开一个文本文件Number.txt, 并创建一个文本文件对象(假设此对象名为"numtxt"), 此文本文件的路径由对象Server的"MapPath函数"确定, 此函数将网络中的"虚拟路径"转换成服务器的"绝对路径", 例如:Server.MapPath("/Number.txt")指向的是服务器的www根目录(IIS/PWS默认的www的根目录为"C:\InetPub\wwwroot")下的文件Number.txt。此步骤的语句为:
        Set numtxt=files.OpenTextFile(Server.MapPath("/Number.txt"))
上边语句中OpenTextFile函数可以有三个参数, 第一个参数是必选的, 其余两个未可选可不选。第一个参数为"文件路径"; 第二个参数为"打开方式", 其值可以为ForReading(或1)或ForAppending(或8), 只读方式为"ForReading", 是默认的方式; 第三个参数是当要打开的文件不存在时, 是否创建此文件, 其值可以是True(不存在则创建此文件)或False。

    (4).用对象 numtxt 的"ReadLine方法"逐行读取出文件Number.txt中存储的数据, 并将其赋给Application("Number"), 接着用对象numtxt的"Close方法"关闭文件Number.txt。此步骤的语句为:
        Application("Number")=numtxt.ReadLine
        numtxt.Close

    (5).将Application("Number")加1,并将计数结果输出到客户机的浏览器上, 此步骤的语句是:
       Application("Number")=Application("Number")+1
        Response.Write Application("Number")

    (6).用对象files的CreateTextFile函数创建一个新的文件Number.txt, 将原来的那个文件给覆盖掉, 并创建一个文件对象"numtxt":
        Set numtxt=files.CreateTextFile(Server.MapPath("/Number.txt"),True)
上边语句中CreateTextFile函数的第一个参数是"文件路径"; 第二个参数表示的是"是否覆盖原有的文件", 其值可以是True或False。

    (7).用新创建的文件对象numtxt的 WriteLine 函数将Application("Number")写入新的Number.txt文件中去, 再用numtxt的 Close 方法将文件Number.txt关闭:
        numtxt.WriteLine(Application("Number"))
        numtxt.Close

    好了, 每个步骤我都做了详细的说明, 现在就让我们自己建立一个函数 NumberAppend, 用它来完成 "读写计数并且加1" 的工作。下例中我把这个计数器整个完整地写了出来, 请看:

例8 用文本文件存储数据的计数器
<html>
<head>
<title>ASP示例8</title>
</head>
<body>
<p align="center">您是本网站的第
<font color="blue">
<%
Sub NumberAppend()
    Set files=Server.CreateObject("Scripting.FileSystemObject")
    Set numtxt=files.OpenTextFile(Server.MapPath("/Number.txt"))
    Application("Number")=numtxt.ReadLine
    numtxt.Close
    Application("Number")=Application("Number")+1
    Response.Write Application("Number")
    Set numtxt=files.CreateTextFile(Server.MapPath("/Number.txt"),True)
    numtxt.WriteLine(Application("Number"))
    numtxt.Close
End Sub

Application.Lock
NumberAppend
Application.UnLock
%>
</font>
位访问者</p>
</body>
</html>









Copyright©2003-2014 www.haili.net All Rights Reserved 北京香山红叶工作室 版权所有
建议使用环境:Windows分辨率1024x768 浏览器IE5.5以上版本
合作伙伴 广告服务 服务项目 联系方式 关于我们 浏览量: