どのスクリプトがオブジェクトを使用できるかは、オブジェクトのスコープによって決まります。既定では、オブジェクトのインスタンスを作成すると、そのオブジェクトはページ スコープを持ちます。ページ スコープを持つオブジェクトには、同じ ASP ページの任意のスクリプト コマンドからアクセスできます。ページ スコープを持つオブジェクトは、.asp ファイルが要求の処理を終了すると解放されます。ほとんどのオブジェクトで推奨されるスコープは、ページ スコープです。ただし、オブジェクトのスコープを変更して、ほかのページのスクリプトからオブジェクトにアクセスできるようにすることもできます。ここでは、ページ スコープを持つオブジェクトの使用法、およびオブジェクトのスコープの変更方法について説明します。
ある ASP ページ上で Server.CreateObject または HTML <OBJECT> タグを使用して作成したオブジェクトは、そのページが処理されている間存在します。このオブジェクトは、そのページの任意のスクリプト コマンドからアクセスでき、ASP がそのページの処理を終えた時点で解放されます。このようなオブジェクトは、ページのスコープ (寿命) を持っているといいます。
一般に、ループ内でのオブジェクトの作成は避ける必要があります。ループ内でオブジェクトを作成する必要がある場合は、オブジェクトが使用するリソースを手動で解放してください。
<% Dim objAd For i = 0 To 1000 Set objAd = Server.CreateObject("MSWC.AdRotator") . . . objAd.GetAdvertisement . . . Set objAd = Nothing Next %>
"セッション スコープ" を持つオブジェクトは、アプリケーション内の新しいセッションごとに作成され、セッションが終了すると解放されます。したがって、セッション スコープを持つオブジェクトは、アクティブなセッションごとに 1 つ存在することになります。セッション スコープは、複数のスクリプトから呼び出されるものの、1 つのユーザー セッションのみを対象とするオブジェクトで使用します。オブジェクトにセッション スコープを与えるのは、必要な場合のみに限られます。スレッド モデルによって、オブジェクトのパフォーマンスおよびセキュリティ コンテキストが影響を受けるため、セッション スコープを使用する場合は、目的のオブジェクトを提供するコンポーネントのスレッド モデルについて知る必要があります。詳細については、後の「詳細情報 : パフォーマンスの問題」を参照してください。
オブジェクトにセッション スコープを与えるには、オブジェクトを ASP の Session 組み込みオブジェクトに格納します。セッション スコープを持つオブジェクトのインスタンスを生成するには、Global.asa ファイルで HTML の <OBJECT> タグを使用する方法と、ASP ページ上で Server.CreateObject メソッドを使用する方法があります。
Global.asa では、RUNAT 属性 (SERVER に設定する必要があります) および SCOPE 属性 (Session に設定する必要があります) を指定した <OBJECT> タグを使用できます。次の例は、セッション スコープを持つ Browser Capabilities コンポーネントの Browser Type オブジェクトのインスタンスを作成します。
<OBJECT RUNAT=SERVER SCOPE=Session ID=MyBrowser PROGID="MSWC.BrowserType"> </OBJECT>
オブジェクトを Session オブジェクトに格納した後は、アプリケーション内の任意のページからオブジェクトにアクセスできます。次のステートメントは、前の例の <OBJECT> タグによって作成されたオブジェクトのインスタンスを使用しています。
<%= If MyBrowser.browser = "IE" and MyBrowser.majorver >= 4 Then . . .%>
ASP ページでは、Server.CreateObject メソッドを使って Session 組み込みオブジェクトにオブジェクトを格納することもできます。次の例は、Browser Type オブジェクトのインスタンスを Session オブジェクトに格納します。
<% Set Session("MyBrowser") = Server.CreateObject("MSWC.BrowserType") %>
ほかの .asp ファイルにあるブラウザ情報を表示するには、まず、Session オブジェクトに格納された BrowserType オブジェクトのインスタンスを取得し、次にブラウザ名を表示する Browser メソッドを呼び出します。
<% Set MyBrowser = Session("MyBrowser") %> <%= MyBrowser.browser %>
<OBJECT> タグを使用して宣言したオブジェクトの場合、.asp ファイル内のスクリプト コマンドによってそのオブジェクトが参照されるまで、ASP はオブジェクトのインスタンスを生成しません。一方、Server.CreateObject メソッドは、直ちにオブジェクトのインスタンスを作成します。このため、セッション スコープを持つオブジェクトでは、<OBJECT> タグを使用する方が Server.CreateObject メソッドを使用する場合よりも拡張性が向上します。
"アプリケーション スコープ" を持つオブジェクトは、アプリケーションの起動時に作成されるオブジェクトの単一のインスタンスです。このオブジェクトは、すべてのクライアント要求において共有されます。Page Counter コンポーネントのオブジェクトなど、一部のユーティリティ オブジェクトではアプリケーション スコープで実行した方が良い場合がありますが、通常は、後の説明の中で推奨している別の方法を使用してください。また、オブジェクトのパフォーマンスとセキュリティ コンテキストはスレッド モデルによって影響を受けます (後の「詳細情報 : パフォーマンスの問題」を参照してください)。
オブジェクトにアプリケーション スコープを与えるには、ASP の Application 組み込みオブジェクトにオブジェクトを格納します。アプリケーション スコープを持つオブジェクトのインスタンスを作成するには、Global.asa ファイルで <OBJECT> タグを使用する方法と、.asp ファイル上で Server.CreateObject メソッドを使用する方法があります。
Global.asa ファイルでは、RUNAT 属性 (Server に設定する必要があります) および SCOPE 属性 (Application に設定する必要があります) を指定した <OBJECT> タグを使用できます。たとえば、次に示すのは、<OBJECT> タグを使用し、Ad Rotator オブジェクトのアプリケーション スコープのインスタンスを作成している例です。
<OBJECT RUNAT=SERVER SCOPE=Application ID=MyAds PROGID="MSWC.AdRotator"> </OBJECT>
Application 状態に Ad Rotator オブジェクトを格納した後、次のようなステートメントを使用して、アプリケーションの任意のページからアクセスできるようになります。
<%=MyAds.GetAdvertisement("CustomerAds.txt") %>
また .asp ファイルでは、次の例のように Server.CreateObject を使うと、Application 組み込みオブジェクトにオブジェクトのインスタンスを格納できます。
<% Set Application("MyAds") = Server.CreateObject("MSWC.Adrotator")%>次の例にあるように、Application の状態から Ad Rotator オブジェクトのインスタンスを取得すると、アプリケーションの .asp ファイルの広告を表示できます。
<%Set MyAds = Application("MyAds") %> <%=MyAds.GetAdvertisement("CustomerAds.txt") %>一般に、辞書オブジェクトまたはレコードセットのように、初期化に時間がかかる項目やオブジェクトの場合には、アプリケーション状態またはセッション状態の使用を徹底的に試みる必要があります。ただし、メモリやデータベース接続などのセッション状態またはアプリケーション状態のオブジェクトが、大量のリソースを消費している場合には、別の方法によりこれらのオブジェクトを実装する必要があります。たとえば、コンポーネントのスレッド モデルは、そのコンポーネントから作成するオブジェクト、特にセッション スコープまたはアプリケーション スコープを持つオブジェクトのパフォーマンスに影響を与える可能性があります。
ほとんどの場合、アプリケーション スコープまたはセッション スコープを持つオブジェクトを作成するよりも、ページ レベルで作成されたオブジェクトに情報を渡すためのセッション スコープまたはアプリケーション スコープを持つ変数を使用する方が、ソリューションとして優れています。たとえば、ADO の Connection オブジェクトにセッション スコープまたはアプリケーション スコープを与えることは避ける必要があります。これは、このオブジェクトが作成する接続が長時間開いたままになり、スクリプトでは接続プールを利用できなくなるためです。しかし、ODBC または OLE DB 接続文字列を Session または Application 組み込みオブジェクトに格納すれば、ページ上で作成した Connection オブジェクト インスタンスのプロパティを設定する文字列にアクセスすることができます。これにより、頻繁に使用する情報をセッション状態またはアプリケーション状態に保存し、必要な場合に限り、この情報を使用するオブジェクトを作成することができます。変数にスコープを設定する方法の詳細については、「変数と定数を使用する」を参照してください。
新しいオブジェクトのプロパティおよびメソッドの作成と初期化を行うコンストラクタ関数を定義することにより、独自の JScript オブジェクトを作成できます。オブジェクトのインスタンスは、スクリプトで new 演算子を使用してコンストラクタを呼び出したときに生成されます。ユーザー定義の JScript オブジェクトは、ASP のサーバー側スクリプトでサポートされ、オブジェクトがページ スコープを持つ場合は適切に動作します。しかし、ユーザー定義のオブジェクトにアプリケーション スコープを与えることはできません。また、ユーザー定義の JScript オブジェクトにセッション スコープを与えると、オブジェクトの機能に影響することがあります。具体的には、オブジェクトがセッション スコープを持つ場合、ほかのページのスクリプトからオブジェクトのプロパティにアクセスすることはできますが、メソッドを呼び出すことはできません。また、ユーザー定義の JScript オブジェクトにセッション スコープを与えると、Web アプリケーションのパフォーマンスが影響を受ける可能性があります。
コンポーネントのスレッド モデルは、Web サイトのパフォーマンスに影響を与えることがあります。通常、オブジェクトを Session 状態および Application 状態に格納する場合は、.asp ファイルでは Both としてマークされたオブジェクトを使用することをお勧めします。シングルスレッド、アパートメント、およびフリースレッドのオブジェクトの使用はお勧めできません。
使用するオブジェクトのスレッド モデルを常に管理できるとは限らないので、最適なパフォーマンスを得るために、次のガイドラインに従ってください。