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所示:
圖3-13 Default.ASP運行屏幕
1. 顯示Application集合的內容
單擊第一個鏈接,打開名為show_application.ASP的Application對象示例頁面。它顯示了虛擬應用程序當前的 Application對象的內容,如圖3-14所示:
圖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 & “’<BR>”
ElseIf IsArray(Application.Contents(objItem)) Then
Response.Write “Array: ‘” & objItem & “’ contents are:<BR>”
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) & “<BR>”
Next
Else
Response.Write “Variable: ‘” & objItem & “’ = “ _
; & Application.Contents(objItem) & “<BR>”
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 “<BR>”
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 & “’<BR>”
End If
Next