ASP を使用して仮想コミュニティ、オンライン ショッピング、その他のプログラムを作成する場合、Application オブジェクトと Session オブジェクトは決定的な役割を果たし、柔軟かつ合理的に使用できます。
このオブジェクトはプログラムの品質を向上させる鍵となります。この分野での私の経験に基づいて、ASP のこれら 2 つの組み込みオブジェクトについて詳しく説明します。
1. Application オブジェクトのメンバーの概要
アプリケーション オブジェクトのメンバーには、アプリケーション オブジェクトのコレクション、メソッド、イベントが含まれます。
⒈Application オブジェクトのコレクション
コンテンツ コレクション: <OBJECT> 要素を使用して定義されていない、Applicaiton オブジェクトに格納されているすべての変数のコレクション。
StaticObjects: <OBJECT> 要素を使用して定義された Application オブジェクトに格納されているすべての変数のコレクション
例:default.asp に次の割り当てがあります
アプリケーション(a)=a
アプリケーション(b)=128
アプリケーション(c)=false
それからコンテンツコレクションです
application.contents(1)=a 'は application.contents(a)=a と書くこともできます
application.contents(2)=128 ' application.contents(b)=128 と書くこともできます
application.contents(3)=false ' application.contents(c)=false としても記述できます
著者はここで、呼び出すときに application.contents(a) などのメソッドを使用することを推奨しています。これは、シリアル番号で表した方が直感的であるためです。
割り当ての順序を考慮してください。
⒉Applicationオブジェクトのメソッド
Contents.Remove(変数名): Application.Contents コレクションから指定された変数を削除します。
Contents.RemoveAll(): Application.Contents コレクション内のすべての変数を削除します。
Lock(): 現在の ASP ページのみがコンテンツにアクセスできるように、Application オブジェクトをロックします。
Unlock(): Application オブジェクトのロックを解除します。
例:default.asp の場合:
アプリケーション(a)=a
アプリケーション(b)=128
アプリケーション(c)=false
応答.書き込みアプリケーション.コンテンツ(1)&<br>
応答.書き込みアプリケーション.コンテンツ(2)&<br>
応答.書き込みアプリケーション.コンテンツ(3)&<br>
削除後のresponse.write b:
アプリケーション.コンテンツ.削除(b)
応答.書き込みアプリケーション.コンテンツ(1)&<br>
応答.書き込みアプリケーション.コンテンツ(2)&<br>
実行結果:
ある
128
間違い
bを削除した後:
ある
間違い
コレクション内のすべての変数を削除したい場合は、application.contents.removeall を使用してください。Lock メソッドと Unlock メソッドは実際によく使用されます。
読者も慣れているので負担にはなりません。
⒊アプリケーションオブジェクトイベント
OnStart: サーバーにアクセスする最初のユーザーが初めてページにアクセスしたときに発生します。
OnEnd: 最後のユーザーのセッションが終了し、セッションの OnEnd イベントのすべてのコードが実行されたとき、または最後のユーザーがアクセスしたときに発生します。
サーバーは、誰もサーバーにアクセスしない一定時間 (通常は 20 分) が経過すると発生します。
アプリケーション オブジェクトの OnStart イベントと OnEnd イベントで何を行うかを定義したい場合は、Global.asa ファイルにコードを記述する必要があります (以下の例)。
そして、ファイルをサイトのルート ディレクトリ (通常は Inetpubwwwroot) に置きます。
2. Session オブジェクトのメンバーの概要
Session オブジェクトのメンバーには、Application オブジェクトよりも 1 つ多い属性 (コレクション、プロパティ、メソッド、イベント) があります。
⒈Sessionオブジェクトのコレクション
内容: <OBJECT> 要素を使用して定義されていない、特定のセッション オブジェクトに格納されているすべての変数のコレクション。
StaticObject: <OBJECT> 要素を使用して定義され、Session オブジェクトに保存されるすべての変数のコレクション。
例:default.asp に次の割り当てがあります
セッション(a)=a
セッション(b)=128
セッション(c)=false
それからコンテンツコレクションです
session.contents(1)=a ' session.contents(a)=a と書くこともできます
session.contents(2)=128 ' session.contents(b)=128 と書くこともできます
session.contents(3)=false ' session.contents(c)=false としても記述できます
⒉Sessionオブジェクトのプロパティ
コードページ: 読み取り/書き込み可能。整数型。ブラウザーでページのコンテンツを表示するために使用されるコード ページを定義します。コード ページは、さまざまな言語で使用される数値の文字セットです。
異なるコードページ。たとえば、ANSI コード ページは 1252、日本語コード ページは 932、簡体字中国語コード ページは 936 です。
LCID: 読み取り/書き込み可能。整数型。ブラウザに送信されるページのロケール識別子を定義します。 LCID は、地域を一意に識別する国際標準の略語です。
2057 では、現在の地域の通貨記号が £ として定義されます。
セッションID: 読み取り専用。ロングタイプ。このセッションのセッション識別子を返します。セッションが作成されるたびに、サーバーによって識別子が自動的に割り当てられます。それに基づいてできる
この値により、2 人のユーザーのうちどちらが最初にサーバーにアクセスするかが決まります。
タイムアウト: 読み取り/書き込み可能。整数型。セッションのタイムアウト制限を分単位で定義します。ユーザーがこの時間内に更新またはリクエストを行わなかった場合
Web ページにアクセスすると、ユーザーが生成したセッションは自動的に終了します。デフォルト値は 20 です。
上記の属性は実際のアプリケーションではほとんど役に立たないため、基本的には変更する必要はありません。
⒊Sessionオブジェクトのメソッド
Contents.Remove(変数名): 指定された変数を Session.contents コレクションから削除します
Contents.Removeall(): Session.contents コレクション内のすべての変数を削除します
Abandon(): 現在のユーザー セッションを終了し、現在の Session オブジェクトを破棄します。
SessionオブジェクトのContents.Remove(変数名)メソッドとContents.Removeall()メソッドは、基本的にApplicationオブジェクトのメソッドと同じです。
理解を助けるために、上記の例を参照して、「アプリケーション」を「セッション」に変更します。ここで説明したいのは、Contents.Removeall() と Abandon() についてです。
違いは、これら 2 つのメソッドを実行すると、現在の
ユーザー セッションのすべてのセッション変数。 違いは、Contents.Removeall() が現在のセッションを終了せずに、単にセッション変数の値を解放することです。
Session 変数を解放することに加えて、Abandon() はセッションを終了し、Session_OnEnd イベントをトリガーします。この 2 つの違いに注目してください。
⒋Sessionオブジェクトのイベント
OnStart: ASP ユーザー セッションが生成されるときにトリガーされ、ユーザーがこのサーバーにページを要求すると、このイベントが生成されます。
OnEnd: ASP ユーザー セッションが終了したときにトリガーされます。このイベントは、Abandon() メソッドまたはタイムアウトが使用されたときにもトリガーされます。
これら 2 つのイベントは、Application の OnStart イベントおよび OnEnd イベントと同じであり、Global.asa ファイルに配置する必要があります。
これら 4 つのイベントの使用方法を一緒に勉強していきましょう。
3.グローバル.asa
ASP の Application オブジェクトと Session オブジェクトは、他の ASP 組み込みオブジェクトにはない機能、つまりイベントを具体化しています。訪問者がサーバーにアクセスするたびに、
OnStart イベント (最初の訪問者はアプリケーションとセッションの OnStart イベントを同時にトリガーしますが、アプリケーションはセッションに先行します)、各訪問者
OnEnd イベントは、各セッションが終了するとトリガーされます (アプリケーションとセッションの両方の OnEnd イベントは、最後のゲスト セッションが終了するとトリガーされますが、
セッションはアプリケーションに先行します)。
OnStart と OnEnd の 2 つのイベントは、通常、オンラインの人数を数えたり、ユーザーのオンラインおよびオフラインのステータスを変更したりするために、仮想コミュニティで使用されます。この 2 つを具体的に定義すると、
ファイルを使用するには、Global.asa ファイルにコードを記述し、そのファイルをサイトのルート ディレクトリ (デフォルトは Inetpubwwwroot) に配置する必要があります。加えて、
Application オブジェクトと Session オブジェクトは、他の ASP 組み込みオブジェクト (Response、Request、
サーバー、セッション...) は使用できません。以下は、これら 2 つのイベントの使用方法を説明するために、仮想コミュニティでオンラインの人数をカウントする例です。
ファイルの説明:
global.asa は d:Inetpubwwwroot ディレクトリにあります
default.asp は、仮想コミュニティのログイン ページである d:Inetpubwwwroot ディレクトリにあります。
login.asp は d:Inetpubwwwroot ディレクトリにあり、ユーザーが入力したユーザー名とパスワードを検出するために使用されます。
Index.asp は、仮想コミュニティのホームページである d:Inetpubwwwroot ディレクトリにあります。
bbs.mdb は d:Inetpubwwwroot ディレクトリにあり、ユーザー情報を保存するデータベースです。
データベース (ACCESS) の構造:
===bbsテーブル===
id ユーザー ID、長整数
名前 ユーザー名、テキスト タイプ
コードパスワード、テキストタイプ
オンライン オンライン ステータス、はい/いいえ
===global.asa===
<script LANGUAGE=VBScript RUNAT=サーバー>
サブアプリケーション_OnStart
アプリケーション(オンライン)=0
エンドサブ
サブアプリケーション_オンエンド
2番目のサブ
SubSession_OnStart
エンドサブ
サブセッション_オンエンド
if session.contents(pass) then 'ログインしているユーザーの Session_OnEnd であるかどうかを判断します
アプリケーションロック
アプリケーション(オンライン)=アプリケーション(オンライン)-1
アプリケーションのロック解除
終了する場合
エンドサブ
</スクリプト>
==============
===ログイン.asp===
...'パスワードの検証。データベースに接続し、ユーザーが入力したユーザー名とパスワードが正しいかどうかを確認します。
パスワードの検証に合格した場合
セッション(名前)=rs(名前)
セッション(id)=rs(id)
セッション(パス)=true
それ以外
rs.close
接続閉じる
応答.書き込みパスワードが間違っています!
応答.終了
終了する場合
アプリケーションロック
アプリケーション(オンライン)=アプリケーション(オンライン)+1
conn.Execute (update bbs set online=1 where id=&session(id))'ユーザーのステータスをオンラインに設定します
アプリケーションのロック解除
rs.close
接続閉じる
response.redirect Index.asp 'データの初期化後、コミュニティのホームページにジャンプします
===========
この例では、アプリケーション (オンライン) 変数を使用して、コミュニティにログインしているオンラインのユーザーの数を記録します。これは、ユーザーがサーバーにアクセスすると、ユーザーがサーバーにアクセスしているかどうかは関係ないためです。
ログインするとOnStartイベントが発生するため、OnStartイベントでは申請(オンライン)を1つ増やすことはできません。ログインユーザーのセッションであるかどうかに関係なく、
OnEnd イベントは終了時に生成されます (訪問者がサーバーにアクセスしたがコミュニティにログインしなかった場合、セッション終了後にも OnEnd イベントが生成されます)。
Session_OnEnd イベントで if ステートメントが使用され、ログイン ユーザーの OnEnd イベントであるかどうかが判断されます。そうであれば、オンラインの人数が 1 人減ります。
これは、オンラインの人数を数える簡単な例にすぎません。この場合、オンラインの人数を数えるだけでは十分ではありません。
データベースには、ユーザーのオンライン ステータスを記録するために使用されるオンライン フィールドがあります。ユーザーがログインすると、login.asp でオンラインが 1 に設定されますが、ユーザーがオフラインの場合は表示されません。
Online は 0 に設定されています。これを改善するには、Session_OnEnd イベントを変更し、このイベントで online を 0 に設定する必要があります。
===笑。さーす===
<script LANGUAGE=VBScript RUNAT=サーバー>
サブアプリケーション_OnStart
アプリケーション(オンライン)=0
set application(conn)=Server.CreateObject(ADODB.Connection)
application(db)=Server.MapPath( bs.mdb) '以下で詳しく説明するように、ここでは絶対パス bs.mdb を使用するのが最善です。
エンドサブ
サブアプリケーション_オンエンド
アプリケーション(conn)=何も設定しない
エンドサブ
SubSession_OnStart
エンドサブ
サブセッション_オンエンド
if session.contents(pass) then 'ログインしているユーザーの Session_OnEnd であるかどうかを判断します
application(con).open =driver={Microsoft Access Driver (*.mdb)};dbq=&application(db)
アプリケーションロック
アプリケーション(オンライン)=アプリケーション(オンライン)-1
application(con).Execute (id=&session.contents(id) の online=0 に設定された友人を更新)
アプリケーションのロック解除
アプリケーション(con).close
終了する場合
エンドサブ
</スクリプト>
==============
この時点で、完全なコードが完成しました。 Server オブジェクトは Application および Session の OnEnd イベントでは使用できないため、データベースの
サーバー上の接続とデータベースの物理アドレス (d:inetpubwwwroot bs.mdb) はアプリケーション変数に保存され、
Application_OnStart イベントで前処理されます。同様に、Session_OnEnd イベントでは session.contents の代わりに session(pass) を使用することはできません。
(パス) (詳細は以下に説明します)。
4. 今回の事例で注目すべき2つのポイント
⒈OnEnd イベントのsession.contents
global.asa に連絡し始めたばかりの友人は、上記の Session_OnEnd イベントをよく参照します。
session.contents(pass) の場合は次のように記述されます
セッション(パス)の場合、
この場合、システムはエラーを表示しませんが、それ以降のコンテンツは決して実行されません。これは、OnEnd イベントでの Session オブジェクトの使用が禁止されているためです。
ただし、セッション変数は、Session オブジェクトのコレクションを使用して呼び出すことができます。 IIS ではエラー メッセージが表示されなかったため、作成者はかつてこれに多くの時間を無駄にしていました。
間。誰もがこれから学ぶことができることを願っています!
⒉Application_OnStart イベントでデータベースの物理アドレスを取得するために Server.MapPath を使用する場合、この問題を説明するには、絶対アドレスを使用する必要があります。
実験してみましょう: 上記の Application_OnStart イベントを変更します。
application(db)=Server.MapPath( bs.mdb) は次のように変更されます。
アプリケーション(db)=サーバー.マップパス(bbs.mdb)
次に、d:inetpubwwwroot ディレクトリに test サブディレクトリを作成し、test ディレクトリに temp.asp を書き込みます。
====test.asp====
<%response.write application(db)%>
================
次に、temp.asp をコピーし、ルート ディレクトリ (d:inetpubwwwroot) に配置します。メモ帳で global.asa を開き、次に 2 つのブラウザ (ブラウザ A) を開きます。
アドレス http://localhost/temp.asp を入力して Enter キーを押すと、ブラウザに次の出力が表示されます。
d:inetpubwwwroot bs.mdb
次に、メモ帳ウィンドウの [ファイル] メニューをクリックし、[保存] を選択して (global.asa の変更時刻を変更し、それによって IIS がすべてのサービスを再起動します)、[保存] をクリックします。
ブラウザ B にアドレス http://localhost/test/temp.asp を入力し、Enter キーを押します。ブラウザ上の出力は次のとおりです。
d:inetpubwwwrootestbs.mdb
global.asa ファイルはサイトのルート ディレクトリに配置されますが、server.mappath で相対アドレスが使用されている場合、Application_OnStart がトリガーされます。
イベントユーザーが初めて訪問したページがルートディレクトリに属していない場合、データベースの物理アドレスの取得は期待どおりの結果にはなりませんので、特にご注意ください。