ASP 対応アプリケーションの開発

ASP 対応アプリケーションは、Web サーバー上の仮想ディレクトリと、その中にあるすべてのフォルダおよびファイルで構成されます。仮想ディレクトリの詳細については、Microsoft Web サーバーのオンライン マニュアルを参照してください。

アプリケーションは 1 ページのホーム ページだけにすることもできます。ホーム ページには、MSN(TM) オンライン サービス (www.msn.com) の独自のホーム ページなど、動的な要素をいくつも追加することができます。また、互いに関連するページや機能を複雑に組み合わせたページにすることもできます。

ASP 対応アプリケーションを使うときは、その状態を管理することができます。状態とは情報を保持する能力のことで、次の 2 種類の状態を ASP で管理できます。

これらの状態を管理するために使用する ASP の機能として、組み込みオブジェクトである Session オブジェクトおよび Application オブジェクトがあります。

Session オブジェクトと Application オブジェクトの使用

ASP の組み込みオブジェクトである Session オブジェクトと Application オブジェクトを使い、作成する ASP 対応アプリケーションの機能を拡張することができます。

Session オブジェクトは、ユーザーがアプリケーションを使用しているときにそのユーザーが情報を管理するために使います。つまり、セッションは単一のユーザーだけのものになります。 Application オブジェクトは、1 つの ASP 対応アプリケーションを使用しているすべてのユーザーが共有できる共通の情報を格納するために使います。

Global.asa ファイルの使用

ASP 対応アプリケーションには、それぞれ 1 つずつ Global.asa というファイルを持たせることができます (ファイル名拡張子 .asa は "Active Server Application" の意)。このファイルは必ずアプリケーションのルート ディレクトリに格納する必要があります。ASP は、次のいずれかの条件が満たされたときにこの Global.asa ファイルを読み取ります。

Global.asa ファイルには次の情報を含めることができます。

詳細については、「Global.asa リファレンス」を参照してください。

アプリケーション開始イベントとセッション開始イベント

アプリケーション開始イベントとセッション開始イベントは、それぞれ Application_OnStart Session_OnStart です。これらのプロシージャには、アプリケーションやセッションが開始したときに必ず実行させるスクリプトを記述します。アプリケーションとセッションが同時に開始した場合、ASP はアプリケーション開始イベントを先に処理してからセッション開始イベントを処理します。

アプリケーション開始イベントを定義する構文を次に示します。

<SCRIPT LANGUAGE=VBScript RUNAT=Server> 
Sub Application_OnStart
  ' アプリケーション開始イベント用スクリプトをここに挿入します。
End Sub
</SCRIPT> 

たとえば、セッションの開始ごとに Ad Rotator コンポーネントのインスタンスを作成する場合は、次のようなプロシージャを定義できます。

<SCRIPT LANGUAGE=VBScript RUNAT=Server> 
Sub Session_OnStart
  Set Session("MyAd")=Server.CreateObject("MSWC.Adrotator")
End Sub 
</SCRIPT> 

アプリケーション終了イベントとセッション終了イベント

アプリケーション終了イベントとセッション終了イベントは、それぞれ Application_OnEndSession_OnEnd です。これらのイベントは、アプリケーション開始イベントおよびセッション開始イベントと同じように Global.asa ファイル内に含めることのできるプロシージャです。開始イベントと異なる点は、終了イベントはセッションやアプリケーションの終了時にだけ発生するという点です。したがって、これらのプロシージャには終了時に実行するスクリプトを含めます。セッションとアプリケーションが同時に終了した場合、ASP はセッション終了イベントを先に処理してからアプリケーション終了イベントを処理します。

セッション終了イベントを定義する構文を次に示します。

<SCRIPT LANGUAGE=VBScript RUNAT=Server> 
Sub Session_OnEnd
  ' セッション終了イベント用スクリプトをここに挿入します。
End Sub
</SCRIPT> 

アプリケーション終了イベントを定義する構文を次に示します。

<SCRIPT LANGUAGE=VBScript RUNAT=Server> 
Sub Application_OnEnd
   'アプリケーション終了イベント用スクリプトをここに挿入します。
End Sub 
</SCRIPT> 

セッションの終了

ユーザーがアプリケーションの中で一定の時間内にページの要求や更新をしなかった場合、セッションは自動的に終了します。デフォルトではこの時間は 20 秒です (デフォルト値の変更方法の詳細については、「レジストリ エントリの設定」を参照してください)。

Session オブジェクトの Abandon メソッドを使えば、セッションを明示的に終了できます。たとえば、次のようなコマンドを含む .asp ファイルの URL を ACTION パラメータに設定した [終了] ボタンを、フォーム上に配置することができます。

<% Session.Abandon %> 

特定のセッションに対してデフォルトの 20 秒よりも長い制限時間を設定する場合は、Session オブジェクトの Timeout プロパティを設定できます。たとえば、次のスクリプトは制限時間を 30 秒に設定します。

<%  Session.Timeout = 30  %> 
注意   制限時間をデフォルト値未満の値に設定することはできません。

アプリケーションの終了

アプリケーションは、Web サーバーがシャット ダウンしたときに終了します。

セッションの管理

Session オブジェクトを使い、オブジェクトや変数にセッション スコープを持たせるように設定することができます。セッション スコープとは、コンポーネント インスタンスやオブジェクト、または変数が利用できる Active Server Pages 内の有効範囲を示すものです。たとえば、セッション スコープを持つ変数はそのセッションの内部からしかアクセスできません。

セッションは次の 3 つのいずれかの条件が満たされたときに開始されます。

セッション ID と Cookies

ユーザーが指定のアプリケーション内にある .asp ファイルをはじめて要求すると、ASP はセッション ID を生成します。そして、ユーザーのブラウザに応答を返し、ブラウザはそのセッション ID に対応する cookie を作成します。セッション ID は複雑なアルゴリズムに基づいて生成される数値であり、ユーザーのセッションを識別します。セッション ID cookie は、クライアントのブラウザに送られるトークンです。cookie は有効期限が設定されないため、クライアント コンピュータのハード ディスクに格納されることはありません。

注意   市販のブラウザのほとんどは cookies をサポートしていますが、一部サポートしていないものもあります。そのようなブラウザでは、ASP による Session オブジェクトはサポートされません。

セッション ID cookie はロッカーの鍵に例えることができます。つまり、あるセッションの間、ユーザーがアプリケーションとやり取りをしているときに、ASP はユーザーのための情報をサーバー上の "ロッカー" に格納します。このとき、ユーザーのセッション ID cookie が HTTP 要求ヘッダーを通じて ASP から送られます。そして、ロッカーの中身を見るために鍵を使うのと同じように、そのセッション ID cookie を使ってユーザーの情報にアクセスすることができます。ASP は、ページの要求を受信するたびに、そのセッション ID cookie が HTTP 要求ヘッダーにあるかどうか調べます。

Session オブジェクトへの変数の格納

Session オブジェクトでの変数の作成と格納は、新しい変数を参照するだけで行えます。たとえば、次のコマンドは 3 つの新しい変数を Session オブジェクトに格納します。

<% 
Session("Initiated") = Now 
Session("Fidelity") = "Low" 
Set Session("myObj") = Server.CreateObject("someObj") 
%>
 

ユーザー専用の設定の保存

ユーザー専用の設定も Session オブジェクトに格納できます。たとえば、ユーザーがアプリケーションの 1 ページ目でテキストのみのコンテンツを指定できるようにし、指定した場合はそのアプリケーションからユーザーがアクセスするほかのすべてのページについてもテキストのみのコンテンツにする、ということができます。

<%If Session("Fidelity") = "Low" Then %> 
このページはテキストのみのページです。
<% Else %> 
このページはマルチメディア対応のページです
<% End If %> 

アプリケーションの管理

Application オブジェクトを使い、ASP 対応アプリケーションを使用しているすべてのユーザーがアクセスするプロパティを設定することができます。

アプリケーション ユーザーへのメッセージのポスト

Application オブジェクトを使い、ユーザーがアプリケーションを使い始めるときに表示するメッセージをポストすることができます。ここでは、Application_OnStart というプロシージャの中で message というアプリケーション プロパティを定義する例を示します。この例では、後続のユーザーがメッセージの内容を変更することができるようにしています。

アプリケーション全体で有効なメッセージは、Global.asa 内でデフォルト値として指定します。

<SCRIPT LANGUAGE=VBScript RUNAT=Server> 
Sub Application_OnStart
  Application("Message") = "これはデフォルトのメッセージです。" 
End Sub
</SCRIPT> 

A.asp は、メッセージを表示します。A.asp を要求したユーザーはすべてこのグローバルなメッセージを見ることができます。

<HTML> 
<BODY>
これはメッセージです: <p> 
<%= Application("Message") %>
</BODY>
</HTML> 

B.asp は、新しいメッセージの入力と変更を行うための手段をユーザーに与えます。

<HTML> 
<BODY>
<form method="post" action="C.asp"> 
アプリケーション全体で有効な新しいメッセージを入力してください:<BR> 
<input type="text" name="newmsg" size=60><p> 
<input type="submit" value="Submit"> 
</form> 
</BODY>
</HTML> 

C.asp は、ユーザーが B.asp で指定した値にグローバル メッセージの値を再設定し、そのユーザーを A.asp にリダイレクトして、新しいメッセージを表示します。

<% 
If Not IsEmpty(Request.Form("newmsg")) Then 
  Application.Lock
    Application("Message") = Request.Form("newmsg") 
  Application.Unlock
End If 
Response.Redirect("A.asp") 
%>

コンポーネントの有効範囲の設定

ASP 対応アプリケーションは、ActiveX サーバー コンポーネントのアプリケーションセッション、またはページに有効範囲 (スコープ) を持たせるようにコンポーネントを設定できます。

ActiveX サーバー コンポーネントのインスタンスを Session オブジェクトおよび Application オブジェクトに格納するには、Global.asa ファイルで <OBJECT> タグを使うか、または Server.CreateObject メソッドを使います。

<OBJECT> タグの使用

セッション スコープまたはアプリケーション スコープを持つコンポーネント インスタンスを Global.asa ファイル内で宣言するには、<OBJECT> タグとともに、拡張属性である RUNAT 属性 (必ずサーバーに設定する) と SCOPE 属性 (セッションまたはアプリケーションに設定可能) を使います。これには、登録名 (PROGID) メソッドか、または登録番号 (CLASSID) メソッドを使います。

次の例は、登録名 (PROGID) メソッドを使って Ad Rotator コンポーネントのセッションスコープ インスタンスを作成します。

<OBJECT RUNAT=Server SCOPE=Session ID=MyAd PROGID="MSWC.Adrotator">
</OBJECT>

次の例は、登録番号 (CLASSID) メソッドを使って Ad Rotator コンポーネントのアプリケーションスコープ インスタンスを作成します。

<OBJECT RUNAT=Server SCOPE=Application ID=MyAd 
CLASSID="Clsid:00000293-0000-0010-8000-00AA006D2EA4"></OBJECT> 

<OBJECT> タグを使ってコンポーネントのセッションスコープ インスタンスまたはアプリケーションスコープ インスタンスを宣言すると、コンポーネントに割り当てた変数が、セッションまたはアプリケーションのそれぞれの名前空間で有効になります。このため、コンポーネント インスタンスにアクセスするために Session または Application の組み込みオブジェクトを使う必要がなくなります。たとえば、.asp ファイルに前のスクリプト例と次に示すスクリプト コマンドを記述し、それをアプリケーションの一部として実行すると、前のスクリプト例で宣言されている Ad Rotator コンポーネントのインスタンスが開きます。

<%= MyAd.GetAdvertisement("addata.txt") %> 

また、特定の .asp ファイルの中で <OBJECT> タグを使い、ActiveX サーバー コンポーネント インスタンスを作成することもできます。この場合、SCOPE 属性は省略するか、または PAGE に設定できます。これによって生成されたコンポーネント インスタンスはページ スコープを持ちます。

Server.CreateObject メソッドの使用

Server.CreateObject メソッドを使い、コンポーネントのインスタンスを Session オブジェクトに格納できます。次の例は、Ad Rotator コンポーネントのインスタンスを Session オブジェクトに格納します。

<% Set Session("MyAd") = Server.CreateObject("MSWC.Adrotator") %> 

広告を表示するには、次のスクリプトを追加します。

<% Set MyAd = Session("MyAd") %> 
<%= MyAd.GetAdvertisement("addata.txt") %> 

パフォーマンスに関する問題

<OBJECT> タグで宣言されたコンポーネントの場合、それが .asp ファイルのスクリプト コマンドから参照されないかぎり、そのコンポーネントのインスタンスが生成されることはありません。これに対して、Server.CreateObject メソッドでは直ちにコンポーネントのインスタンスが生成されます。したがって、セッションスコープ コンポーネントのインスタンスを生成する場合には、Server.CreateObject メソッドよりも <OBJECT> タグによる生成のほうがパフォーマンスが良いということになります。

ページスコープ コンポーネントの作成の場合には、<OBJECT> タグでも Server.CreateObject メソッドでもパフォーマンスは同じになります。

<OBJECT> タグでは、single スレッド、free スレッド、または apartment スレッドの各オブジェクトを、Session オブジェクトおよび Application オブジェクトの両方に格納できます。一方、Server.CreateObject メソッドでも、それらのスレッドを Session オブジェクトに格納できます。しかし、どちらの場合でも格納するオブジェクトが "both" としてマークされていないかぎり、ASP はそのオブジェクトのあるアプリケーションまたはセッションを "single スレッド" とみなします。したがって、"both" としてマークされていないオブジェクトを格納した場合には、パフォーマンスに影響が出ることがあり、特に情報量の多いサイトではこの影響が顕著になります。スレッド モデルの詳細については、「ASP 対応コンポーネントの作成」を参照してください。


(C) 1996-1997 Microsoft Corporation. All rights reserved.