ASP講座シリーズ(8) コレクションの使い方
著者:Eve Cole
更新時間:2009-05-30 19:59:11
ほとんどの ASP 組み込みオブジェクトはコレクションをサポートしています。コレクションは、文字列、数値、オブジェクト、その他の値が保存される場所です。コレクションは配列とよく似ていますが、項目が保存または取得されるときにコレクションが自動的に展開され、検索される点が異なります。配列とは異なり、コレクションが変更されると、項目の位置が移動します。項目には、名前、インデックス、またはコレクション内のすべての項目を横断することによってアクセスできます。
名前とインデックスによる項目へのアクセス 項目名を使用して、コレクション内の特定の項目にアクセスできます。たとえば、Contents コレクションには、Session オブジェクトに格納されているすべての変数が保持されます。 Server.CreateObject によって作成されたすべてのオブジェクトも所有します。次のユーザー情報が Session オブジェクトに格納されていると仮定します。
<%
Session.Contents("名") = "サム"
Session.Contents("姓") = "ウー"
Session.Contents("年齢") = 29
%>
アイテムがコレクションに保存されたときに、アイテムに関連付けられた名前を使用してアイテムにアクセスできます。たとえば、次の式は文字列「Sam」を返します。
<%= Session.Contents("FirstName") %>
項目に関連付けられたインデックスまたは番号を使用して項目にアクセスすることもできます。たとえば、次の式は、Session オブジェクトの 2 番目のストレージ スロットに格納されている情報を取得し、「Woo」を返します。
<%= Session.Contents(2) %>
ASP コレクションには 1 から始まる番号が付けられます。アイテムがコレクションに追加またはコレクションから削除されると、アイテムに関連付けられたインデックスが変更されます。したがって、項目のインデックスが変更されないままであると想定することはできません。次のトピックで説明するように、インデックスを使用したアクセスは、通常、コレクションを走査したり、読み取り専用コレクション内の項目にアクセスしたりするために使用されます。
プロジェクトには、短縮名を使用してアクセスします。 ASP は、オブジェクトに関連付けられたコレクションを特定の順序で検索します。特定の名前の項目がオブジェクトのコレクション内で 1 回だけ出現する場合は、コレクションの名前を削除できます。
<%= セッション("名") %>
Application オブジェクトまたは Session オブジェクトに格納されている項目にアクセスする場合、通常はコレクション名を削除しても安全です。ただし、Request オブジェクトの場合は、コレクションに重複した名前が含まれる可能性があるため、コレクション名を指定することをお勧めします。
コレクションの走査 コレクションのすべてのアイテムを走査して、コレクションに格納されているアイテムについて確認したり、アイテムを変更したりできます。コレクションを走査するときは、コレクション名を指定する必要があります。たとえば、VBScript で For...Each ステートメントを使用して、Session オブジェクトに格納されている項目にアクセスできます。
<%
' カウンタ変数を宣言します。
ディムアイテム
' コレクション内の各項目について、その値を表示します。
Session.Contents の各項目について
Response.Write Session.Contents(Item) & "<BR>"
次
%>
VBScript で For...Next ステートメントを使用すると、コレクションを反復処理できます。たとえば、上記の例でセッションに保存されている 3 つの項目をリストするには、次のステートメントを使用します。
<%
' カウンタ変数を宣言します。
ディムアイテム
' カウンタの値が 3 になるまでループを繰り返します。
項目 = 1 ~ 3 の場合
Response.Write Session.Contents(Item) & "<BR>"
次
%>
コレクションに格納されている項目の数は一般に不明であるため、ASP はコレクション内の項目の数を返すコレクションの Count プロパティをサポートしています。 Count プロパティを使用して、カウンターの最終値を指定できます。
<%
' カウンタ変数を宣言します。
ディムアイテム
'カウンターがアイテムの数と等しくなるまでこのループを繰り返します
コレクションの中で。
項目 = 1 の場合、Session.Contents.Count まで
Response.Write Session.Contents(Item) & "<BR>"
次
%>
スクリプトで for ステートメントを使用すると、コレクションをループできます。 JScript の for ステートメントで Count プロパティを使用する場合、より大きな結果を得るには、Count 値をローカル変数に割り当て、その変数を使用して最終的なカウンター値を設定する必要があります。この方法では、スクリプト エンジンはループするたびに Count の値を検索する必要がありません。次の例は、この手法を示しています。
<%
var item、numitems;
numitems = セッション.コンテンツ.カウント;
for (item = 1; item <= numitems; item++) {
Response.Write(Session.Contents(項目) + "<BR>")
}
%>
Microsoft JScript 3.0 では、Enumerator オブジェクトが導入されました。このオブジェクトを使用して、ASP コレクションを走査できます。 atEnd メソッドは、コレクション内に項目がまだあるかどうかを示します。 moveNext メソッドは、コレクション内の次の項目に移動します。
<%
// Enumerator オブジェクトを作成する
var mycoll = 新しい列挙子(Session.Contents);
// コレクションを反復処理し、各項目を表示します
while (!mycoll.atEnd()) {
var x = mycoll.item();
Response.Write(Session.Contents(x) + "<BR>");
mycoll.moveNext();
}
%>
サブキーのコレクションを反復処理するスクリプトは、ブラウザと Web サーバー間で送信される Cookie の数を減らすために、関連する値を 1 つの Cookie に埋め込みます。したがって、Request オブジェクトと Response オブジェクトの Cookie コレクションは、1 つの項目に複数の値を持つことができます。これらのサブ項目またはサブキーワードには個別にアクセスできます。 Request.Cookies コレクションと Response.Cookies コレクションのみがサブキー (サブキー) をサポートします。 Request.Cookies は読み取り操作のみをサポートし、Response.Cookies は書き込み操作のみをサポートします。
Request.Cookie コレクション内のすべての Cookie と Cookie 内のすべてのサブキー (サブキー) を列挙できます。ただし、サブキーのない Cookie でサブキーを反復処理しても結果は生成されません。これを回避するには、.HasKeys 構文を使用して、Cookie にサブキーが含まれているかどうかを最初に確認します。以下の例は、このテクニックを示しています。
<%
'カウンター変数を宣言する
薄暗いクッキー、サブキー
' Cookie コレクション全体を表示します。
Request.Cookies の各 Cookie について
Response.Write Cookie & "<BR>"
Request.Cookies(Cookie).HasKeys の場合
'サブキーを表示します
Request.Cookies(Cookie) の各サブキーについて
Response.Write サブキー & "= & Request.Cookies(Cookie)(サブキー) & "<BR>"
次
それ以外
Response.Write "この Cookie にはサブキーがありません<BR>"
終了の場合
次
%>
オブジェクトのコレクションを反復処理する
セッション コレクションとアプリケーション コレクションは、量的変数またはオブジェクト インスタンスを保持できます。 Content コレクションには、Server.CreateObject の呼び出しによって生成された数量変数とオブジェクト インスタンスが保持されます。 StaticObjects コレクションには、Global.asa ファイル内の HTML <OBJECT> 要素を使用して作成されたオブジェクトが保持されます。
オブジェクトを含むコレクションを反復処理する場合、オブジェクトの識別子またはオブジェクトのメソッドとプロパティにアクセスできます。たとえば、アプリケーションがユーザー アカウントを作成するために多数のオブジェクトを使用し、各オブジェクトに初期化メソッドがあるとします。StaticObjects コレクションを反復処理して、各初期化メソッドを呼び出すことができます。
<%
Session.StaticObjects の各オブジェクトについて
Session.StaticObjects(Object).InitializeUser
次
%>
ASP コレクションはどのように異なりますか?
このトピックで説明する ASP コレクションは Visual Basic の Collection オブジェクトに非常に似ていますが、いくつかの違いがあります。 ASP コレクションは Count プロパティと Items メソッドをサポートしますが、Add メソッドと Remove メソッドはサポートしません。