ASP 的“处理指令” <%@ 关键字 %> 给出 ASP 处理 .asp 文件所需的信息。例如,以下指令将 VBScript 设置为页面的主脚本语言:
<%@ LANGUAGE=VBScript %>
处理指令必须位于 .asp 文件的首行。要在页面中添加多条指令,这些指令必须位于相同的分隔符内。请勿将处理指令置于由“#include”语句包括的文件内。必须在符号 @ 和关键字之间加入空格。处理指令具有以下关键字:
△LANGUAGE 关键字设置用于 .asp 文件的脚本语言。请参阅使用脚本语言。
△ENABLESESSIONSTATE 关键字指定 .asp 文件是否使用会话语句。请参阅管理会话。
△CODEPAGE 关键字设置 .asp 文件的代码页(字符编码)。
△LCID 关键字设置文件的位置表示符。
△TRANSACTION 关键字指定 .asp 文件将在事务环境下运行。请参阅了解事务。
要点:可以在一条指令中包含多个关键字。关键字/值对必须由空格分开。等号两边不要留有空格。 以下示例既设置了脚本语言也设置了代码页:
<%@ LANGUAGE="JScript" CODEPAGE="932" %>
在服务器上使用 VBScript 和 ASP 时,将禁用两个 VBScript 特性。因为使用 Active Server Pages 编写的脚本在服务器上执行,所以不支持用来提供用户界面元素的 VBScript 语句 InputBox 和 MsgBox。另外,不要在服务器端脚本中使用 VBScript 函数 CreateObject 和 GetObject。而应使用 Server.CreateObject,以便 ASP 可以跟踪对象例程。由 CreateObject 语句或 GetObject 语句创建的对象既不能访问 ASP 内建的对象,也不能参与事务。
因为 ASP 中的所有脚本都在服务器端进行处理,所以,没有必要包含 HTML 注释标记,用来对不支持脚本的浏览器隐藏脚本,这是客户端脚本的通常做法。所有 ASP 命令都将在内容发送到浏览器之前处理。可以使用 HTML 注释向 HTML 页中添加备注;这些注释将被返回给浏览器,如果用户查看 HTML 源文件,将可以看到这些注释。VBScript 支持撇号格式的注释。与 HTML 注释不同,处理脚本时将删除这些注释并且不会发送到浏览器。
输出表达式中不能包含注释。例如,下面第一行能正常工作,而第二行则无法工作,因为该行以 <%= 开始。
<% i = i +1 '此语句用来递增 i 值。(此脚本会工作。) %>
<%= name '此语句用来打印变量名。(此脚本将失败。) %>
可以在 .asp 文件中使用 VBScript“Option Explicit”语句,以便要求必须使用“Dim”、“Private”、“Public”和“ReDim”语句显式声明变量。“Option Explicit”语句必须位于任何 ASP 命令、任何 HTML 文本或脚本命令之前。例如:
<% Option Explicit %>
<HTML>
<%
Dim strUserName
Public lngAccountNumber
%>
注意:将变量范围限制到过程中有利于提高性能。
有必要养成显式声明所有变量的习惯。这一点当使用“#include”语句在 .asp 文件中包含其他文件时尤其重要。被包含的脚本虽然在单独的文件中,但却当作是包含文件的一部分。除非声明变量,否则很容易忘记必须在主脚本和被包含脚本中使用不同的变量名。
如果在脚本中要多次参考 session 作用域变量,可以考虑将该变量赋给一个局部变量以便提高性能。 同样地,如果脚本重复参考 Application 作用域变量,应将该变量赋给局部变量以便提高性能。
可以定义自己的常量。在 VBScript 中,使用“Const”语句。在 JScript 中,可以使用“var”语句将常量值赋给变量。如果要在多个 .asp 文件中使用常量,则需要将定义放在单独文件中,并在所有使用该常量的 .asp 文件中包含这些定义。
将服务器端脚本语句散布到客户端脚本(由 HTML <SCRIPT> 标记括起),可以在请求时动态初始化和更改客户端脚本,用来配置客户端数据库或 DHTML 个性化脚本。创造性地运用这项技术还可以减少往返次数和服务器处理。
对首要脚本语言之外其他语言的过程使用 <SCRIPT> 元素。当使用 HTML <SCRIPT> 标签时,必须使用两个属性以便确保服务器端能够处理脚本。使用 <SCRIPT> 标签的语法为:
<SCRIPT LANGUAGE=JScript RUNAT=SERVER>
过程定义
</SCRIPT>
脚本块中的命令必须以所选脚本语言中形成一个或多个过程。例如,下列命令定义 JScript 过程“MyFunction”。
<HTML>
<SCRIPT LANGUAGE=JScript RUNAT=SERVER >
function MyFunction() { Response.Write("您调用了 MyFunction()。") }
</SCRIPT>
要点:不要在服务器端 <SCRIPT> 标签内包含任何完整过程以外的脚本命令。过程以外的命令没有固定的执行顺序,因此可能导致无法预知的结果。另外,在过程中不能使用 ASP 输出命令 <%= %>。不过,可以通过 Response.Write 将内容发送到浏览器。
对于 VBScript,调用过程时也可以使用关键字 Call。不过,如果调用的过程要求变量,则变量列表必须包含在括号内。如果省略关键字 Call,同时也必须省略包含变量列表的括号。如果使用 Call 语句调用任何内置函数或用户定义函数,将丢弃函数的返回值。
要将整个数组传递给过程,在 VBScript 中,数组名后应紧接一对空括号.
设计优秀的 Web 表单通常包含客户端脚本,以便在将信息发送到服务器之前验证用户输入。“验证脚本”可以检查许多事情,如用户输入值是否有效或者文本框是否为空。您可能需要验证用户是否在相应表单字段中输入了数字或文本信息,以防将潜在的无效信息发送到服务器。
通常,在客户端尽可能多地验证表单数据将非常有好处。除了能尽快提示用户输入错误外,客户端验证能提高响应速度、减少服务器负担并为其他应用程序释放带宽。
为了提高交互性,可以将错误信息放到无效信息所在的表单字段旁边,以便于用户发现出错的地方。(通常,基于 Web 的表单将请求转发给包含错误信息的单独的 Web 页。不能立即理解此信息的用户可能会灰心。)
由于通常无法得知集合中所存储的项目数,ASP 支持集合的 Count 属性,该属性返回集合中的项目个数。可以使用 Count 属性指定计数器的最大值。
要使通过“for”语句使用 Count 属性变得更为高效,应将 Count 值分配给本地变量,并用该变量来设置计数器的最大值。这样,脚本引擎就不必每次循环都去查找 Count 值。
<%
'声明计数器变量。
Dim lngItem, lngCount
lngCount = Session.Contents.Count
'重复该循环直到集合中的计数器等于项目个数。
For lngItem = 1 To lngCount
Response.Write Session.Contents(lngItem) & "<BR>"
Next
%>
脚本可在单个 cookie 中嵌入多个关联值,以便减少在浏览器和 Web 服务器之间传递的 cookie 数目。Request 和 Response 对象的 Cookies 集合可在单个项目中载有多个值。这些子项目或子关键字可单独使用。只有 Request.Cookies 和 Response.Cookies 集合支持子关键字。Request.Cookies 仅支持读操作,Response.Cookies 仅支持写操作。
下面将创建一个普通 cookie 和一个带子关键字的 cookie:
<%
'将 cookie 发送到浏览器。
Response.Cookies("Fruit") = "Pineapple"
'用子关键字将 cookie 发送到浏览器。
Response.Cookies("Mammals")("Elephant") = "African"
Response.Cookies("Mammals")("Dolphin") = "Bottlenosed"
%>
发送到浏览器的 HTTP 响应中的 cookie 文本显示如下:
HTTP_COOKIE= Mammals=ELEPHANT=African&DOLPHIN=Bottlenosed; Fruit=Pineapple;
可以列举出 Request.Cookies 集合中的所有 cookies 和 cookies 中的所有子关键字。不过,对不存在子关键字的 cookie 迭代子关键字将无法生成项目。要避免出现这种情况,请先检查 cookie 的子关键字是否是使用 Cookies 集合的 HasKeys 属性得到的。这一技巧将在下面的示例中加以说明。
<%
'声明计数器变量。
Dim Cookie, Subkey
'显示整个 cookie 集合。
For Each Cookie In Request.Cookies
Response.Write Cookie
If Request.Cookies(Cookie).HasKeys Then
Response.Write "<BR>"
'显示子关键字。
For Each Subkey In Request.Cookies(Cookie)
Response.Write " ->" & Subkey & " = " & Request.Cookies(Cookie)(Subkey) & "<BR>"
Next
Else
Response.Write " = " & Request.Cookies(Cookie) & "<BR>"
End If
Next
%>
该脚本将返回以下结果:
Mammals
->ELEPHANT = African
->DOLPHIN = Bottlenosed
Fruit = Pineapple
尽管 ASP 集合与 Visual Basic 中的 Collection 对象十分类似,但它们仍有一些区别。ASP 集合支持 Count 属性以及 Item、Remove 和 RemoveAll 方法,但它们不支持 Add 方法。
QueryString 集合有一个可选参数,可用来访问 URL 请求中出现的多个值中的单个值(使用 GET 方法)。也可以使用 Count 属性来计算特定类型值出现的次数。
例如,包含多项目列表框的表单可生成下面的请求:
http://OrganicFoods/list.asp?Food=Apples&Food=Olives&Food=Bread
可以使用下面的命令计算多个值:
Request.QueryString("Food").Count
要显示多个值类型,可在 List.asp 中包含下面的脚本:
<%
lngTotal = Request.QueryString("Food").Count
For i = 1 To lngTotal
Response.Write Request.QueryString("Food")(i) & "<BR>"
Next
%>
前述脚本将显示为:
Apples
Olives
Bread
要将整个值列表显示为用都逗号分隔的字符串,可以使用下面的脚本:
<% Response.Write Request.QueryString("Food") %>
将显示下面的字符串:
Apples,Olives,Bread
有时,可能需要使用 HTML <SCRIPT></SCRIPT> 标签来包含服务器端文件。例如,下面的脚本包含服务器可以执行的文件(使用相对路径):
<SCRIPT LANGUAGE="VBScript" RUNAT=SERVER SRC="Utils\datasrt.inc"></SCRIPT>
注意 当使用此方法包含文件时不要在 <SCRIPT> 标签内放置任何程序逻辑;使用另外一组 <SCRIPT> 标签来添加这样的逻辑。
使用脚本创建 COM 组件
ASP 支持 Windows Script Components,这是 Microsoft 提供的用来创建 COM 组件的功能强大的脚本技术。尤其是,您可以将用于数据库访问或内容生成等的通用脚本封装在可重复利用的组件中,以便在任何 .asp 文件或程序中使用。无需特殊的开发工具,使用 VBScript 或 JScript 编写脚本即可创建 Windows 脚本组件。也可以将 Windows 脚本组件与使用 COM 兼容编程语言编写的程序相结合,如 Visual Basic、C++ 或 Java 等。
下面是一个用 VBScript 编写的脚本示例,它定义了将华氏温度值转换为摄氏温度值的方法:
<SCRIPTLET>
<Registration
Description="ConvertTemp"
ProgID="ConvertTemp.Scriptlet"
Version="1.00"
>
</Registration>
<implements id=Automation type=Automation>
<method name=Celsius>
<PARAMETER name=F/>
</method>
<method name=Fahrenheit>
<PARAMETER name=C/>
</method>
</implements>
<SCRIPT LANGUAGE=VBScript>
Function Celsius(F)
Celsius = 5/9 * (F - 32)
End Function
Function Fahrenheit(C)
Fahrenheit = (9/5 * C) + 32
End Function
</SCRIPT>
</SCRIPTLET>
在执行该 Windows 脚本组件之前,必须以 .sct 为扩展名保存该文件,然后在“Windows 资源管理器”中,右键单击该文件并选择“注册”。要在 Web 页中使用该 Windows 脚本组件,应使用类似以下所示的服务器端脚本:
<%
Option Explicit
Dim objConvert
Dim sngFvalue, sngCvalue
sngFvalue = 50
sngCvalue = 21
Set objConvert = Server.CreateObject("ConvertTemp.Scriptlet")
%>
<%= sngFvalue %> degrees Fahrenheit is equivalent to <%= objConvert.Celsius(sngFvalue) %> degrees Celsius<BR>
<%= sngCvalue %> degrees Celsius is equivalent to <%= objConvert.Fahrenheit(sngCValue) %> degrees Fahrenheit<BR>
通常,应避免在循环中创建对象。如果必须在循环中创建对象,则需要手工释放该对象使用的资源:
<%
Dim objAd
For i = 0 To 1000
Set objAd = Server.CreateObject("MSWC.AdRotator")
……
objAd.GetAdvertisement
……
Set objAd = Nothing
Next
%>
提供对象 Session 作用域
session-scope 对象是为应用程序中的每个新会话创建的,并且在会话结束后释放;因此,每个活动会话都有一个对象。Session