ASP系列講座(八)使用集合
作者:Eve Cole
更新時間:2009-05-30 19:59:11
大多數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 方法。