ASP 講義 3: アプリケーション オブジェクトとセッション オブジェクト
著者:Eve Cole
更新時間:2009-05-30 19:58:17
前回の講義では、Request オブジェクトの Form データ コレクション、QueryString データ コレクション、ServerVariables データ コレクションについて学びました。次の学習を続ける前に、まずリラックスすることをお勧めします。次に紹介する Application オブジェクトは比較的抽象的であり、最初に理解したときは物事を区別できない可能性があるためです。覚えておいてください: 見つからないときは、Application オブジェクトが何であるかについてあまり考えないでください。古いことわざにあるように、まず使い方を学びましょう。
1. Application オブジェクトを理解します。頭をリフレッシュするために、カウンター ルーチンを見てみましょう (理解するには実行する必要があります)。
まず wuf16.htm ファイルを編集します。
<html>
<本文>
ページのクリック数を記録する例: <a href="wuf17.asp">wuf17.asp</a>
</body>
</html>
wuf17.asp のコードは次のとおりです。
<% @LANGUAGE = VBScript %>
<% 'wuf17.asp - 特定のページへの訪問数を記録します (反則)
明示的なオプション
ディムカウントウェブ
CountWeb = Request.ServerVariables("SCRIPT_NAME")
'これにより、混乱を避けるために各ページに一意の変数が確実に存在します。
%>
<HTML><本文>
<%
Response.Write CountWeb & "<Br><Br>" & vbcrlf
Application.Lock '説明をお読みください
Application(CountWeb) = Application(CountWeb) + 1 'アキュムレーター、クリック数に 1 を追加します
アプリケーション.ロック解除
Response.Write "WEB サーバーがシャットダウンして再起動されるまでのこのページの合計クリック数: " & Application(CountWeb)
%>
</BODY></HTML>
このプログラムを実行する場合、ほとんどの人にとって、Web サーバーとクライアントの両方となるマシンは 1 台だけです。そうすると、次のような状況が想像されるだけです。あなたの 2 つのホームページ ファイルが遠く離れた Web サーバーに置かれ、国内外の大量のユーザーがブラウザを介してこれらのファイルにアクセスしています。各ユーザーがクリックすると、Application(CountWeb) の値が 1 ずつ増加し、wuf17.asp ファイルを保存しているサーバーが閉じられない限り、Application(CountWeb) は蓄積され続けます。ただし、サーバーをシャットダウンしてから再起動すると、アプリケーション (CountWeb) は再び 0 からカウントを開始することに注意してください (私は混乱しています。ページの訪問数が常に 1 桁である理由を言いました)。このような常にゼロからカウントが開始される状況を回避するには、サーバーがシャットダウンされる前にアプリケーション (CountWeb) の値を保存し、次回必要なときにそれを取り出して、順次蓄積できるようにする必要があります。これを行うには、N 回後に Decompose を聞いてください。
次の質問は、Application.Lock と UnLock が何を意味するかということです。多数のユーザーがページにアクセスし、ユーザーがクリックするたびにアプリケーション (CountWeb) が 1 ずつ増加すると仮定しました。考えてみてください。これは非常に面倒なことではありませんか (何! できないのですか?)考えてもみませんが、それはあなたでなければなりません (ホームページをスポンサーしているのはあなただけです)。したがって、先着順のルールがあるはずです。ユーザーがページにアクセスし、Application (CountWeb) の値を変更する必要がある場合は、Lock メソッドを使用してページをロックし、他のユーザーが変更できないようにします。変更が完了したら、ロックを解除します。
上記の例から、Application オブジェクトが共有情報 (Application(CountWeb)) をすべてのユーザーに提供し、すべてのユーザーを対象としていることがわかりました (各ユーザーのアクセスによりカウンタが 1 ずつ増加します)。 Application オブジェクトには、Application_OnStart イベントと Application_OnEnd イベントという 2 つのイベントもあります (混同しないでください。これはオブジェクト指向プログラミング言語の単なる開始概念です)。使用時の構文は次のとおりです。
<SCRIPT LANGUAGE=VBScript RUNAT=サーバー>
サブアプリケーション_オンエンド
'WEBサーバーを閉じるとApplication_OnEndイベントが活性化されます
'つまり、プログラムはここに配置されたコードを実行します
' したがって、サーバーがシャットダウンされる前に、ここで wuf17.asp の Application (CountWeb) の値を変更できます。
' テキスト ファイルなどに保存します。
エンドサブ
サブアプリケーション_OnStart
'最初のユーザーが ASP Web ページを閲覧すると、Application_OnStart イベントがアクティブになりますが、その後他のユーザーが閲覧すると、このイベントは発生しません。
'つまり、プログラムはここに配置されたコードを実行します
'つまり、テキスト ファイルに保存された Application(CountWeb) の値をここで読み取ることができます。
エンドサブ
</スクリプト>
以下は、イベントの使用方法を示す例です。このプログラムの機能は、サイトのすべてのページのクリック数の合計をカウントすることです。
ファイル wuf18.asp のコード (サイト内の他のページ ファイルもこのファイルに似ています):
<% @LANGUAGE = VBScript %>
<% 明示的なオプション
'サイト内のすべてのページ ファイルには、次の文を含める必要があります<!--#include file="wuf19.asp"-->%>
<!--#include file="wuf19.asp"-->
<HTML><本文>
サーバーがシャットダウンして再起動されるまでの、サイトのすべてのページの合計ヒット数: <%= Application("CountAll") %>
</BODY></HTML>
ファイル wuf19.asp のコード:
<% ' wuf19.asp
アプリケーション.ロック
アプリケーション("すべてカウント") = アプリケーション("すべてカウント") + 1
アプリケーション.ロック解除
%>
ファイル wuf18.asp と wuf19.asp は同じディレクトリに配置されます。ファイル global.asa のコード:
注: イベント ハンドラーは、「global.asa」という名前のテキスト ファイルとして保存し、仮想パスのルート ディレクトリ (通常は、index.htm またはdefault.htm ファイルと同じディレクトリ) に配置する必要があります。次に例を示します。私のマシンを例に挙げると、絶対パスでは、global.asa は c:InetPubhome に配置され、wuf18.asp と wuf19.asp は同じ仮想パスに配置されます。パスのみ global.asa ファイルの存在が許可されます。
<SCRIPT LANGUAGE=VBScript RUNAT=サーバー>
'global.asa - wuf18.asp ダウンロード パッケージ内のファイル名は 18global.asa ですが、使用する場合は名前を変更する必要があります。
サブアプリケーション_OnStart
'最初のユーザーが Web ページを閲覧するとき、カウンターの初期値を 0 に設定します。
'今後他のユーザーが閲覧する際、以下のコードは実行されなくなります。
アプリケーション.ロック
アプリケーション("すべてカウント") = 0
アプリケーション.ロック解除
エンドサブ
</スクリプト>
wuf18.asp を参照して、実行結果を表示します。 Application オブジェクトの使い方を覚えるだけなら難しくないようです。
2. Session オブジェクトを理解します。前の Application オブジェクトを前兆として使用すると、Session オブジェクトははるかに簡単になります。これは、単一のユーザーに関連する情報を記録するためにのみ使用されることを除いて、Application オブジェクトに似ています。そのため、Session オブジェクトを使用して単一のユーザーに関する情報を保存できます。
Application オブジェクトと同様、Session オブジェクトにも、Session_OnStart イベントと Session_OnEnd イベントという 2 つのイベントがあります。使用構文は Application オブジェクトと似ています。
Session オブジェクトを使用する前に、ブラウザの Cookie 機能が有効になっていることを確認する必要があることに注意してください (デフォルト設定で問題ありません)。
以下に例を示します。ファイル global.asa の要件は上記と同じであるため、上記の例の global.asa はこの例の global.asa によって上書きされます。
<SCRIPT LANGUAGE=VBScript RUNAT=サーバー>
' global.asa - wuf20.asp ダウンロード パッケージのファイル名は 20global.asa です
SubSession_OnStart
Session("In") = Now '関数 Now は現在時刻を取得します
エンドサブ
サブセッション_オンエンド
Session("Out") = 現在
アプリケーション.ロック
アプリケーション("アウト") = セッション("アウト")
アプリケーション(「受信」) = セッション(「受信」)
アプリケーション(「アウト」).UnLock
エンドサブ
</スクリプト>
ファイル wuf20.asp:
<%@ 言語=VBScript %>
<HTML>
<本体>
<% 'wuf20.asp
Response.Write "デフォルトのタイムアウト設定:" & Session.Timeout & "分<Br>"
セッションタイムアウト = 1
Response.Write "このサイトに入った時刻:" & Session("In") & "<Br>"
Response.Write "1 分以内にこのページを更新してください" & "<Br><Br>"
Not IsEmpty(Application("Out")) の場合
Response.Write "最後にこのサイトに入ったとき:" & Application("In") & "<Br>"
Response.Write "最後にこのサイトを離れたとき:" & Application("Out") & "<Br>"
Response.Write "閲覧時間 (分):" &_
Datediff("n",Application("In"),Application("Out")) & "<Br><Br>"
終了の場合
if IsEmpty(Session("Out")) then
Response.Write "リフレッシュ前とリフレッシュ後の Session(""Out"") の値は空です" & "<Br>"
終了の場合
%>
</BODY>
</HTML>
ユーザーが初めて Web ページを閲覧すると、プログラムはユーザーが Web ページにアクセスした時刻を記録します。ただし、この時点では Session_OnEnd イベントは発生しないため、アプリケーション (「アウト」) になります。値が空の場合、プログラムは閲覧時間を表示しません。
Application オブジェクトの存続期間は、最初のユーザーが Web ページを閲覧してからサーバーがシャットダウンされるまでであることがわかっています。 Session オブジェクトの有効期間は、ユーザーが初めて Web ページを閲覧したとき (セッションの開始時) からセッションの終了時までです。それで、セッションはいつ終了しますか?具体的には、この例では、Session.Timeout = 1 によってセッション タイムアウトが 1 分に設定されます。つまり、Web サーバーに 1 分間リクエストが提供されないと、セッションがタイムアウトしてセッションが終了し、Session_OnEnd イベントが発生します。そしてプログラムはSession_OnEndのコードを実行します。ここでは、セッションが終了すると、Session オブジェクトが存在しなくなるため、開始時刻と終了時刻をそれぞれ Application("In") と Application("Out") に入力します。コードの最後でこれを確認しました。
このルーチンから、次のことがわかります。
1.アプリケーション オブジェクトとセッション オブジェクトの有効期間は異なります。
2. Session オブジェクトは単一ユーザー用であり、その値はクライアントに保存されます。他のユーザーによる参照は、単一ユーザーの Session オブジェクトには影響しません。 1 人のユーザーは、自分の Session オブジェクトの値の読み取りと書き込みのみが可能です (例: Session("In"))。
3. Response.Write: (""Out"") の二重引用符の表現に注意してください。
4. 特別な注意事項: このプログラムには実用性はなく、デバッグのみに使用されます (1 人のユーザーのみが閲覧するのにのみ適しています)。なぜそうなるのか考えてください。答えはこの記事の最後にあります。
ヒント: Application オブジェクトの特性に注意してください。
3. 典型的な例: Web ページにオンラインの人数を表示する方法 次の例では、アプリケーション (「オンライン」) はオンラインの人数を保存するために使用され、アプリケーション (「CountAll」) はオンラインの人数を保存するために使用されます。訪問者の合計数を保存します。
原則: 新しいユーザーが Web ページを閲覧すると、Session_OnStart イベントが発生し、オンライン ユーザーの数が 1 増加し、訪問ユーザーの数も 1 増加します。ユーザーが退席すると、セッションがタイムアウトした後に Session_OnEnd イベントが発生し、オンラインの人数が 1 人減ります。
Global.asa コードは次のとおりです。
<SCRIPT LANGUAGE=VBScript RUNAT=サーバー>
'グローバル.asa-wuf21.asp
サブアプリケーション_OnStart
アプリケーション.ロック
'ここでApplication("CountAll")の初期値を読み取ります
アプリケーション.ロック解除
エンドサブ
SubSession_OnStart
アプリケーション.ロック
アプリケーション("オンライン") = アプリケーション("オンライン") + 1
アプリケーション("すべてカウント") = アプリケーション("すべてカウント") + 1
アプリケーション.ロック解除
エンドサブ
サブセッション_オンエンド
アプリケーション.ロック
アプリケーション("オンライン") = アプリケーション("オンライン") - 1
アプリケーション.ロック解除
エンドサブ
サブアプリケーション_オンエンド
アプリケーション.ロック
'Application("CountAll") はここのファイルに保存する必要があります
アプリケーション.ロック解除
エンドサブ
</スクリプト>
Wuf21.asp コードは次のとおりです。
<%@ 言語=VBScript %>
<HTML>
<本体>
<%セッション.タイムアウト = 5%>
<P>オンラインの人数: <%= Application("Online")%></P>
<P>訪問者の合計数: <%= Application("CountAll")%></P>
</BODY>
</HTML>
このルーチンは wuf17.asp と比較され、後者はクリック数をカウントし、前者は訪問者数をカウントすることに注意してください。
回答: Application オブジェクトはすべてのユーザーに適用されるため、マルチユーザーの場合、他のユーザーの閲覧によって Application (「In」) と Application (「Out」) の値も変更されます。