第 5章 ASP的第一次接触
ASP动态网页设计教程
2
第 5章 ASP的第一次接触在微软的相关产品中,Visual Basic是微软最引以为骄傲的产品,由过去 DOS环境下的 Quick BASIC 到
Windows 环境下的 Visual Basic就可以看出端倪。因为
BASIC是 Microsoft 总裁 Bill Gates在个人计算机上所编写的第一个程序语言。在互联网盛行的今天,微软除了将 Visual Basic的技术集成到 Office产品上以外,对于互联网的运用也是采用同样的解决方案。它将 VB的语法引进此领域并加以修改,使其适合 Web 环境,这个产品就是 ASP。
3
第 5章 ASP的第一次接触由于 ASP采用 Visual Basic 语法,因此如果您已了解
Visual Basic 或 Visual Basic 相关的应用程序,相信您对
VBScript将会非常熟悉。即使您不懂 Visual Basic,一旦您开始学习 VBScript (上一章已做介绍 ),您就已经在学习 Visual Basic语言家族的程序设计了。
在本章中,作者将为您介绍 ASP的语法,并以范例的方式带您深入浅出地学习 ASP。随后我们还将针对
ASP提供的子程序及函数做一说明,让读者可以清楚地了解其应用。
4
第 5章 ASP的第一次接触
5.1 什么是 ASP
5.2 条件式
5.3 循环
5.4 内置函数
5.5 互联网的运行流程
5.6 子程序
5.7 函数
5.8 Include File应用
5
5.1 什么是 ASP
ASP的全名为 Active Server Page,它是 Microsoft在
Windows开发的动态网页脚本语言。因为它号称可以让服务器的网页动起来 (活化网站 ),故以 Active Server
Page命名。
说明,ASP是微软 Visual Basic家族中的一个成员,
它将 VBScript 的应用带到互联网,包括微软 IE浏览器的客户端 Script和微软的 IIS网络服务器端 Script均可使用。
6
5.1 什么是 ASP
5.1.1 在 HTML中加入 ASP程序代码
5.1.2 变量与常数
5.1.3 运算符
7
5.1 什么是 ASP
5.1.1 在 HTML中加入 ASP程序代码
ASP是一种脚本式的描述语言,默认的文件扩展名为,asp。在传统的 HTML文件加入 ASP程序代码,需要加入 ASP起始 <% 和结束 %> 的标记。请参考如下:
<HTML>
<BODY>
<%
' ASP程序代码写在这里
%>
</BODY>
</HTML>
当 Client端的浏览器要求 ASP文件时,IIS会将文件交由 Active Server处理 (解释并执行 ),待 ASP 程序将处理结果转换为 HTML文件后,送至 Client端的浏览器,再由浏览器根据 HTML的内容编排输出版面。
8
5.1 什么是 ASP
5.1.2 变量与常数变量为计算机内存位置的一块空间,在这个空间中,
可以保存程序执行过程中所产生的信息。 ASP中所有的变量都是没有数据类型的变量,也就是说变量的类型都是可变的数据类型。当我们将整数数据指定给变量,该变量就是整数变量;指定日期给该变量,该变量就是日期类型的变量。这种数据类型又称为 Variant 的数据类型。 Variant 是一个很特殊的数据类型,它可以随着使用方法的不同而存放不同的信息,所以它也是 ASP中所有函数返回值的惟一数据类型。
在 ASP程序中,变量的定义必须使用 Dim。由于变量都没有数据类型,因此定义时非常简单。
9
5.1 什么是 ASP
5.1.2 变量与常数变量的定义方式如下:
Dim Index
Dim I,J,K
在实际应用上,如果变量不加定义并不是一个好的方法,因为您可能会在使用时拼错了变量的名称,
而产生不可预期的执行结果,增加许多调试的时间及困扰。基于这个理由,可以使用 Option Explicit 来要求所有变量都要明确定义。例如:
<%
Option Explicit
Dim Index,Count

%>
10
5.1 什么是 ASP
5.1.2 变量与常数
1,变量命名的规则在 ASP中,变量的命名必须符合下列的规则:
● 必须以英文字母开头。
● 变量名称不能包含句点(,)。
● 变量名称的长度不能超过 255 个字符。
● 在定义的有效范围中必须是惟一的。
2,变量的有效范围和生命周期变量的有效范围由定义的位置来决定。当在一个程序中定义变量时,只有程序中的程序代码可以存取或更改这个变量的值,称为局部变量。如果是在程序之外定义一个变量,那么所有程序将都能使用这个变量,称为全局变量。
11
5.1 什么是 ASP
5.1.2 变量与常数
2,变量的有效范围和生命周期变量的存在时间称为变量的生命周期,全局变量的生命周期是从变量被定义开始到程序执行完毕为止。局部变量就只有在变量的有效范围中存在,当离开变量的有效区域时,这些变量就会自动消失。
局部变量是一个用来保存暂时数据的绝佳选择。这些变量只有所在的程序才会认得该变量,所以您可以在许多不同程序中,定义相同的局部变量加以运用。至于要如何指定变量的数值或数据呢? 通过 ASP的赋值语句就可以完成变量赋值的工作。其范例如下:
<%
Dim Index
Index = 100 ' 将变量 Index的值设为 100
%>
12
5.1 什么是 ASP
5.1.2 变量与常数
3,数组变量数组变量是指计算机内存中,一组存放相同数据类型的连续内存,这块内存使用相同的变量名称及索引值来存取。数组变量的定义方式如下:
Dim A(9) '定义一维数组数组变量在内存中的排列情形如下:
存取数组变量时,须指定变量名称及索引值。例如:
m=A(0)
n =A(1)

A(0) A(1) A(2) A(3) A(4) A(5) A(6) A(7) A(8) A(9)
13
5.1 什么是 ASP
5.1.2 变量与常数
4,常数 (Constant)
常数是用来取代固定数字或固定字符串的名称,在
ASP中已预先定义许多内置常数。它的语法如下:
Const PI=3.14159
Const HTML="Hyper Text Markup Language"
Const CreateDate=#11-12-2000#
其中字符串常数需以双引号 (")表示;日期表达式则必须使用,#”将日期的值括起来。
说明:常数的值在程序执行期间不得改变,故称为常数。若在程序中不小心改变了常数值,会显示命令不合法的信息。
14
5.1 什么是 ASP
5.1.3 运算符
ASP承袭 Visual Basic的特色,它具有完整的运算符功能,包括算术运算符、比较运算符、连接运算符和逻辑运算符。
1,算数运算符算数运算符提供各种算数运算的能力,它包含加、
减、乘、除等 9种运算符。详细的符号及功能说明如下表所示。
15
5.1 什么是 ASP
5.1.3 运算符
1,算数运算符其中,字符串连接运算符 (&) 不是算术运算符,
但是在优先级上它会落在所有算术运算符之后,且在所有比较运算符之前。因此我们将它列在此处来谈。
功能说明 符号 功能说明 符号指数运算 ^ 余数 Mod
负数 - 加法 +
乘法 * 减法 -
除法 / 字符串连接 &
整数除法 \
16
5.1 什么是 ASP
5.1.3 运算符
1,算数运算符下面是字符串连接的范例,
字符串连接运算符( &)提供 Web 应用程序非常大的弹性,它可以连接不同数据类型的变量,结合而成一个新的字符串,适合于各种不同类型的变量使用。
例如:
dateStr="现在的日期与时间," & Now '合法的表示方式
dateStr="现在的日期与时间," + Now '这是不合法的
str="现在的日期是," + "2000/11/20" '合法的表示方式
str="我有 " + 5 + "块钱 " '不合法
str="我有 " & 5 & "块钱 " '合法
17
5.1 什么是 ASP
5.1.3 运算符
2,比较运算符比较运算符提供各种比较运算的能力,包括等于、
不等于、小于、大于等。详细的符号及功能说明如下表所示。其中,is运算符是一个对象引用比较运算符,它并非比较对象或是它们的值,而是检查两个对象是否引用到相同对象。
功能说明 符号 功能说明 符号等于 = 小于等于 <=
不等于 <> 大于等于 >=
小于 < 对象比较 is
大于 >
18
5.1 什么是 ASP
5.1.3 运算符
3,逻辑运算符逻辑运算符主要用来处理逻辑运算。逻辑运算实际上就是一种 true和 false的运算。详细的符号及功能说明如下表所示:
功能说明 符号 功能说明 符号逻辑非 Not 逻辑异或 Xor
逻辑与 And 逻辑等价 Eqv
逻辑或 Or 逻辑蕴涵 Imp
19
5.2 条件式条件式的语法如下:
If condition Then statements [Else elsestatements ]
或者可以使用模块形式语法:
If condition Then
[statements]
[ElseIf condition-n Then
[elseifstatements]],,,
[Else
[elsestatements]]
End If
例如我们要求得 A,B两数中的大数,则条件式如下:
If A > B Then
Max = A
Else
Max = B
End If
20
5.2 条件式
5.2.1 条件式的执行顺序
5.2.2 Select Case语句
21
5.2 条件式
5.2.1 条件式的执行顺序当程序执行到一个模块式 If (第二种语法 )时,condition 会加以测试。如果 condition 为 True,则在 Then 之后的语句会被执行。如果 condition 为 False,则每个 ElseIf 部分的条件式 (如果有的话 )会轮流地计算并加以测试。如果找到某个为 True 的条件式时,则其
Then 部分的语句会被执行。万一没有任何一个 ElseIf 条件式为
True(或是根本就没有 ElseIf 子句 ),则程序会执行 Else 部分的陈述式。而在执行完 Then 或 Else 之后的语句时,则会从 End If 之后的语句继续执行。
说明:在单行的条件式中,也可以将多个命令放在一起,中间以冒号隔开即可。请参考下面的范例:
If A > B Then Temp = A,A = B,B = Temp
22
5.2 条件式
5.2.2 Select Case语句
Select Case具有根据某表达式的值,来决定要执行哪一段语句的功能,它可以使复杂的条件式变得简单,使程序变得更浅显易懂,因此颇值得在复杂的条件下使用。 Select Case的语法如下:
Select Case testexpression
[Case expressionlist-n
[statements-n]]...
[Case Else expressionlist-n
[elsestatements-n]]
End Select
例如,Sex为性别代码,,1”为男性;,0”为女性,其他值为
“不明”。用 Select Case语句和 If,,Then,,Else分别可写成 (见下页 ):
23
5.2 条件式
5.2.2 Select Case语句用 Select Case来写,写法如下:
Select Case Sex
Case "1"
title="男 "
Case "0"
title="女 "
Case Else
title="不明 "
End Select
用 If,,Then,,Else来写,写法如下:
If Sex="1" Then
Title="男 "
ElseIf Sex="0" Then
Title="女 "
Else
Title="不明 "
End If
24
5.3 循环在编写程序时,我们经常要重复执行某段程序代码。执行的次数可能是固定,或等某条件成立时才退出。这时就必须使用循环来处理。 ASP所提供循环的功能相当多,包括下列的语句:
● For,.,Next
● Do,.,Loop
● While,.,Wend
25
5.3 循环
5.3.1 For,.,Next语句
5.3.2 Do,.,Loop语句
5.3.3 Do While,.,Loop语句
5.3.4 Do,.,Loop Until语句
5.3.5 While,.,Wend
26
5.3 循环
5.3.1 For,.,Next语句
For..,Next语句通常用于执行某固定次数的程序代码时使用。它的语法如下:
For counter=startTo end [Step step]
[statements]
[Exit For]
[statements]
Next
在上述的语法中,For的语句有一个控制变量
counter,它的初值为 start,终止值为 end,每次增加值为 step。
27
5.3 循环
5.3.1 For,.,Next语句其执行步骤如下:
( 1)设置 counter的初值。
( 2)判断 counter是否大于终止值 (或小于终止值,看
step的值而定 )。
( 3)假如 counter大于终止值,程序跳至 Next语句的下一行执行。
( 4)执行 For循环中的语句。
( 5)执行到 Next语句时,控制变量会自动增加 step
值,若未指定 step值,默认值为每次加 1。
( 6)跳至第二个步骤。
28
5.3 循环
5.3.1 For,.,Next语句
For...Next范例 (ch5-1.asp ),使用 For...Next 语句来计算 1+2+…+10 的总和。
<%
Dim i,Sum
Sum=0
For i=1 to 10
Sum=Sum+i
Next
Response.Write("1+2+…+10=" & Sum)
%>
执行结果如图所示。
29
5.3 循环
5.3.2 Do,.,Loop语句重复执行一段语句模块中的命令,直到条件式为 True 时,
Do...Loop的语法有两种形式,分别如下:
1,Do [{While | Until} condition]
[statements]
[Exit Do]
[statements]
Loop
2,Do
[statements]
[Exit Do]
[statements]
Loop [{While | Until} condition]
其中 Do...While是先测试条件,当条件成立时执行循环内的程序代码;而 Do...Until式执行到满足 Until后面的条件时,退出 Do...Loop
循环。这是两者最大差别。
30
5.3 循环
5.3.3 Do While,.,Loop语句若我们同样以计算 1+2+…+10 的总和为例。以 Do
While...Loop循环计算,其范例 (ch5-2a.asp)如下:
<%
Dim i,Sum
Sum=0
i=0
Do While i<10
i=i+1
Sum=Sum+i
Loop
Response.Write("1+2+…+10=" & Sum)
%>
31
5.3 循环
5.3.3 Do While,.,Loop语句同样的语句,我们也可以将 Do While...Loop 改成 Do...Loop
While 的写法,其效果是一样的,只是测试的条件在前或在后而已。
如下范例 (ch5-2b.asp),
<%
Dim i,Sum
Sum=0
i=0
Do
i=i+1
Sum=Sum+i
Loop While i<10
Response.Write("1+2+…+10=" & Sum)
%>
若利用 Internet Explorer执行本程序,则其输出画面如图所示。
32
5.3 循环
5.3.4 Do,.,Loop Until语句
Do Until...Loop循环语句是执行到 Until后面的条件成立时,才结束循环的执行,否则就执行循环内的语句。若我们同样以计算 1+2+…+10 的总和为例,以 Do
Loop,.,Until循环计算,其范例 (ch5-3a.asp)如下:
<%
Dim i,Sum
Sum=0
i=0
Do
i=i+1
Sum=Sum+i
Loop Until i=10
Response.Write("1+2+…+10=" & Sum)
%>
33
5.3 循环
5.3.4 Do,.,Loop Until语句同样的语句,我们也可以将 Do Loop...Until改成 Do
Until...Loop的写法,其效果是一样的,只是测试的条件在前或在后而已。如范例 ch5-3b.asp,
<%
Dim i,Sum
Sum=0
i=0
Do Until i=10
i=i+1
Sum=Sum+i
Loop
Response.Write("1+2+…+10=" & Sum)
%>
34
5.3 循环
5.3.4 Do,.,Loop Until语句若利用 Internet Explorer执行本程序,则其输出画面如图所示。
说明:有时候,我们在处理循环时,希望在某一个条件成立时,可以中途退出这个循环,这时我们可以使用 Exit Do的命令。若是在多重循环之下,Exit Do
会退出最近的循环。
35
5.3 循环
5.3.5 While,.,Wend
While,.,Wend语句执行时,首先会测试 While后面的条件式,
当条件式成立时,执行循环中的语句,条件不成立时则退出
While...Wend循环。它的语法如下:
While condition
[statements]
Wend
While...Wend范例如下:
<%
Dim i,Sum
Sum=0
i=0
While i<10
i=i+1
Sum=Sum+i
Wend
Response.Write("1+2+…+10=" & Sum)
%>
说明,Do...Loop语句提供更结构化与灵活性的方法来执行循环,因此建议您使用 Do…Loop 循环以取代 While…Wend 。
36
5.4 内置函数
ASP 提供了许多系统内置的函数,让程序设计员使用。这些函数包括数值运算、字符串运算、日期运算等。由于是系统提供的函数,因此我们不用特别定义引用这些函数,就可以直接使用。下面是我们针对实际上常用的函数,以范例的方式一一介绍其运用。
37
5.4 内置函数
5.4.1 字符串函数
5.4.2 数值函数
5.4.3 随机数
5.4.4 日期函数
5.4.5 时间函数
38
5.4 内置函数
5.4.1 字符串函数
ASP中提供许多内置的字符串函数,它可以帮助程序设计员完成许多琐碎的工作,这些工作包括取得字符串长度、取出部分字符串、寻找字符串等等。
● Len函数
[语法 ] Len(str)
功 能:取得字符串的长度。
返回值:字符串的长度。
范 例,n=Len (“互联网络 Internet”)?n=12,中文字长度与英文字同
39
5.4 内置函数
5.4.1 字符串函数
● Instr函数
[语法 ] Instr(str,substr)
功 能:从字符串 str,寻找另一字符串 (substr)第一个出现的位置。
返回值,substr在 str值中第一个出现的位置。
范 例,p=Instr ("crispin@hlfdlm.com.cn","@") 'p=8
● Left函数
[语法 ] Left(str,n)
功 能:从字符串 str左边算起取出 n个字符。
返回值:指定的字符串。
范 例,User=Left ("crispin@hlfdlm.com.cn",7)
'User="crispin"
40
5.4 内置函数
5.4.1 字符串函数
● Right函数
[语法 ] Instr(str,substr)
功 能:从字符串 str右边算起取出 n个字符。
返回值:指定的字符串。
范 例,domain=Right ("abc@hlfdlm.com.cn",6)
'domain="com.cn"
● Mid函数
[语法 ] Mid(str,start,n)
功 能:从字符串的第 start个字开始,取出 n个字符。
返回值:指定的字符串。
范 例,at=Mid ("crispin@hlfdlm.com.cn",8,1) 'at="@"
at=Mid ("互联网络 Internet",3,2) 'at="网络 "
41
5.4 内置函数
5.4.1 字符串函数分解电子邮件账号范例:
电子邮件地址只是由用户账号名称及邮件主机名称所组成,中间以,@”字符分隔,若我们要取出用户账号,
则可以利用 Instr函数先取得,@”所在的位置,然后利用
Left函数取出,@”前面的所有字符,就可以取得用户账号。
其范例 (ch5-4.asp )如下:
<%
Dim EMail,p
EMail="student@tomail.com.cn"
p=Instr(EMail,"@")
Response.Write("The user account is " & Left(EMail,p-1))
%>
42
5.4 内置函数
5.4.1 字符串函数分解电子邮件账号范例:
范例执行结果如下图所示。
至于要分别取出用户账号及邮件主机名称,则我们可以使用 Instr函数取得,@”字符的位置,然后以 Left函数取得用户账号,最后再利用 Mid或 Right函数取得邮件主机名称。请看下面范例。
43
5.4 内置函数
5.4.1 字符串函数范例 ch5-5.asp:
<%
Dim EMail,p
EMail="student@tomail.com.cn"
p=Instr(EMail,"@")
Response.Write("The user account is " & Left(EMail,p-1) & "<br>")
Response.Write("The host is " & Mid(EMail,p+1,Len(EMail)-p)& "<br>")
%>
执行结果如下图所示。
44
5.4 内置函数
5.4.2 数值函数在程序设计的过程中,经常会用到数学运算的功能,例如使用绝对值、取得整数、四舍五入等。在
ASP中也提供数学函数,以帮助程序设计员处理数值运算工作。下面是这些函数的介绍:
● Int函数
[语法 ] Int(float)
功 能:将浮点数值转成整数。
返回值:浮点数值的整数部分。
范 例,ch5-6.asp
<%
PI=3.14159
Result=Int(PI)
Response.Write(PI & "取整数等于 " & Result)
%>
执行结果
45
5.4 内置函数
5.4.2 数值函数
● Round函数
[语法 ] Abs(numberic)
功 能:四舍五入。
返回值:依据要求返回四舍五入后的数值。
范 例,ch5-7.asp
<%
a=3.49
b=3.51
Response.Write(a & "四舍五入等于 " & Round(a) &"<br>")
Response.Write(b & "四舍五入等于 " & Round(b))
%> 执行结果
46
5.4 内置函数
5.4.2 数值函数
1,小数点两位以下四舍五入的范例
ASP并未提供小数点以后两位四舍五入的功能,
但是您可以通过相关函数完成。下面分别是使用 Int及
Round函数的范例:
● 利用 Int函数计算小数点两位以下四舍五入利用 Int函数计算小数点两位以下四舍五入的方法是将数值先乘以 100(保留小数字数两位 ),加上 0.5之后
(是否进位 ),取整数再除以 100即可。其范例 ch5-8.asp
见下页:
47
5.4 内置函数
5.4.2 数值函数范例 ch5-8.asp:
<%
PI=3.14159
Result=Int(PI * 100 + 0.5) / 100
Response.Write(PI & "小数点两位以下四舍五入等于 " & Result)
%>
执行结果如下图所示。
48
5.4 内置函数
5.4.2 数值函数
● 利用 Round函数计算小数点两位以下四舍五入利用 Round函数计算小数点两位以下四舍五入的方法比 Int函数简单,因为 Round本身即具备四舍五入的功能。但是要取小数点以下两位,还是要先乘以 100后四舍五入,再除以 100。其范例如下:
范例,ch5-9.asp
<%
PI=3.14159
Result=Round(PI * 100) / 100
Response.Write(PI & "小数点两位以下四舍五入等于 " & Result)
%>
执行结果
49
5.4 内置函数
5.4.2 数值函数
● Abs函数
[语法 ] Abs(numberic)
功 能:取绝对值。
返回值,numeric的绝对值。
范 例,ch5-10.asp
<%
a=123
b=-23
Absa=Abs(a)
Absb=Abs(b)
Response.Write(a & "的绝对值为 " & Absa &"<BR>")
Response.Write(b & "的绝对值为 " & Absb)
%> 执行结果
50
5.4 内置函数
5.4.2 数值函数
2,取得任意两数较大数的范例假如有 A,B两个变量,我们要取得大数的值,则我们可以利用 If…Then...Else 取得。
范例,ch5-11.asp
<%
A=100
B=200
If A > B Then
Max=A
Else
Max=B
End If
Response.Write("A=" & A & ",B=" & B & " 其中大数为 " & Max)
%>
执行结果
51
5.4 内置函数
5.4.3 随机数随机数是由计算机的随机器产生的一个数字,在 ASP程序中,随机数的相关语句及函数共有两个,一个是随机数产生器初始化的命令 Randomize,另一个适用于取得随机数的函数 Rnd。其说明分述如下:
● Randomize
随机数产生器基本上是由一个复杂的数学运算函数所组成,在产生随机数之前,必须由外界给予随机数产生器一个种子 (Seed),然后经过随机数产生器的运算之后产生随机数。 Randomize是随机数产生器的初始化命令,在程序执行到 Rnd 函数之前,必须先执行
Randomize命令。其语法如下:
[语法 ] Randomize [number]
Randomize 把 number 的值当成新的随机数种子来起始随机数产生器。若要得到一随机数值,必须调用 Rnd 函数取得。如果省略参数 number,则会以操作系统目前的时间当作新的随机数种子。
52
5.4 内置函数
5.4.3 随机数
● Rnd函数
Rnd函数必须配合 Randomize使用,用以取得任一介于 0到 1之间的随机数值。它的语法如下:
[语法 ] Rnd[(number)]
其中,参数值 Number会影响 Rnd函数的返回值。 Number的用法如下表所示。
Number值 Rnd函数的返回值小于 0 同一个 number 当作随机数种子其产生的相同结果大于 0 随机数序列中的下一个随机数值等于 0 最近一次产生过的随机数值省略 随机数序列中的下一个随机数值
53
5.4 内置函数
5.4.3 随机数下面是利用 For...Next循环随机产生 5个随机数的 ASP范例 (ch5-
12.asp):
<%
Dim Index
randomize
for Index=1 to 5
Response.Write(Int(Rnd * 100) + 1 & "&nbsp;&nbsp;")
next
%>
输出结果如图所示。
说明,要产生一个介于
m到 n之间的整数随机数,
其计算公式如下:
int(Rnd?(n-m+1))+m。
54
5.4 内置函数
5.4.3 随机数
● 产生 12个不同随机数的范例利用 Rnd函数产生一个 1~ 100之间的随机数,并且判断此随机数是否已经产生过 (用 array存放产生过的随机数 )。每产生一个随机数就跟数组中的随机数比对,若已经出现过则重新再产生一个随机数,直到不会重复出现同样的随机数为止。
程序的源代码 ch5-13.asp如下所示,
<%
Dim Index,I
Dim NotFound
Dim r(12)
randomize?初始化随机数产生器
'产生 12个随机数
55
5.4 内置函数
5.4.3 随机数
(接上页)
for Index=1 to 12
Do
r(Index)=Int(Rnd * 100 + 1) '产生介于 1..100间的随机数
NotFound=True
'每产生一个随机数,就检查是否重复出现
for I=1 to Index-1
If r(I)=r(Index) Then '重复出现
NotFound=False 'NotFound=False
Exit For '离开最近的 for循环
End If
next
Loop Until NotFound '直到不出现重复的随机数为止
Response.Write(r(Index)) '输出随机数
Response.Write("&nbsp;&nbsp;") '&nbsp;代表空格符
next
%>
56
5.4 内置函数
5.4.3 随机数执行结果如下图所示。
说明:本例若搭配数据库实例,则以产生的随机数编号,利用移动数据库指针的方式,跳至指定的记录,
即可取得中奖人数据。
57
5.4 内置函数
5.4.4 日期函数日期函数是商用程序中重要的一环。在 ASP程序中,提供许多内置的日期相关函数。
● Now函数
[语法 ] Now
功 能:取得系统目前的日期及时间。
返回值:日期及时间。
范 例,Response.Write(Now)
将系统目前的日期及时间输出至 Browser上。
58
5.4 内置函数
5.4.4 日期函数
● Year函数
[语法 ] Year(date)
功 能:取得日期变量中的年返回值:年范 例,y=Year(Now) 'y=2004
● Month函数
[语法 ] Month(date)
功 能:取得日期变量中的月份返回值:月份范 例,m=Month(Now) 'm=10
59
5.4 内置函数
5.4.4 日期函数
● Day函数
[语法 ] Day(date)
功 能:取得日期变量中的日返回值:日范 例,d=Day(Now) 'd=22
日期运算范例( ch5-14.asp )的 ASP源程序代码见下页所示:
60
5.4 内置函数
5.4.4 日期函数
<%
SystemDateTime=Now
Response.Write("系统日期及时间," & SystemDateTime)
Response.Write("<BR>")
Response.Write("年," & Year(SystemDateTime))
Response.Write("<BR>")
Response.Write("月," & Month(SystemDateTime))
Response.Write("<BR>")
Response.Write("日," & Day(SystemDateTime))
Response.Write("<BR>")
Response.Write("昨天的此时为," & SystemDateTime - 1)
Response.Write("<BR>")
Response.Write("明天的此时为," & SystemDateTime + 1)
%>
61
5.4 内置函数
5.4.4 日期函数输出结果如下图所示:
62
5.4 内置函数
5.4.5 时间函数时间函数与日期函数是相同性质的运用。在 ASP
程序中,也提供许多内置的时间运算函数。下面是与时间相关的函数的说明:
● Time函数
[语法 ] Time
功 能:返回系统目前的时间,格式视操作系统中的参数而定。
返回值:系统时间。
范 例,t=Time?格式默认值为 hh:mm:ss
63
5.4 内置函数
5.4.5 时间函数
● Hour函数
[语法 ] Hour(Time)
功 能:取参数 Time的小时值。
返回值:介于 0~23之间的整数。
范 例,Hour(Time)
注意,Time的时间为 24小时制。
● Minute函数
[语法 ] Minute(Time)
功 能:取参数 Time的分钟数。
返回值:介于 0~59之间的整数。
范 例,Minute(Time)
64
5.4 内置函数
5.4.5 时间函数
● Second函数
[语法 ] Second(Time)
功 能:取参数 Time的秒数。
返回值:介于 0~59之间的整数。
范 例,Second(Time)
ASP语法虽然很简单,但是在实际的应用上面,还必须有 HTML语法的基础配合,才能发挥最强的功能。
若能具备 CGI等相关知识,则在运用上就能游刃有余。
65
5.5 互联网的运行流程
ASP在互联网运行平台上的实际流程。一般而言,
在 Web为基础的互联网运行平台上,它是一个标准的
Client/Server的架构。 Client端是浏览器 (Browser),
Server端为网站服务器 (Web Server),双方通过 Internet
将彼此连接在一起。其系统的框架及运行的流程如下图所示。
66
5.5 互联网的运行流程
1,Request Object
浏览器对 Web Server发出请求,称为 Request。例如,我们使用新浪网站的搜索引擎查找,book”关键词。
在输入 ASP并按下搜寻按钮之后,Internet Explorer浏览器的 URL列上出现 http://search.sina.com.cn/cgi-
bin/search.cgi?- search key=book,代表浏览器送出此字符串信息给 Web Server。其中? 为程序 search.cgi与参数间的分隔字符,searchkey为搜寻引擎要求用户输入关键词的字段名称,book则为字段的输入值。当 Web
Server收到此信息之后,会将相关的信息置于 Request
对象之中。例如,Request("k")的值为,book”。
67
5.5 互联网的运行流程
2,Response对象当 ASP程序完成 Client端请求的信息时,对浏览器响应请求的工作由 Response对象负责。 Response对象通过 Write方法响应 Client的请求。例如:
范例,ch5-15.asp
<%
Response.Write("<HTML>")
Response.Write("<BODY>")
Response.Write("您的需要我都听到了! ")
Response.Write("</BODY>")
Response.Write("</HTML>")
%>
68
5.5 互联网的运行流程
2,Response对象
Response.Write的输出,将通过 IIS送至客户端的浏览器上,如下图所示。
另外,Response对象的 Redirect方法,则提供 URL
重定向的功能。请见下页范例。
69
5.5 互联网的运行流程
2,Response对象范例,ch5-16.asp
<%
'将信息重定管理中心 -登录页面
Response.Redirect("http:/chapter5/pages/login.htm")
%>
当我们在浏览器执行此 ASP程序时,浏览器的画面将自动切换至管理中心 -登录页面 (http:/chapter5/pages/login.htm ),如下图所示。
70
5.5 互联网的运行流程
3,Application Object
Application Object用来管理所有的 ASP应用程序,
如下图所示。此信息可以被不同用户的应用程序所存取及传递。
71
5.5 互联网的运行流程
3,Application Object
由于 Internet为一多人同时使用的环境,因此可能会有多个人同时改变 Application的变量。所以 Application对象提供了锁定 (Lock)
及解除锁定 (Unlock)变量,让变量的存取变得可能。当变量被锁定时,其他的用户便不能修改 Application对象的属性。例如:我们利用 Application对象的 Visitors变量记录上站的人数 (此程序置于
Document Root下的 Global.asa文件 ),则每次有新的用户上线时,下面的程序将被执行一次:
<%

Application.Lock
Application("Visitors")=Application("Visitors")+1
Application.Unlock

%>
72
5.5 互联网的运行流程
4,Server对象
Server对象负责提供服务器的相关信息。例如:服务器上的环境变量、别名与实际文件路径的对应及 Server
对象的集成能力等。其中最令人兴奋的是 Server对象可通过 CreateObject的方法产生对象。此能力可以把 Windows
最强的 ActiveX功能集成到 ASP之中,使得 ASP更容易使用。另外,MapPath方法可将实际路径或虚拟路径对应到
Server上的实际目录。例如:
范例,ch5-17.asp
<%
Response.Write("index3.asp文件的位置在哪里?<BR>")
Response.Write("它的位置在 " & Server.MapPath("index3.asp"))
%>
73
5.5 互联网的运行流程
4,Server对象在浏览器执行上述程序,可得到此网页在 IIS上实际存放在硬盘的位置,如下图所示。
74
5.5 互联网的运行流程
4,Server对象
ScriptTimeOut则是设置 ASP程序于 Server上最大的可执行时间。当 ASP的执行时间超过 ScriptTimeOut所设置的时间后,系统会自动发出超时的错误信息。因此对于执行时间较长的程序,我们可以调整 ScriptTimeOut时间,使程序不至于在执行过程中发生超时的情形。例如利用 Web接口发送电子报的程序,设置的方法如下:
<%
Server.ScriptTimeOut=15 '单位为分钟
,'下面的程序必须于 15分钟以内完成工作
,'否则会发生超时 (TimeOut)情形
%>
75
5.5 互联网的运行流程
4,Server对象
HTMLEncode方法提供字符串编码的能力,此能力对网页中的特殊字符有相当大的帮助。
范例,ch5-18.asp
<%
html=Server.HTMLEncode("<B> &+</B>")
Response.Write("<HTML>")
Response.Write("<BODY>")
Response.Write("<PRE>")
Response.Write(html)
Response.Write("</PRE>")
Response.Write("</BODY>")
Response.Write("</HTML>")
%>
76
5.5 互联网的运行流程
4,Server对象在浏览器执行上述程序后,其输出的画面如下图所示。
77
5.5 互联网的运行流程
4,Server对象当我们在 Internet Explorer窗口中,点选查看 /源文件命令,
查阅原始文件时,其内容如下图所示。
我们可以看到 HTML文件中有几个特殊字符,它们的意义分别如下表所示。
字符 编码
< &lt;
> &gt;
& &amp;
78
5.5 互联网的运行流程
5,Session Object
当客户使用浏览器连上某一个网站时,HTTP会自动创建一个连接,称为一个 Session。 Session主要负责管理用户与 Server间的相关信息。这些信息虽然让上线的用户无法存取,但是它们却仍然可以在网页中自由的传递。
SessionID用以代表某一特定的用户编号 (ID),而且此连接编号具有惟一性。当此连接超过 Session对象的设置的时间后 (由 TimeOut
属性设置,以分钟为单位 ),SessionID就无效了。在 TimeOut的时间未到之前,执行 Abadon会结束所指定的 Session,如下图所示。
79
5.5 互联网的运行流程
6,Global.asa
在 IIS的根目录 (Document Root)下,我们可以创建一个名为
Global.asa的文件。当 IIS被启动时,首先它会寻找 Document Root目录下是否存在此文件,若存在此文件,则会自动加载并加以执行 (此文件就相当于 DOS下的自动执行文件 )。下面是 Global.asa的范例:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
'IIS启动时,Application_OnStart将被触发 (执行 )
'我们在 IIS启动时,将上站人数 Visitors变量设为 0
SUB Application_OnStart
Application("Visitors")=0
END SUB
'用户连上本网站时,Session_OnStart将被触发 (执行 )
'在此子程序中,我们将上线人数加 1
SUB Session_OnStart
Application.Lock
Application("Visitors")=Application("Visitors")+1
Application.Unlock
END SUB
80
5.5 互联网的运行流程
6,Global.asa(续 )
'用户离开本网站时,Session_OnEnd将被触发 (执行 )
'在此子程序中,我们将上线人数减 1
SUB Session_OnEnd
Application.Lock
Application("Visitors")=Application("Visitors")-1
Application.Unlock
END SUB
'IIS结束执行时,Application_OnEnd将被触发 (执行 )
'我们可在此子程序中,记录系统离线的时间在数据库中
SUB Application_OnEnd
END SUB
</SCRIPT>
当上站人数每增加一人,Session_OnStart的事件会自动被触发。
在此事件中,我们将上站人数记录在 Application("Visitors")变量中,
就可以实时地得知目前同时在线上的人数有多少。而当用户离线时,
Session_OnEnd会被触发,用户数目自动减 1。因此可确实地掌握目前在站上的人数。
81
5.6 子程序利用模块化、结构化的程序设计概念开发大型应用程序时,我们通常会将系统分割为许多小的、可共享的程序模块。我们称这些模块为子程序。
子程序为一可重复使用的模块程序代码。它只要事先定义一次,我们就可以在其他的程序中调用及使用它们。子程序可以有零到多个参数,由子程序预先定义好的算法处理,但是它无法将运算结果返回主程序。因此适用于执行某一固定的操作,而该操作不须返回执行的结果。其语法如下:
Sub sub_name(parameters)
子程序的程序代码写在此处
End Sub
82
5.6 子程序
5.6.1 子程序的运行方式在 ASP中,子程序必须利用 Sub语句定义,End Sub
做结尾,而程序代码的范围介于 Sub...End Sub之间。另外,子程序也可以传递参数,通过参数子程序可以提供多样化的功能。在 ASP执行时,Sub… End Sub 之间的程序代码并不会被立即执行,惟有当程序中调用该子程序时 (使用子程序名称来调用子程序 ),子程序才会被执行,
且同一个程序中,子程序可以被调用许多次。
HTML的文件有标准的写法,如第 3章所述,通常我们在使用 ASP编写 HTML文件输出时,经常会使用到
HTML的 Header及 Footer部分。假设我们将 HTML的页首及页尾,使用 ASP的子程序来实现,将可大量节省重复编写同样内容的工作。下面是 HTML_Header及
HTML_Footer的范例:
83
5.6 子程序
5.6.1 子程序的运行方式范例,ch5-19.asp
<%
Sub HTML_Header(title_name)
Response.Write("<HTML>" & vbCRLF)
Response.Write("<HEAD>" & vbCRLF)
Response.Write("<TITLE>" & title_name & "</TITLE>" & vbCRLF)
Response.Write("</HEAD>" & vbCRLF)
Response.Write("<BODY>" & vbCRLF)
End Sub
Sub HTML_Footer
Response.Write("</BODY>" & vbCRLF)
Response.Write("</HTML>" & vbCRLF)
End Sub
HTML_Header("Subroutine")
Response.Write("Subroutine测试 " & vbCRLF)
HTML_Footer
%>
84
5.6 子程序
5.6.1 子程序的运行方式在上面的程序代码中,有一个 ASP的常数 vbCRLF,
它是 ASP内置的字符串常数,用以代表换行字符( CR,
LF),也就是在 DOS或 Windows文字文件中,每一行文字间的分隔字符。当我们以浏览器执行此 ASP程序时,
执行的结果如下图所示。
85
5.6 子程序
5.6.1 子程序的运行方式在上面的范例中,HTML_Header子程序有一个参数
title_name,主要用以设置本程序的主题 (出现于浏览器的 Caption)。它主要是配合 HTML文件中的 <title>与
</title>标记使用。程序代码中调用 HTML_Header的程序代码如下:
HTML_Header("Subroutine")
至于程序中的 vbCRLF主要是供浏览器查看源代码时,让源代码输出编排的格式变得整齐。例如在 IE浏览器窗口中,点选查看 /
源文件命令,即可以看到此 ASP
程序输出的源代码文件如右图所示。
86
5.7 函数函数为一模块的程序代码,只要定义一次,就可以在其他的程序中调用及使用它们。通常函数会有 0或多个以上的参数,由预先定义好的程序进行一连串的运算处理,最后将产生的结果以函数名称将值返回。因此它可以让程序设计员编写更模块化、结构化及易于维护的应用程序。对于原本须重复编写的程序代码,现在只要在需用到它们的地方,利用函数的名称调用它们即可。
ASP自定函数的语法如下:
Function function_name(parameters)
'函数的程序代码写在此处
'function_name=返回值
End Function
87
5.7 函数说明,在上面的语法中,函数的名称必须出现在关键词 Function的后面。若函数有参数的话必须放在括号内。若同时有一个以上的参数,则参数与参数间必须以逗号隔开。函数程序代码请写在
Function...End Function之间。至于函数返回值则是通过函数名称返回。
调用函数的方法是直接使用函数的名称,并将参数放在括号里面即可。要注意的是函数必须事先定义才能让后面的程序代码使用,也就是说函数必须在调用它的程序之前出现即可。
88
5.7 函数
5.7.1 函数运行方式
5.7.2 日期函数的应用
89
5.7 函数
5.7.1 函数运行方式在 ASP中,函数必须利用 function语句定义。例如,
我们要计算整数 n是否为奇数,则可以 ASP提供的 MOD余数数学运算,将 n除以 2。若余数不等于 0代表 n为奇数,
否则为偶数。利用 ASP编写判断整数 n是否为奇数的函数及调用方式如下:
范例,ch5-20.asp
<%
Function Odd(n)
Odd=(n mod 2<>0)
End Function
n=3
If Odd(n)=True Then
Response.Write(n & "是奇数 ")
Else
Response.Write(n & "是偶数 ")
End If
%>
90
5.7 函数
5.7.1 函数运行方式在上面的范例中,我们可以看到 Odd函数有一个参数
n,当参数 n不能被 2整除时 (n mod 2 <> 0),Odd返回 True
值,否则为 False。当我们以 Internet Explorer浏览器执行上述程序时,其输出结果如下图所示。
91
5.7 函数
5.7.1 函数运行方式判断整数 n是否为偶数 (Even Number)的函数 Even,其定义如下:
Function Even(n)
Even=(n mod 2=0)
End Function
将原本测试 3是否为奇数的程序,增加判断 8是否为偶数的范例
ch5-21.asp 如下,Else
<% Response.Write(n & "是偶数 ")
Function Odd(n) End If
Odd=(n mod 2=1) Response.Write("<BR>")
End Function n = 8
Function Even(n) If Even(n)=True Then
Even=(n mod 2=0) Response.Write(n & "是偶数 ")
End Function Else
n = 3 Response.Write(n & "是奇数 ")
If Odd(n)=True Then End If
Response.Write(n & "是奇数 ") %>
92
5.7 函数
5.7.1 函数运行方式执行结果如下图所示说明;在本范例的输出中,我们使用 HTML的 <br>标记,让画面输出两行文字,以增加版面的美观。
93
5.7 函数
5.7.2 日期函数的应用实际上,我们经常要取得系统的日期及时间,以便进行有关日期或时间的处理操作。
在 ASP中,可以使用 Now 函数取得系统日期及时间,其中日期及时间的输出格式,则须视
Windows操作系统的控制面板 /
地区和语言选项 /自定义区域选项中的日期及时间的格式设置而异,如右图所示。
94
5.7 函数
5.7.2 日期函数的应用以下是 Now 函数 的使用范例 ch5-22.asp,
<%
Dim SystemDateTime
SystemDateTime = Now
Response.Write("Current Time is " & SystemDateTime)
%>
当我们执行此 ASP时,系统的日期及时间输出如下图所示。
说明:在 ASP中,上述的日期及时间的格式,将造成日期处理上的困扰。
原因是,ASP并未考虑 Windows 操作系统(如 Windows 2000/XP等)中文版的日期及时间格式的设置所造成。
解决的方法是使用自定义函数。
95
5.7 函数
5.7.2 日期函数的应用为改进上述日期及时间格式可能造成的问题,我们利用“自定义函数”编写 SystemDate及 SystemTime两个函数,
用以分别取得系统目前的日期与时间,ASP的源程序代码如下。
范例,ch5-23.asp
<%
Function SystemDate
SystemDate=Year(Now)&"/"& Month(Now)&"/"& Day(Now)
End Function
Function SystemTime
SystemTime=Hour(Now)&":"& Minute(Now)&":"& Second(Now)
End Function
Response.Write("Current Date is " & SystemDate & "<br>")
Response.Write("Current Time is " & SystemTime & "<br>")
%>
96
5.7 函数
5.7.2 日期函数的应用在该范例程序中,我们使用 Year,Month及 Day三个函数以取得 Now变量中的年,月,日的值,并利用,&”连接字符,将年、月、日以,/”字符连接起来。至于时间的函数,则使用 ASP内置的 Hour,Minute及 Second分别取得时、
分、秒三个字段,然后以,:”为时、分、秒的分隔字符。
当我们执行此 ASP程序时,SystemDate及 SystemTime
分别返回正确的日期及时间的格式,如下图所示。
97
5.8 Include File应用虽然利用 ASP编写的函数或子程序可以被其他的
ASP所引用,但是在使用之前必须事先定义 (例如前面所提到的 Odd函数来说,在每一个使用到 Odd函数的
ASP程序中,我们还是需要将该函数再定义一次 )。因此使用上会感到非常的困扰。例如:
<%
Function Odd(n)
Odd=(n mod 2<>0)
End Function

If Odd(Request("n"))=True Then

End If
%>
为了改善这个问题,在微软的 ASP中提供引用文件的命令,请见下页。
98
5.8 Include File应用引用文件命令的用法是利用 HTML的批注格式,然后再做一个变形的扩充。例如,将自定义函数 Odd另存为新文件,文件命名为 Odd.inc,然后在其他引用该函数的 ASP程序中,再以引用此文件的方式解决每次都必须定义 Odd函数的问题。引用此范例文件的语法如下:
范例,ch5-24.asp
<!--#include file="odd.inc"-->
<%
If Odd(100)=True Then
Response.Write("整数 100是奇数 ")
Else
Response.Write("整数 100是偶数 ")
End If
%>
说明:扩展文件名 inc即为 Include File的意思。
99
5.8 Include File应用有了引用文件的命令,对于经常使用的自定义函数或 子程序,我们都可以将它以另存为新文件的方式来管理。
关于引用文件的管理原则,我们建议您将相关的函数置于同一个引用文件中,以减少需引用此函数的
ASP程序编写大量的 Include File 语句。例如在前面的范例中,我们编写了 Odd及 Even两个函数,则请将
Odd及 Even函数写在同一个文件中,并以 oddeven.inc
文件存放,以后的 ASP程序若要引用时,只须输入一行 <!--#include file=”oddeven.inc” --> 语句即可。
10
0
5.8 Include File应用
● 不好的示范如下:
范例,ch5-25.asp
<!--#include file="odd.inc" -->
<!--#include file="even.inc" -->
<%
If Odd(100) = True Then
Response.Write("整数 100是奇数 ")
Else
Response.Write("整数 100是偶数 ")
End If
If Even(99) = True Then
Response.Write("整数 99是偶数 ")
Else
Response.Write("整数 99是奇数 ")
End If
%>
● 较好的用法如下:
范例,ch5-26.asp
<!--#include file="oddeven.inc" -->
<%
If Odd(100) = True Then
Response.Write("整数 100是奇数 ")
Else
Response.Write("整数 100是偶数 ")
End If
If Even(99) = True Then
Response.Write("整数 99是偶数 ")
Else
Response.Write("整数 99是奇数 ")
End If
%>
101
第 5章 ASP的第一次接触本章希望读者对 ASP的基本语法能有较为全面的了解,对 ASP提供的子程序及函数也有一定的了解,
对在现今软件越来越复杂、越写越大的情况下,模块化程序设计的重要性能有一定的认识。