ASP の組み込みオブジェクトの多くは、コレクションを提供しています。"コレクション" は、文字列、数値、オブジェクト、およびその他の値を格納する配列と類似したデータ構造です。ただし、コレクションから項目が取り出されたり、コレクションに項目が格納されたりすると、それに合わせて自動的にコレクションが拡大または縮小する点が、配列とは異なります。コレクションに対して変更が加えられると、コレクション内での項目の位置も移動します。一意の文字列キーおよびコレクション内でのインデックス (位置) を使用したり、コレクション内のすべての項目に対して操作を繰り返し実行したりすることにより、コレクション内の項目にアクセスすることができます。
コレクション内の特定の項目には、一意の文字列キー、またはその名前を使用してアクセスすることができます。たとえば、Contents コレクションは、Session オブジェクトに格納されたすべての変数を保持しています。また、Contents コレクションは、Server.CreateObject を呼び出してインスタンス生成されたオブジェクトもすべて保持しています。たとえば、次のユーザー情報を Session オブジェクトに格納したとします。
<% Session.Contents("FirstName") = "Meng" Session.Contents("LastName") = "Phua" Session.Contents("Age") = 29 %>
この場合、各項目には、コレクションに項目を格納するときに関連付けた文字列キーを使ってアクセスすることができます。たとえば、次の式は文字列 "Meng" を返します。
<%= Session.Contents("FirstName") %>
項目に関連付けられたインデックス (番号) を使用して項目にアクセスすることもできます。たとえば、次の式は Session オブジェクト内で 2 番目に格納されている情報を取得し、"Phua" を返します。
<%= Session.Contents(2) %>
ASP のコレクションには、1 から番号が付けられています。 項目に関連付けられたインデックスは、コレクションへの項目の追加やコレクションからの項目の削除によって変わることがあります。したがって、項目のインデックスが常に同じであると仮定することはできません。一般に、インデックスを使用したアクセスは、次で説明するようにコレクション全体に対して繰り返し操作を行う場合か、または読み取り専用のコレクション内の項目にアクセスする場合に使用します。
省略記法を使用して、項目に名前でアクセスすることもできます。ASP は、オブジェクトに関連付けられているコレクションを一定の順序で探します。特定の名前を持つ項目が、あるオブジェクトのコレクションに 1 つしかない場合は、コレクション名を省略できますが、結果としてパフォーマンスが低下することがあります。
<%= Session("FirstName") %>
Application オブジェクトまたは Session オブジェクトに格納された項目にアクセスする場合は、通常、コレクション名を省略しても目的の項目に安全にアクセスできます。しかし、Request オブジェクトの場合は、コレクション名を指定する方がより安全です。 これは、コレクションに重複した名前を持つ項目が含まれる可能性が高いためです。
コレクション内のすべての項目に対して操作を繰り返し実行すると、コレクションに格納されている内容を調べたり、項目を修正したりすることができます。コレクション全体に対して繰り返し操作を行う場合は、コレクション名を指定する必要があります。たとえば、VBScript の For...Each ステートメントを使用すると、Session オブジェクトに格納されているすべての項目にアクセスすることができます。
<% 'Declare a counter variable. Dim strItem 'For each item in the collection, display its value. For Each strItem In Session.Contents Response.Write Session.Contents(strItem) & "<BR>" Next %>
VBScript の For...Next ステートメントを使用して、コレクション全体に対して繰り返し操作を実行することもできます。たとえば、前の例の Session に格納されている 3 つの項目を一覧表示するには、次のステートメントを使用します。
<% 'Declare a counter variable. Dim intItem 'Repeat the loop until the value of counter is equal to 3. For intItem = 1 To 3 Response.Write Session.Contents(intItem) & "<BR>" Next %>
通常、コレクション内に格納されている項目の数はわかりませんが、ASP ではコレクション内の項目を返す Count プロパティをサポートしているため、Count プロパティを使用してカウンタの最後の値を指定することができます。
<% 'Declare a counter variable. Dim lngItem, lngCount lngCount = Session.Contents.Count 'Repeat this loop until the counter equals the number of items 'in the collection. For lngItem = 1 To lngCount Response.Write Session.Contents(lngItem) & "<BR>" Next %>
JScript では、for ステートメントを使うと、コレクション全体に対してループを実行できます。JScript の for ステートメントで Count プロパティを使用する場合は、効率を高めるために、Count の値をローカル変数に割り当ててから、このローカル変数を使用してカウンタの最後の値を設定します。この方法を使うと、ループを繰り返すたびにスクリプト エンジンが Count の値を求める必要がなくなります。この例を次に示します。
<% var intItem, intNumItems; intNumItems = Session.Contents.Count; for (intItem = 1; intItem <= intNumItems; intItem++) { Response.Write(Session.Contents(intItem) + "<BR>") } %>
Microsoft JScript では、Enumerator オブジェクトがサポートされており、このオブジェクトを使って ASP のコレクションに対する繰り返し操作を実行することもできます。atEnd メソッドは、コレクション内にまだ項目があるかどうかを示します。moveNext メソッドは、コレクション内の次の項目に移動します。
<% Session.Contents("Name") = "Suki White" Session.Contents("Department") = "Hardware" . . . //Create an Enumerator object. var mycollection = new Enumerator(Session.Contents); //Iterate through the collection and display each item. while (!mycollection.atEnd()) { var x = myCollection.item(); Response.Write(Session.Contents(x) + "<BR>"); myCollection.moveNext(); } %>
スクリプトでは、ブラウザと Web サーバーの間でやり取りされる cookie の数を減らすために、いくつかの関連する値を 1 つの cookie に埋め込むことがあります。このため、Request オブジェクトおよび Response オブジェクトの Cookies コレクションは、1 つの項目内に複数の値を保持していることがあります。これらのサブ項目 (サブキー) には、個別にアクセスできます。サブキーをサポートしているのは、Request.Cookies コレクションと Response.Cookies コレクションのみです。Request.Cookies は読み取り操作のみを、Response.Cookies は書き込み操作のみをサポートしています。
次の例は、通常の cookie とサブキーを持つ cookie を作成します。
<% 'Send a cookie to the browser. Response.Cookies("Fruit") = "Pineapple" 'Send a cookie with subkeys to browser. Response.Cookies("Mammals")("Elephant") = "African" Response.Cookies("Mammals")("Dolphin") = "Bottlenosed" %>
HTTP 応答内の cookie テキストはブラウザに送信され、次のように表示されます。
HTTP_COOKIE= Mammals=ELEPHANT=African&DOLPHIN=Bottlenosed; Fruit=Pineapple;
Request.Cookies コレクション内のすべての cookie、および 1 つの cookie 内のすべてのサブキーを、列挙することもできます。ただし、サブキーを持たない cookie に対して、サブキーを使った繰り返し操作を実行しても、何も出力されません。これを避けるには、Cookies コレクションの HasKeys 属性を使って cookie がサブキーを持っているかどうかを先にチェックしておきます。この例を次に示します。
<% 'Declare counter variables. Dim Cookie, Subkey 'Display the entire cookie collection. For Each Cookie In Request.Cookies Response.Write Cookie If Request.Cookies(Cookie).HasKeys Then Response.Write "<BR>" 'Display the subkeys. For Each Subkey In Request.Cookies(Cookie) Response.Write " ->" & Subkey & " = " & Request.Cookies(Cookie)(Subkey) & "<BR>" Next Else Response.Write " = " & Request.Cookies(Cookie) & "<BR>" End If Next %>
このスクリプトは、次のような結果を返します。
Mammals ->ELEPHANT = African ->DOLPHIN = Bottlenosed Fruit = Pineapple
Cookies コレクション、Request コレクション、Response コレクション、および ClientCertificate コレクションは、同じ一意の文字列キー名を参照することができます。たとえば、次のステートメントでは、User という同じキー名を参照していますが、コレクションによって異なる値が返されます。
strUserID = Request.Cookies("User") strUserName = Request.QueryString("User")
キー名の大文字と小文字は、キーに値を割り当てる最初のコレクションによって設定されます。たとえば、次のスクリプトの場合を考えてみます。
<% 'Retrieve a value from QueryString collection using the UserID key. strUser = Request.QueryString("UserID") 'Send a cookie to the browser, but reference the key, UserId, which has a different spelling. Response.Cookies("UserId")= "1111-2222" Response.Cookies("UserId").Expires="December 31, 2000" %>
cookie には、キー名 UserId が割り当てられているように見えますが、実際に cookie に割り当てられているキー名は、大文字の "D" が使われている UserID の方です。このキーの大文字と小文字は、最初に QueryString コレクションで定義されています。
コレクションの値への参照では、キー名の大文字と小文字を区別しないため、アプリケーションで、キー名の大文字と小文字を区別した処理が使用されていない限り、前の例のようにキー名の大文字と小文字が異なっていても、スクリプトに影響を与えることはありません。
Session コレクションと Application コレクションは、スカラ変数またはオブジェクト インスタンスのいずれかを保持することができます。Contents コレクションは、スカラ変数、および Server.CreateObject を呼び出して作成されたオブジェクトのインスタンスの両方を保持できます。StaticObjects コレクションは、Session オブジェクトのスコープ内で HTML の <OBJECT> タグを使用して作成されたオブジェクトを保持できます。この方法でオブジェクトのインスタンスを作成する方法の詳細については、「オブジェクトのスコープを設定する」を参照してください。
オブジェクトを含むコレクションに対して繰り返し操作を実行する場合は、オブジェクトの Session 状態または Application 状態の情報にアクセスするか、あるいはオブジェクトのメソッドまたはプロパティにアクセスすることができます。たとえば、ユーザー アカウントを作成するために、アプリケーションでいくつかのオブジェクトを使用していて、各オブジェクトに初期化メソッドがある場合、StaticObjects コレクションに対して繰り返し操作を実行すると、オブジェクトのプロパティを取得することができます。
<% For Each Object in Session.StaticObjects Response.Write Object & ": " & Session.StaticObjects(Object) Next %>
ここで説明した ASP のコレクションは Visual Basic の Collection オブジェクトと類似していますが、一部に相違があります。ASP コレクションでは、Count プロパティ、Item メソッド、Remove メソッド、および RemoveAll メソッドはサポートしていますが、Add メソッドはサポートしていません。