金桥科普  
设为首页 关于我们 邮箱登录
科普聚焦时代科技科普生活科学技术自然科学航空航天科技博览历史考古电脑IT
您现在的位置: 首页 >> 科普频道 >> 技巧实践 >> 文章详情
学习用ASP编写计数器(下)

aT Studio Sherlock 赛迪网 2002-02-02

如何显示

    一个问题比一个简单,要么文字要么图象,再明显不过。很可惜ASP没有什么太强大的图象操作的语句例如合并之类,所以如果要通过显示图象表示访客数就只能一个数字一个数字往上贴了。如果是要显示文字就简单多了,别告诉你不知道……既然两个都不是什么难事,等会就一起讲解吧

    好了,几个可能会碰到的麻烦问题都已经搞定了,想必你已经是摩拳擦掌跃跃欲试了,我们先从简单的做起吧。我采用的方法是给出代码,再一一讲解。

代码实例

    差点忘了说使用什么编写工具了。其实只要你熟练了一个记事本足以解决问题,就是看起来头大。我偏爱使用UltraEdit这个功能强大的文本编辑器,但是她毕竟只是个"文本"编辑器,如果是较大的ASP工程就一定要使用带有调试功能的Ms InterDev了,不过本人太懒至今没用过,^-^ 建议初学的人就使用UltraEdit或者InterDev。老鸟用什么?我好象还不能算老鸟,这个就不清楚了。

    代码一/最简单的文件存取及显示,不能插入HTML文件

<%

dim fso,f,no,I '定义变量绝对是个好习惯

Set fso = CreateObject("Scripting.FileSystemObject") '建立对象的实例

Set f = fso.OpenTextFile(Server.MapPath("count.no"), 1, True) '建立文本文件

if f.AtEndOfStream then '判断这个文件是否不存在

no=1

else

no=f.ReadLine

no=no+1

end if

f.Close

set f=fso.OpenTextFile(Server.MapPath("count.no"),2,True) '准备写

f.Write(no) '写入

f.Close

'改进标志1

no=CStr(no) '整齐数字

for i=1 to 5-len(no)

no="0"&no

next

%>

你是第<%=no%>个来客 

    以上包括在<% %>里的就是一段完整的ASP代码了,使用过Basic语言的人一定会发觉很是熟悉。这段代码其实大部分都是VBScript,真正用到ASP对象的只是寥寥几句话。一开始先建立一个文件系统对象的实例,CreateObject就起了这个作用,这里用Set而不是简单赋值是因为这里是对象引用,这个牵涉到对象的概念,不懂也没关系。现在有了fso这个文件系统对象实例,可以用它的OpenTextFile打开一个文本文件,它的使用格式如下:

object.OpenTextFile(filename[, iomode[, create[, format]]]) 

    filename是文件的路径,需要使用绝对路径,所以我们用了Server.MapPath()函数。Server就是我们常说的ASP六大对象之一,如其名主要负责服务器端的信息。MapPath函数可以把你给它的相对路径以当前ASP路径为参照化为绝对路径。例如当前这个ASP在c:web下,Server.MapPath("count.no")返回的就是"c:webcount.no",如果你给它的路径是以""开头的,那么就是把整个web服务的根目录作为参照,例如web服务的根目录是c:iisroot,那么Server.MapPath("count.no")就返回"c:iisrootcount.no",明白?

Iomode是文件输入/输出的方式,有三个值,它们是:

ForReading 1 以只读模式打开文件。不能对此文件进行写操作。 
ForWriting 2 以只写方式打开文件。不能对此文件进行读操作。 
ForAppending 8 打开文件并在文件末尾进行写操作。 

第一栏是常数,使用时应该用数字作为参数。

    Create的参数值是布尔值,代表如果没有这个文件是否需要新建,一般为了方便取True,默认是False,视具体情况而定了。

那么set f = fso.OpenTextFile(Server.MapPath("count.no"), 1, True)这句话的意思就是以只读模式打开当前目录下名为count.no的文件,如果不存在的话就新建一个,并且把这个文件的引用赋给f变量。不难理解吧。

    写程序要考虑到各种情况。如果这个文件不存在也就是说明第一次运行或出现故障,count.no文件里没有内容,那么数字从1开始记。AtEndofStream是文件对象的一个属性,标记这个文件是否往下已经没有东西可以读取。

    如果有内容的话,就用ReadLine函数读入一行数据并赋给no变量,并且把这个数字加一。然后关闭文件对象为了引用新的对象以写入新的数据。后面一句打开文本文件和前一次唯一的不同就是iomode为2,即只写,准备用Write函数将目前访客数保存。

    现在剩下的问题就是显示了。为了能够做到整齐美观,所以要用0把数字补到一个固定的位数,后面的for语句就是为了这个目的。接着是输出,ASP的输出语句就一个,那就是Response.Write,也是六大对象的一个方法,为了方便,这个方法就等于<%= %>注意=号。最后一?lt;font color=white size=3pt>你是第<%=no%>个来客本来只是句很普通的HTML语言,但中间的<%=no%>则是一句ASP语言,相当于Response.Write no,你看到的结果就是一个会随着访客增多渐渐增加的"活"的数字了。

    注意事项:因为count.no需要被不断地改写,所以必须"在Windows里"给Internet用户对这个文件的写权限,这是相当重要的。或者也可以用IIS里任务的权限设置做基本的权限配置,但手工设置还是不可或缺的。IIS里对文件的权限设置是Internet用户通过浏览器对某文件的访问权限,而Windows2000里的文件权限是这个用户运行的程序(例如这个计数器程序)对某文件的权限,意义是不同的。显然后者高于前者,所以这个设置有不少技巧性。你想让ASP程序可以访问count.no文件而用户通过浏览器却不能读取其内容,那么就在Windows中给用户对count.no的完全权限,在IIS中完全剥夺用户对这个文件的权利。其中奥妙还要各位自己体会了。

    一个最简单的计数器就完成了,如果你没糊涂的话,马上开始改进吧。例如想要显示图片的话可以先准备10小图片,分别是0到9的图象,命名为0.gif…9.gif,把前一个程序的改进标志1后面改成如下的代码:

for i=0 to 4

outstr="" & outstr

next

你是第<%=outstr%>个来客 


    这里没有什么新的技术了,主要就是一个简单的小算法,留给各位品味了。

    下面再看看如何能够把这个计数器嵌入网页。前面已经说过了原理,我现在就给出一个函数:

Function convertJS(strInput)

Dim temp

Temp=Replace(strInput,"""","""")

Temp="document.write(""" & temp & """);"

ConvertJS=temp

End Function 


这里的Replace函数的用法是

Replace(expression, find, replacewith) 

    从前到后分别是"在哪里找,找什么,用什么替换"。有一些可能是大家看不懂的,在VBScript里""(两个引号)在字符串里会自动存为一个引号,在JavaScript里"等于引号,所以这里才会出现这么多稀奇古怪的东西……没办法,谁叫这个年头语言多。

    现在只要把那段代码插到程序的最开头,当然要是在<%里面,然后把最后一句话改成<%=convertJS("你是第"&no&"个来客")%>

    就可以了,图象输出的同理。然后在页面的你想要加入计数器的地方输入,大功告成,看看你的成果吧。

    我想大部分读者学会编写这个基本的计数器以后以后会不满足,要是能够支持多用户就更好了。接下来就让我们接触ASP应用的核心,使用数据库来作为数据源。在编写之前我先介绍一些东西:

1. ASP使用内置的ADODB控件提供强大的对各种数据库/源的操作,可以使用SQL Server,MS Access,Dbase等各种数据库,你可以在控制面版->管理工具->数据源(ODBC)中找到可以支持的数据库类型的列表。而数据源按照调用方式又可以分为两类,分别是文件型和DSN型。前者可以通过直接输入路径调用,后者则是要通过ODBC设置将一DSN连接到一数据库上,然后在程序中以这个DSN的名称连接。前者的好处是不用服务器端的设置,适合免费空间的用户;后者则在效率和安全上高的多,也方便管理。幸好两者的调用差别不大,下面就给出:

<%

dim conn,connstr,nowpath

nowpath=Server.MapPath("databascount.mdb")

connstr1="Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & nowpath & ";" '这个是文件型

connstr2="count" 'count是系统DSN名称,可以自己设置。

set conn=server.createobject("ADODB.CONNECTION")

conn.open connstr1 '或者conn.open connstr2

%> 


conn就是一个数据库连接的对象引用,这个和前面的文件操作对象是一个性质,应该不难理解。然后通过open方法建立连接,下面为open方法的格式

connection.Open ConnectionString, UserID, Password, OpenOptions

ConnectionString就是说明连接类型的字符串,可以参照上面的connstr1和connstr2。UserID和Password是用于加密的或是有验证的数据源,如果要访问只要正确填写就可以。OpenOptions我们先不讨论。建立好连接后,以后我们所有的数据库操作都要通过这个对象引用conn来进行。

2. 我们这次使用一个简单的Access数据库来储存计数器的数据,如果你不会使用的话……快点去自学,别者就是初学Asp时顺便搞定这个的。这个数据库有一个表(Table)名称为countguest,里面有两个列(Field),分别是ID和guests,类型分别为自动编号和数字-长整型。主键自然是ID。你可以先输入几个数据项。

3. 调用计数器的方法没有太大的变化,但为了能够告诉计数器我们使用的是哪一个用户,要传输给她一个数据,格式为count.asp?id=x(x是对应数据库中的ID)。至于如何取得这个数据我们马上会提到

4. 依旧是权限问题,要求和前面一模一样,否则出问题你都不知道是怎么回事。吼吼。

好了,又到展示我们的代码的时候了

<%

Function convertJS(strInput)

Dim temp

Temp=Replace(strInput,"""","""")

Temp="document.write(""" & temp & """);"

ConvertJS=temp

End Function

dim conn,connstr,nowpath,dbNumber,id,no

'打开数据库连接

nowpath=Server.MapPath("databascount.mdb")

connstr="Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & nowpath & ";"

set conn=server.createobject("ADODB.CONNECTION")

conn.open connstr

'接受数据输入

id=Request.queryString("id")'取得名称为id的字串

if id="" or not IsNumeric(id) then Response.End '验证输入合法性,如果为空或不是数字就结束程序

set dbNumber=conn.Execute("Select * from countguest where id=" & id) '读入数据项

if dbNumber.EOF then Response.End '如果没有数据即不存在这个ID就结束程序

no=dbNumber("guests") '将访客数读入变量,输出用

conn.execute "Update countguest SET guests = guests + 1 where id="&id

%>

<%=convertJS("你是第"&no&"个来客")%> 


有了前面的经验,这次我把主要的注释都标上了。碰到的几个新方法和函数我来详细介绍一下:

Request.queryString(argName)

    聪明的读者一定看出来这个也是ASP六大对象之一,它的用途是把URL中附带的参数截取下来,像我们的"count.asp?id=1"后面的"id=1"就是。ArgName就是想要获取的参数的名称,如果有不止一个值会用逗号分隔开。如果直接使用Request.queryString就会把所有的参数都返回。

Response.End

    这句就相当于Basic里的End。开始说原理的时候不是提到ASP有一个缓存区么?这句话的作用就是把缓存里的东西全部输出,然后结束程序。

    程序里的dbNumber是一个对数据项的引用,注意是引用而不是实例。

set dbNumber=conn.Execute("Select * from countguest where id=" & id)

    这句话中的conn.Execute就是让数据库对象执行一句SQL命令,参数就是这个SQL命令。具体的SQL命令的说明可以参考有关书籍,这里我只是简单的介绍。Select语句的用途是调入符合条件的数据,其格式为:

SELECT [predicate] { * | table.* | [table.]field1 [AS alias1] [, [table.]field2 [AS alias2] [, ...]]}

FROM tableexpression [, ...] [IN externaldatabase]

[WHERE... ]

[GROUP BY... ]

[HAVING... ]

[ORDER BY... ]

[WITH OWNERACCESS OPTION] 

    其中*就是所有的数据项,where跟一个条件表达式,满足条件的才会被选中。From后跟的是表格名,例如我们这里的countguest。

后面的Update语句是用来更新数据的,用法为:

UPDATE table

SET newvalue

WHERE criteria; 

这个可以参照Select中有关的参数。

    如此,一个支持多用户的使用数据库的计数器就完成了,还不去好好试试?

    注意:你的ASP 的使用者可是各色各样的人,很难保证他们不会搞什么破坏,或者某些人作出无意之举。本程序一开始对输入参数的验证就是为了防止出错情况的出现。当然你可以用一个On Error解决掉一切问题,但是这不是一个负责的程序员的作风。写程序时要考虑到各种情况,这个是相当难做到的一点,需要经验的增加,以及,最重要的对自己程序的一颗负责和热爱的心。

后记

    显而易见这次介绍的两个程序都是以教学为目的,旨在教会大家一些简单的ASP应用。其实还有很多功能可以完善,例如添加用户,删除用户,修改记录以及记录下用户的IP使其不会短时间内重复记数。这些都是可以继续做下去的内容。只有想不到,没有做不到,只要明白这点和足够的耐心就一定能写出好的ASP程序。等到各位有好作品,别忘了让我也欣赏一下,写好程序可是一门艺术哦。加油吧!

PS: 本文所附的所有程序都可以自由使用。
  发表评论 写信给编辑 关闭窗口
同栏目内容
· 让你的电脑启动画面绚起来 2007-09-12
· 小技巧帮大忙 极点五笔 2007-09-05
· 如何提高迅雷的下载速度? 2007-09-03
· Vista小技巧 消除红眼 2007-09-03
· 千千静听实用小功能 2007-08-29
· 四大妙招帮你成功的隐藏文件 2007-08-20
相关内容
近期主推
我国首架自主产权飞机完成
·我国首架自主产权飞机完成
·机器人版"千手观音"惊艳亮相
·西藏发现青藏高原最大冰川群
·中日: "月亮女神"携手"嫦娥"
·行星大碰撞砸死恐龙催生人类
·美研制会飞汽车定价9万美元
近期热门
科学家解开中子星爆发之谜
·科学家解开中子星爆发之谜
·英海域惊现大龙虾为普通龙虾5倍
·新物种金蛙体表有剧毒
·我国嫦娥工程计划测量月球
·精神病药物可治多种癌症
·视觉震撼:来自海底的精灵
近期焦点
美国发现极其罕见的白化银鲛(图)
·美国发现极其罕见的白化银鲛(图)
·美国展出罕见连体双胎双头龟
·波罗的海发现罕见短吻真海豚
·能帮你做大扫除的机器人[组图]
·法老墓3000年前坚果保存完好
·广西发现罕见溶洞钟乳石有30万年
金桥科普是一个公益性栏目,内容由作者提供或摘自互联网,其目的是向广大网民普及科学技术知识。如果您发现本网站转载或摘编了您拥有著作权的作品,请通知我们(电话:023-63659911),我们立即删除。
关于我们 | 网站地图 | 用户注册 | 广告客户 | 招聘信息 | 业务信息
Copyright@2006-2009 JQInfo.com,WONDER. All Rights Reserved
重庆科技咨询中心.重庆网得信息技术有限公司.版权所有
Email:webmaster@jqinfo.com
重庆数据通信局提供网络带宽. 渝ICP备05002327号