大多數 ASP 內建對象支持集合。集合是存儲字符串、數字、對象和其他值的地方。除了在存儲或取出項目時集合會自動擴展與搜索外,集合與數組非常相近。與數組不同的是,集合被修改後,項目的位置將會移動。可以通過集合中項目的名稱、索引或者通過在集合的所有項目中遍歷訪問項目。
通過名稱和索引訪問項目
通過使用項目名稱可以訪問集合中的具體項目。例如,Contents 集合擁有在session 對象中保存的所有變量。同樣也擁有由 Server.CreateObject 創建的所有對象。假設在 Session 對象中存儲了下列用戶信息:
<%
Session.Contents("FirstName") = "Sam"
Session.Contents("LastName") = "Woo"
Session.Contents("Age") = 29
%>
可以使用在集合中存儲項目時關聯的名稱訪問項目。例如,下面的表達式返回字符串“Sam”:
<%= Session.Contents("FirstName") %>
通過使用與項目關聯的索引或號碼也可以訪問項目。例如,下面的表達式檢索存儲在 Session 對象的第二個存儲槽中的信息並且返回“Woo”:
<%= Session.Contents(2) %>
ASP 集合從 1 開始編號。當在集合中增加或刪除項目時,與項目關聯的索引將會改變。所以不能認為項目的索引始終不變。正如將在下面的主題中說明的那樣,利用索引的訪問一般用來遍歷集合,或訪問只讀集合中的項目。
通過使用速記的名稱可以訪問項目。ASP 以特定的順序搜索與對象關聯的集合。如果在對象的集合中特定名稱的項目只出現一次的話,可以消除該集合的名稱:
<%= Session("FirstName") %>
訪問存儲在 application 或 Session 對象中的項目時,消除集合名稱一般是安全的。但是,對於 Request 對象,最好指定集合名稱,因為該集合很可能包含重復的名稱。
遍歷集合
在集合的所有項目中遍歷可以了解集合中存儲的項目或修改項目。遍歷集合時,必須提供集合名稱。例如,可以使用 VBScript 中的 For...Each 語句訪問存儲在 Session 對象中的項目:
<%
'Declare a counter variable.
Dim Item
'For each item in the collection, display its value.
For Each Item in Session.Contents
Response.Write Session.Contents(Item) & "<BR>"
Next
%>
可以使用 VBScript 中的 For...Next 語句遍歷集合。例如,要列出上例中存儲在 Session 中的三個項目,可以使用下列語句。
<%
'Declare a counter variable.
Dim Item
'Repeat the loop until the value of counter is equal to 3.
For Item = 1 to 3
Response.Write Session.Contents(Item) & "<BR>"
Next
%>
因為一般不知道存儲在集合中的項目個數,ASP 支持集合的 Count 屬性,這個屬性返回集合中的項目數。可以使用 Count 屬性指定計數器的終值。
<%
'Declare a counter variable.
Dim Item
'Repeat this loop until the counter equals the number of items
'in the collection.
For Item = 1 to Session.Contents.Count
Response.Write Session.Contents(Item) & "<BR>"
Next
%>
可以在腳本中使用 for 語句在集合中循環。在 JScript 的 for 語句中使用 Count 屬性時,為了收到更大的效果,應該將 Count 值分配給本地變量並使用該變量設置計數器終值。這樣,腳本引擎就不需要每次循環都查尋 Count 的值。下面的例子展示了這個技巧:
<%
var item, numitems;
numitems = Session.Contents.Count;
for (item = 1; item <= numitems; item++) {
Response.Write(Session.Contents(item) + "<BR>")
}
%>
Microsoft JScript 3.0 引入了 Enumerator 對象。可以使用該對象遍歷 ASP 集合。atEnd 方法指出了集合中是否還存在項目。moveNext 方法移動到集合中的下一個項目。
<%
// Create an Enumerator object
var mycoll = new Enumerator(Session.Contents);
//Iterate through the collection and display each item
while (!mycoll.atEnd()) {
var x = mycoll.item();
Response.Write(Session.Contents(x) + "<BR>");
mycoll.moveNext();
}
%>
遍歷帶子關鍵字 (Subkeys) 的集合
腳本在單一 cookIE 中嵌入相關值以減少在浏覽器和 Web 服務器之間傳送的 cookie 數目。因此 Request 和 Response 對象的 Cookies 集合能夠在單一項目中擁有多個值。這些子項目或子關鍵字可以被單個訪問。只有 Request.Cookies 和 Response.Cookies 集合支持子關鍵字 (Subkeys)。Request.Cookies 只支持讀操作;Response.CookIEs 只支持寫操作。
可以列舉 Request.Cookie 集合中所有的 cookie 以及 Cookie 中所有的子關鍵字 (Subkeys)。但是,如果在沒有子關鍵字 (Subkeys) 的 Cookie 上遍歷子關鍵字,將不會產生任何結果。通過使用 .HasKeys 語法首先檢查 cookIE 是否含有子關鍵字 (Subkeys),就可以避免這種情況。下面的這個例子展示了這個技巧。
<%
'Declare counter variables
Dim CookIE, Subkey
'Display the entire cookIE collection.
For Each Cookie in Request.CookIEs
Response.Write CookIE & "<BR>"
If Request.Cookies(CookIE).HasKeys Then
'Display the subkeys
For Each Subkey in Request.Cookies(CookIE)
Response.Write Subkey & "=" & Request.Cookies(CookIE)(Subkey) & "<BR>"
Next
Else
Response.Write "No subkeys in this cookIE <BR>"
End If
Next
%>
遍歷對象集合
Session 和 Application 集合可以保存數量變量或者對象實例。Contents 集合擁有數量變量和通過調用 Server.CreateObject 生成的對象實例。StaticObjects 集合擁有在 Global.asa 文件中使用 Html <OBJECT> 元素創建的對象。
在遍歷包含對象的集合時,可以訪問對象的標識符或對象的方法和屬性。例如,假設應用程序使用一些對象創建用戶帳號,而且每個對象有初始化方法,可以遍歷 StaticObjects 集合來調用每個初始化方法:
<%
For Each Object in Session.StaticObjects
Session.StaticObjects(Object).InitializeUser
Next
%>
ASP 集合有何不同之處?
盡管在本主題中討論的 ASP 集合與 Visual Basic 的 Collection 對象非常相似,但還是有些不同。ASP 集合支持 Count 屬性和 Item 方法,但不支持 Add 和 Remove 方法。