為了遍歷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中使用元素聲明的對象引用。因為每個條目都是一個對象變量,可用簡單些的代碼對這個數組進行遍歷。我們將輸出對象的名字(在ID屬性中原有的定義):
For Each objItem in Application.StaticObjects
If IsObject(Application.StaticObjects(objItem)) Then
Response.Write “element: ID=’” & objItem & “’
”
End If
Next
1. 增加值到Contents集合
增加值到Contents集合的方法,與在global.asa網頁的腳本代碼中使用過的方法相同。示例網頁允許把一個新的Variant值增加到Application對象中,并已有建議的名字和值(可根據需要進行編輯),如圖3-15所示:
圖3-15 增加值到Contents集合的屏幕
單擊按鈕,重新載入這個網頁,把值增加到Application.Contents集合中,并且在列表中顯示,如圖3-16所示:
圖3-16 顯示Contents集合內容的屏幕
增加新的Contents條目的代碼
所有的按鈕和其他HTML控件放置在示例網頁中的一個窗體上。ACTION設置了當前網頁的路徑,提交該窗體時,重新裝入。METHOD屬性為“POST”,所以控件中的值出現在Request.Form集合中。在以前的章節中采用過這兩種技術:
” METHOD=”POST”>
該窗體上的按鈕都是普通的HTML INPUT控件,具有相同的標題(三個空格)但名字不同。例如,創建第一個按鈕(把值增加到Application對象中)的代碼是:
重新載入該網頁時,檢查Request.Form集合,判定單擊的是哪個SUBMIT按鈕,并進行相應的處理。如果是增加一個值到Application對象的按鈕(該按鈕在HTML的元素中被命名為cmdAdd),使用下面的程序段:
If Len(Request.Form("cmdAdd")) Then
strVarName = Request.Form("txtVarName")
strVarValue = Request.Form("txtVarValue")
Application.Lock
Application("strVarName") = strVarValue
Application.Unlock
End If
注意程序如何使用Application.Lock和Application.Unlock方法,確保這些值不會因兩個用戶并發地訪問而產生混亂。如果只是對一個特定的值進行設置,一般不可能發生這種情況。但一直使用Lock和Unlock方法是明智的。
2. Contents集合中刪除值
在例子網頁的底部有兩個按鈕,如圖3-17所示:
圖3-17 顯示在網頁底部的兩個按鈕
這兩個按鈕允許從Application.Contents集合中刪除值。第一個按鈕從集合中刪除單個的指定值,下拉列表框顯示的是Contents集合值的名字的列表(記住,不能從StaticObjects集合中刪除值,因為它們是靜態的)。
通過遍歷Contents集合(如前面我們所做的)執行ASP網頁時,創建該列表。但是,我們僅收集每項的名字并把它們放到列表元素內的元素中: …
該網頁的其余部分只是一個包含單個SUBMIT按鈕的窗體。注意如何使用來自Request.ServerVariables集合的引用網頁(HTTP_REFERER)的URL的值,以確保重新載入前一個網頁(Session對象例子網頁):
" METHOD="POST">
Your Session Has Been Terminated
A new Session will be started when you load another
ASP page. It will contain any values that are defined in
the global.asa file for this application.
Return to the previous page
結果如圖3-21所示。這時,當前的用戶會話已經被終止(放棄),并且該用戶不能引用原先的Session集合或屬性的內容:
圖3-21 終止一個用戶會話后的屏幕
然而,記住這一切是在調用Abandon方法的網頁執行時,甚至在對該方法的調用已經完成以后,仍能夠從Session對象中獲得用戶的會話內容。當此網頁結束時,會話才結束。
當然,當返回到顯示會話內容的Session對象示例網頁時,將啟動一個新的ASP會話。它將有一個不同的Start_Time值和通過執行global.asa中的代碼創建的其他缺省的會話值,如圖3-22所示:
圖3-22 重新建立一個用戶會話后的屏幕
注意,Session.SessionID屬性值沒有改變。ASP試圖重新分配相同的會話ID,因此不能依靠該值來判定一個新的會話已經啟動。
3.4 小結
本章介紹了兩個ASP內置對象:Application和Session對象。這些對象引入了ASP的應用程序和用戶會話的概念(兩者都是特定的術語,并且不是通常談話時的意義)。ASP應用程序允許分配專門的屬性給頁面集,定義了IIS和ASP如何管理這些網頁及所使用的其他組件。
然而,使用ASP應用程序和會話的主要原因是需要自動地獲得狀態。換句話說,存儲信息和變量引用的能力,要么對用戶裝載的所有網頁是全局和可用的(即在一個應用程序中),要么僅僅對一個指定的用戶的所有網頁是可用的(在一個會話中)。這使建立Web應用程序變得非常簡單(即應用程序在Web上工作,但能夠像傳統的編譯的應用程序一樣能完成指定的任務)。
本章通過一些示例頁面,詳細介紹如何使用ASP的Application和Session對象。這些頁面示范了這兩個對象可用的所有技術。