Application オブジェクトは、指定されたアプリケーションのすべてのユーザーの間で情報を共有するために使うことができます。ASP 対応アプリケーションは仮想ディレクトリおよびそのサブディレクトリの中にあるすべての .asp ファイルとして定義されますが、Application オブジェクトは複数のユーザーが共有できるため、それらのユーザーが同時にプロパティを交換できないようにすることを保証するために、Lock メソッドと Unlock メソッドが用意されています。
Application.method
Lock メソッドは、ほかのクライアントが Application オブジェクトのプロパティを変更できないようにします。 | |
Unlock メソッドは、ほかのクライアントが Application オブジェクトのプロパティを変更できるようにします。 |
上記のイベントのためのスクリプトは Global.asa ファイルの中で宣言されます。これらのイベントおよび Global.asa ファイルの詳細については、「Global.asa リファレンス」を参照してください。
Application オブジェクトには値を格納できます。Application オブジェクトに格納された情報はアプリケーションを通じて利用でき、アプリケーション スコープを持ちます。次のスクリプト例では 2 種類の変数を格納しています。
<% Application("greeting") = "私の Web ワールドへようこそ !" Application("num") = 25 %>
しかし、主要スクリプト言語として Visual Basic(R) Scripting Edition を使用していて Application オブジェクトにオブジェクトを格納する場合は、キーワード Set を使う必要があります。このスクリプト例を次に示します。
<% Set Application("Obj1") = Server.CreateObject("MyComponent") %>
この後、次のようにして MyObj のメソッドとプロパティを後続の Web ページ上で呼び出すことができます。
<% Application("Obj1").MyObjMethod %>
または、オブジェクトのローカル コピーを取り出して次のようにすることもできます。
<% Set MyLocalObj1 = Application("Obj1") MyLocalObj1.MyObjMethod %>
アプリケーション スコープを持つオブジェクトを作成する方法としては、このほか Global.asa ファイルの中で <OBJECT> タグを使う方法があります。詳細については、「Global.asa リファレンス」を参照してください。
ただし、Application オブジェクトに組み込みオブジェクトを格納することはできません。たとえば次のようなスクリプトはすべてエラーを返します。
<% Set Application("var1") = Session Set Application("var2") = Request Set Application("var3") = Response Set Application("var4") = Server Set Application("var5") = Application %>
Application オブジェクトにオブジェクトを格納するときは、使用するスレッド モデルをあらかじめ判別しておいてください。Application オブジェクトに格納できるのは "free" または "apartment" としてマークされているオブジェクトだけです。詳細については、「ASP 用コンポーネントの作成」の「スレッド モデル」を参照してください。
Application オブジェクトに配列を格納する場合は、配列に格納されている要素を直接交換しないようにしてください。たとえば、次のようなスクリプトは意図したとおりに動作しません。
<% Application("StoredArray")(3) = "新しい値" %>
これは、Application オブジェクトがコレクションとして実装されているためです。この場合、配列要素 StoredArray(3) には新しい値が設定されるのではなく、値のインデックスがコレクションに格納されることになり、その場所に格納されている情報がすべて上書きされてしまいます。
このため、Application オブジェクトに配列を格納する場合は、配列のコピーを渡してからその要素の取得や変更を行うようにしてください。そして、変更内容が保存されるように、配列の操作が終わった時点でもう一度 Application オブジェクトに配列を格納してください。以上の操作の例を次に示します。
---file1.asp--- <% ' 配列の作成と初期化 dim MyArray() Redim MyArray(5) MyArray(0) = "hello" MyArray(1) = "some other string" ' Application オブジェクトに配列を格納 Application.Lock Application("StoredArray") = MyArray Application.Unlock Response.Redirect("file2.asp") %> ---file2.asp--- <% ' Application オブジェクトから配列を取得して ' その 2 番目の要素を変更する LocalArray = Application("StoredArray") LocalArray(1) = " there" ' 文字列 "hello there" を出力 Response.Write(LocalArray(0)&LocalArray(1)) ' Application オブジェクトに再度配列を格納する ' これにより StoredArray の値が新しい値に上書きされる Application.Lock Application("StoredArray") = LocalArray Application.Unlock %>
<%
Application.Lock
Application("NumVisits") = Application("NumVisits") + 1
Application.Unlock
%> このアプリケーション ページには既に <%= Application("NumVisits") %> 回 訪れています !
上のスクリプト例では、アプリケーション変数 NumVisits を使い、特定のページへのアクセス回数を格納しています。まず、現在のクライアントだけが NumVisits へのアクセスや値の交換をすることができるように Lock メソッドを呼び出し、その後ほかのユーザーが Application オブジェクトにアクセスできるように Unlock メソッドを呼び出しています。