2. 创建Variant数组
在Session和Application对象中创建和使用一个Variant数组来存储值的方法目前尚未讨论,在这里作为一个非常有用的技术进行讨论。正如已经看到的那样,一个Variant数据类型可以包含一个数组,而不仅仅是一个值。
一个数组只是在内存的一个连续区域中以指定的次序存储二进制值的一个长行。要安排Variant,需要指向首项,并给出有关大小和结构的信息,脚本引擎可以做余下的事情。
可在一个Variant变量中创建一维、二维或多维数组,然后把该数组分配给一个应用程序层或用户会话层的变量,并保证整个数组可在相应的地方使用。下面代码演示了一个简单的一维数组的使用技术:
Dim varArray(3)
varArray(0) = “This is a”
varArray(1) = “Variant array”
varArray(2) = “stored in the”
varArray(3) = “Session object”
Session(“Variant_Array”) = varArray
3. 应用程序和会话在何时启动和结束
在介绍ASP应用程序和会话如何进行工作时提到过这个内容。以最基本的术语概述如下:
· 当第一个用户请求应用程序作用域内(即Web网站的缺省根目录内),或者在该网站的一个子目录内的一个用户定义的虚拟应用程序的一个ASP网页时,启动该应用程序。在任何用户会话启动之前发生。
· 当任意用户第一次请求在缺省应用程序或一个虚拟应用程序内的一个ASP网页时,启动一个会话(如果还没一个活动的会话)。
· 当用户在会话指定的超时周期内没有下载一个ASP网页时,会话结束。超时时间可以在脚本代码中使用Session.Timeout属性进行设置,可在Properties对话框中对各个应用程序单独设置,或者通过Active Directory的IIS:部分修改IIS元数据库中的缺省值进行设置。调用Session.Abandon方法的一个网页完成执行以后,会话也会结束。
· 在一个应用程序中的最后一个活动会话结束以后,该应用程序立即结束。
4. ASP处理指令
正如在第1章中所看到的,可以把一条处理指令增加到一个ASP网页。处理指令可以根据需要包含一个以上的条目。可以在语句中使用的关键字及其说明如表3-10所示:
表3-10 ASP指令关键字及说明
指令关键字
说 明
LANGUAGE=”language_name”
设置该网页的缺省的脚本语言,如:<% @ LANGUAGE=”VBScript” %>
ENABLESESSIONSTATE=”True”|”Fasle”
当设置为“True”时,防止一个会话的cookie发送到浏览器,因此将不会创建新的Session对象,任何现有会话的内容将不再可用
CODEPAGE=”code_page”
设置该网页的代码页,如<% @CODEPAGE=”1252” %>
LCID=”locale_identifier”
设置该网页的位置标识符,如<% @LCID=”2057” %>
TRANSACTION=”transaction_type”
指明该网页文件在一个事务环境下运行。有效值是:
“Required”:如果已有可用的事务,脚本将在其中运行;如果没有可用的事务,启动一个新的事务。
“Requires_New”:脚本将初始化一个新的事务。
“Supported”:如果已有可用的事务,脚本将在其中运行;而且不启动一个新的事务。
“Not_Supported”:脚本将不运行于任何已有的事务中,并且不初始化一个新的事务。
在第18章中详细介绍事务。
在一个网页上只能允许有一条处理指令,并且应该放在第一行。在处理指令中可以包含不止一个这样的条目,但必须用空格进行分隔,等号两端不能有空格,例如:
<% @LANGUAGE=”VBScript” CODEPAGE=”1252” LCID=”2057” %>
3.3.4 活动的ASP Application对象
我们提供一些简单的网页,这些网页示范了使用过程中的ASP Application和Session对象。为了能够正常使用,必须把它们放到服务器上的一个虚拟应用程序内,并且把所提供的global.asa文件放到该应用程序的根目录中。最简单的办法是把global.asa文件放到缺省Web网站的根目录(缺省情况下是C:/InetPub/WWWRoot)中。
对任何已有的global.asa文件重命名是一个好办法,可以在以后对该文件进行恢复。
本书的所有例子文件都可以从我们的Web网站上得到,在例子的Chapter03子目录中还有本章的所有其余示例网页。
在Chapter03子目录中,Default.asp网页是一个简单的菜单,该菜单允许运行Application和Session示例网页,运行屏幕如图3-13所示:
<img src=http://go2.163.com/~davelu/asp39.jpg>
图3-13 Default.asp运行屏幕
1. 显示Application集合的内容
单击第一个链接,打开名为show_application.asp的Application对象示例页面。它显示了虚拟应用程序当前的Application对象的内容,如图3-14所示:
<img src=http://go2.163.com/~davelu/asp40.jpg>
图3-14 Application对象的内容屏幕
注意到ASPCounter对象是StaticObjects集合的一个成员(通过<OBJECT>元素进行定义),但是其余部份(由Server.CreateObject实例化)是Contents集合的成员。
可以看到使用global.asa例子网页放到这些集合中的值,这在前面已经看到:
<!-- Declare instance of the ASPCounter component with
application-level scope //-->
<OBJECT ID=”ASPCounter” RUNAT=”Server” SCOPE=”Applicatoin”
PROGID=”MSWC.Counters”>
</OBJECT>
...
...
<SCRIPT LANGUAGE=”VBScript” RUNAT=”Server”>
Sub Application_onStart()
‘Create an instance of an ADO Connection with application-level scope
Set Application(“ADOConnection”) = Server.CreateObject(“ADODB.Connection”)
Dim varArray(3) ‘Create a Variant array and fill it
varArray(0) = “This is a”
varArray(1) = “Variant array”
varArray(2) = “stored in the”
varArray(3) = “Application object”
Application(“Variant_Array”) = varArray ‘Store it in thd Application
Application(“Start_Time”) = CStr(Now) ‘Store the date/time as a string
Application(“Visit_Count”) = 0 ‘Set counter variable to zero
End Sub
...
...
</SCRIPT>
(1) 遍历Contents集合的代码
为了遍历Contents集合,可使用一个For Each ... Next结构。集合中的每一项可以是一个简单的Variant类型变量、一个Variant数组或者一个对象的引用。因为需要对每种类型的值进行不同的处理,所以就不得不对每一个进行检查来判别其类型。
在VBScript中可使用VarType函数完成这个工作。这里使用IsObject和IsArray函数代替:
For Each objItem in Application.Contents
If IsObject(Application.Contents(objItem)) Then
Response.Write “Object reference: ‘” & objItem & “’
”
ElseIf IsArray(Application.Contents(objItem)) Then
Response.Write “Array: ‘” & objItem & “’ contents are:
”
VarArray = Application.Contents(objItem)
‘Note: the following only works with a one-dimensional array
For intLoop = 0 To UBound(varArray)
Response.Write “ Index(“ & intLoop & “) = “ & _
VarArray(intLoop) & “
”
Next
Else
Response.Write “Variable: ‘” & objItem & “’ = “ _
& Application.Contents(objItem) & “
”
End If
Next
注意程序如何从Application对象检索该数组。将其分配给一个局部(Variant)变量,使用下面的语句:
varArray = Application.Contents(objItem)
使用UBound函数可以查找出数组的大小(元素的数量),这个值可以作为遍历的终止条件:
For intLoop = 0 UBound(varArray)
这个例子是一维数组,并将只显示这样的一个数组的内容。可根据需要编辑代码以处理多维数组,例如:
For intLoop = 0 To UBound(varArray)
IntNumberOfDimensions = UBound(varArray, 1)
For intDimension = 0 To intNumberOfDimensions
Response.Write “ Index(“ & intLoop & “) = “ _
& varArray(intLoop, intDimension)
Next
Response.Write “
”
Next
(2) 遍历StaticObjects集合的代码
StaticObjects集合包含了所有在global.asa中使用<OBJECT>元素声明的对象引用。因为每个条目都是一个对象变量,可用简单些的代码对这个数组进行遍历。我们将输出对象的名字(在ID属性中原有的定义):
For Each objItem in Application.StaticObjects
If IsObject(Application.StaticObjects(objItem)) Then
Response.Write “<OBJECT> element: ID=’” & objItem & “’
”
End If
Next