Application.cfc ファイルでは、アプリケーション全体に適用する設定と変数、およびアプリケーションイベントハンドラーを定義します。
- アプリケーション全体に適用する設定および変数としては、ページ処理の設定、デフォルト変数、データソース、スタイル設定、その他のアプリケーションレベルの定数などがあります。
- アプリケーションイベントハンドラーは CFC メソッドの一種で、アプリケーションの有効期間中に特定のイベントが発生すると ColdFusion によって自動的に実行されます。該当するイベントは、アプリケーション起動、アプリケーション終了、セッション開始、セッション終了、リクエスト開始、リクエスト実行、リクエスト終了、および例外です。
アプリケーションレベルの設定および変数の定義
アプリケーションを作成する際には、アプリケーション全体に適用するプロパティや特性を多数設定できます。これには次のような項目が含まれます。
- アプリケーション名
- アプリケーションプロパティ (Client 変数、Application 変数、Session 変数の管理オプションを含む)
- ページ処理オプション
- デフォルト変数、データソース、スタイル設定、および他のアプリケーションレベルの定数
デフォルト変数の設定については、このページの「onApplicationStart におけるアプリケーションのデフォルト変数と定数の設定」を参照してください。
アプリケーションのネーミング
アプリケーションを定義し、アプリケーション名を付けるには、Application.cfc の初期化セクションで、メソッド定義よりも前に This.name 変数を設定します。同じアプリケーション名を使用すれば、複数のページを同じ論理アプリケーションの構成要素として定義できます。
ColdFusion では、名前を持たないアプリケーションがサポートされています。これは、JSP タグおよびサーブレットと相互運用する必要がある ColdFusion アプリケーションにおいて便利です。名前を持たないアプリケーションの作成を検討するのは、ColdFusion ページで Application スコープまたは Session スコープのデータを既存の JSP ページやサーブレットと共有する必要がある場合のみとしてください。名前のないアプリケーションを 1 つのサーバーインスタンス上に複数作成することはできません。名前を持たないアプリケーションの使用については、JSP ページおよびサーブレットの相互運用の ColdFusion ページと JSP ページまたはサーブレットとのデータの共有 を参照してください。
アプリケーションプロパティの設定
アプリケーションプロパティは、Application.cfc の初期化コードで This スコープの変数を設定することによって指定します。これは、cfapplication タグで設定できるのと同じプロパティです。次の表に、アプリケーションプロパティの設定に使用する This スコープ変数とその使用方法を示します。
変数 |
デフォルト |
説明 |
---|---|---|
applicationTimeout |
Administrator の値 |
アプリケーション (すべての Application スコープ変数も含む) の有効期間を示す実数値 (日数)。この変数を生成するには createTimeSpan 関数を使用します。 |
clientManagement |
False |
アプリケーションで Client スコープ変数をサポートするかどうかを示します。 |
clientStorage |
Administrator の値 |
Client 変数を格納する場所を示します。Cookie、レジストリ、またはデータソース名を指定できます。 |
loginStorage |
Cookie |
ログイン情報を Cookie スコープと Session スコープのいずれに格納するかを示します。 |
scriptProtect |
Administrator の値 |
変数をクロスサイトスクリプティング攻撃から保護するかどうかを示します。 |
sessionManagement |
False |
アプリケーションで Session スコープ変数をサポートするかどうかを示します。 |
sessionTimeout |
Administrator の値 |
ユーザーセッション (すべての Session 変数も含む) の有効期間を示す実数値 (日数)。この変数を生成するには createTimeSpan 関数を使用します。 |
setClientCookies |
True |
クライアントブラウザに CFID Cookie および CFTOKEN Cookie を送信するかどうかを示します。 |
setDomainCookies |
False |
クライアント識別用の CFID および CFTOKEN の値と、Cookie を使用して格納される Client スコープの変数について、ドメイン Cookie を使用するかどうかを示します。False の場合はホスト固有の Cookie が使用されます。クラスターで実行されるアプリケーションの場合は True に設定します。 |
次の例は Application.cfc の冒頭部分のコードで、アプリケーション名とプロパティを設定しています。
<cfcomponent> |
これらの設定について詳しくは、『CFML リファレンス』の cfapplication を参照してください。
ページ処理オプションの設定
cfsetting タグを使用すれば、アプリケーションの全ページに適用する次のページ処理属性を指定できます。
属性 |
用途 |
---|---|
showDebugOutput |
デバッグ出力を表示するかどうかを指定します。ColdFusion Administrator でデバッグが無効になっている場合、この設定でデバッグを有効にすることはできません。Administrator でデバッグ出力が有効になっている場合に、デバッグ出力を表示するか非表示にするかをこの設定で指定します。 |
requestTimeout |
ページリクエストのタイムアウトを指定します。タイムアウトまでに ColdFusion でページの処理が完了できなかった場合は、エラーが生成されます。この設定は、ColdFusion Administrator での設定よりも優先されます。外部の LDAP サーバーや Web サービスプロバイダなど、特に低速の外部リソースにアプリケーションやページでアクセスすることが多い場合は、この設定を使用してページのタイムアウト時間を増やします。 |
enableCFOutputOnly |
cfoutput タグに含まれていないテキストを出力しないようにします。ColdFusion ページに含まれている不要なテキストを非表示にしたい場合に、この設定が役立ちます。 |
cfsetting は個別のページで使用されることが多いタグですが、Application.cfc ファイルでも使用できます。たとえば、マルチアプリケーション環境で使用して、ColdFusion Administrator の設定をアプリケーションごとに上書きできます。
コンポーネントの初期化コードでも、アプリケーション全体に適用する cfsetting タグを記述できます。その場合は通常、次の例のように This スコープのアプリケーションプロパティ設定に続いて記述します。
<cfcomponent> |
この例に含まれる cfsetting タグは、アプリケーション内のすべてのページに影響します。アプリケーション全体の設定は、イベントメソッド(onRequestStart など)の中や個別の ColdFusion ページで上書きできます。
アプリケーションイベントハンドラーの使用
次の表では、実装可能なアプリケーションイベント CFC メソッドと、それらがトリガされるタイミングについて説明します。
メソッド |
実行のタイミング |
---|---|
アプリケーションが最初に起動するときに発生します。つまり、任意のページに対する最初のリクエストが処理されるときか、CFC メソッドがイベントゲートウェイインスタンス、Flash Remoting リクエスト、または Web サービス呼び出しによって最初に呼び出されるときに発生します。このメソッドは、データソース名など、アプリケーション全体で使用する(Application スコープの)変数を設定するのに便利です。 |
|
アプリケーションが終了するときに発生します。つまり、アプリケーションがタイムアウトするか、サーバーがシャットダウンすると発生します。 |
|
既存のセッション (ColdFusion イベントゲートウェイセッションを含む) に属さないリクエストの結果として、新しいセッションが作成されると発生します。このイベントが発生するには、アプリケーションでセッションが有効になっている必要があります。 |
|
セッションのタイムアウト期間が経過すると発生します。このイベントは、アプリケーションのタイムアウトやサーバーのシャットダウンでは発生しません。 |
|
ColdFusion でリクエスト(ブラウザーなどからの HTTP リクエスト、イベントゲートウェイへのメッセージ、SOAP リクエスト、Flash Remoting リクエスト)が受信されると発生します。 |
|
onRequestStart イベントが完了すると発生します。このメソッドは、リクエストされたページコンテンツに対するフィルターの役割を果たします。 |
|
リクエストに関するすべてのページや CFC の処理が完了すると発生します。OnRequestEnd.cfm ページと同等です。 |
|
ColdFusion で、存在しないページに対する要求が受信されると発生します。 |
|
例外が try/catch ブロックで処理されなかった場合に発生します。 |
ColdFusion でリクエストが受信されると、Application CFC がインスタンス化され、Application.cfc のコードが次の順序で実行されます。
- ファイル冒頭の CFC 初期化コード
- onApplicationStart(そのアプリケーションでまだ実行されていない場合)
- onSessionStart(そのセッションでまだ実行されていない場合)
- onRequestStart
- onRequest か、onRequest メソッドがない場合はリクエストされたページ
- onRequestEnd
次のメソッドは特定のイベントによってトリガーされます。
- onApplicationEnd
- onSessionEnd
- onMissingTemplate
- onError
onApplicationEnd メソッドと onSessionEnd メソッドは、ページリクエストのコンテキストでは実行されないので、リクエスト変数にアクセスすることや、ユーザーに対して情報を表示することはできません。onMissingTemplate メソッドは、存在しない CFML ページが URL で指定されるとトリガーされます。OnError メソッドは、リクエストのコンテキストで実行されるとは限りません。コンテキストは Event 引数を使用して判別します。
Application.cfc によるアプリケーションの管理
アプリケーションの設定と管理には、onApplicationStart メソッドと onApplicationEnd メソッドを使用します。複数のページやリクエストで使用され、アプリケーション内のすべてのコードから一貫して利用可能であることが必要なリソースは、これらのメソッドで制御します。そのようなリソースとしては、データソース、アプリケーションカウンター(ページヒット変数など)、すべてのページに適用するスタイル情報などがあります。
onApplicationStart メソッドは、サーバーの起動後に、アプリケーションの任意のページに対する最初のリクエストが ColdFusion で受信されると実行されます。onApplicationEnd メソッドは、アプリケーションサーバーがシャットダウンするか、アクセスがないままアプリケーションのタイムアウト期間が経過すると実行されます。
次に、これらのメソッドを使用するいくつかの方法について説明します。詳しくは、『CFML リファレンス』の onApplicationStart および onApplicationEnd を参照してください。
アプリケーションユーティリティ関数の定義
Application.cfc で定義した関数のうち共有スコープに属していないものは、デフォルトではその CFC 内の他のメソッドからのみ使用可能です。
Application.cfc で onRequest メソッドを実装している場合、Application.cfc とターゲットページでは同じ Variables スコープが共有されるので、Application.cfc で定義したすべてのユーティリティ関数は、ターゲットページでも直接使用できます。
Application.cfc 内のメソッドだけでなく複数のページでユーティリティ関数を使用する必要があり、onRequest メソッドを使用しない場合は、別の CFC でその関数を定義し、その CFC を実行してアクセスすることをお勧めします。他の ColdFusion ページと同様に、Application.cfc でも、ColdFusion Administrator の [マッピング] ページで設定したディレクトリパス内のすべての CFC にアクセスできます。したがって、この方法を使用してユーティリティ関数を複数のアプリケーションで共有します。
リクエストページで使用するユーティリティ関数を Application.cfc で定義し、onRequest メソッドを使用しない場合は、次に示すようなコードを使用して、それらの関数を何らかの ColdFusion スコープ((Request スコープなど)に明示的に配置します。
<cffunction name="theFunctionName" returntype="theReturnType"> |
リクエストページには、次のようなコードを記述します。
<cfset myVar=Request.theFunctionName(Argument1...)> |
この方法で定義した関数では、This スコープと Variables スコープがリクエストの Application.cfc ファイルと共有されます。
onApplicationStart におけるアプリケーションのデフォルト変数と定数の設定
Application.cfc でデフォルト変数とアプリケーションレベルの定数を設定できます。たとえば、次のことが行えます。
- データソースの指定および可用性の確保
- ドメイン名の指定
- フォントやカラーなどのスタイル設定
- その他のアプリケーションレベルの変数の設定
Application.cfc の onApplicationStart メソッドで Application スコープの変数を設定する場合、それらの変数をロックする必要はありません。
onApplicationStart メソッドを実装する方法の詳細については、『CFML リファレンス』の onApplicationStart を参照してください。
onApplicationEnd メソッドの使用
onApplicationEnd メソッドは、アプリケーションのシャットダウン時にクリーンアップ処理が必要な場合に使用できます。例えば、メモリ内にあるデータをデータベースに保存することや、アプリケーションの終了をログに記録することができます。このメソッドはリクエストに関連付けられていないので、ユーザーページにデータを表示することはできません。このメソッドで例外が発生した場合でもアプリケーションは終了します。頻繁に使用されるアプリケーションでは、サーバーのシャットダウン時を除き、このメソッドが実行されることはほとんどありません。
onApplicationEnd メソッドを実装する方法の詳細については、『CFML リファレンス』の onApplicationEnd を参照してください。
Application.cfc によるセッションの管理
ユーザーセッションの設定と管理には、onSessionStart メソッドと onSessionEnd メソッドを使用します。ユーザーが 1 回のブラウザーセッションでサイトにアクセスする間に複数のページで使用されるリソースは、これらのメソッドによって制御できます。アプリケーション内のページをユーザーが最初にリクエストするとセッションが開始し、そのセッションがタイムアウトするとセッションは終了します。Session スコープと Session 変数の詳細については、永続データの使用とロックを参照してください。
セッションリソースには、セッションの全期間にわたって必要なデータ(口座番号やショッピングカートの内容など)を格納する変数や、セッション中に複数のページから使用するメソッドおよびデータが含まれている CFC などがあります。
注意:onSessionStart メソッドのコードはセッションが開始するときにしか実行されないので、cflogin タグや基本ログイン処理は記述しないでください。ユーザーのログアウトが処理できず、完全なセキュリティを確保できません。 |
onSessionStart メソッドの使用
このメソッドは、セッションデータ (ユーザー設定やショッピングカートの内容など) の初期化や、アクティブなセッションの数を監視するなどの用途に適しています。このメソッドでセッション変数を設定する場合、Session スコープをロックする必要はありません。
詳しくは、『CFML リファレンス』で onSessionStart のエントリを参照してください。
onSessionEnd メソッドの使用
このメソッドは、セッション終了時に任意のクリーンアップ処理を実行するために使用します。(セッション終了について詳しくは、セッション変数の設定と使用の「セッションの終了」を参照してください。)たとえば、セッション関連データ (ショッピングカートの内容や、ユーザーが注文処理を完了したかどうかなど) をデータベースに保存することや、セッション終了のログをファイルに記録することができます。このメソッドはリクエストに関連付けられていないので、ユーザーページにデータを表示することはできません。
注意:アプリケーションが終了しても、セッションは終了しないので onSessionEnd メソッドは呼び出されません。詳細については、『CFML リファレンス』で onSessionEnd のエントリを参照してください。 |
Application.cfc によるリクエストの管理
ColdFusion でリクエストを管理する方法としては、onRequestStart、onRequest および onRequestEnd の 3 つがあります。ColdFusion では、リクエスト(これらのメソッドを含む)が次のように処理されます。
- リクエストの開始時には、必ず onRequestStart が処理されます。
- onRequest メソッドが実装されている場合はそれが処理され、実装されていない場合はリクエストされたページが処理されます。onRequest メソッドを実装する場合は、リクエストされたページを onRequest メソッド内で明示的に呼び出します。
- リクエストの終了時には、必ず onRequestEnd が処理されます。
注意:cfabort、cflocation または cfcontent タグを使用した場合は、OnRequestEnd ではなく OnAbort メソッドが呼び出されます。
次のように Application.cfc のリクエストメソッドを使用すると、リクエストを管理できます。
onRequestStart メソッドの使用
このメソッドはリクエストの開始時に実行されます。これはユーザーの承認 (ログイン処理) や、リクエスト固有の変数の初期化 (パフォーマンス統計の収集など) に適しています。
onRequestStart メソッドを使用して onRequest メソッドを使用しなかった場合は、onRequestStart コードの処理が完了すると、ColdFusion によってリクエストが自動的に処理されます。
注意:Application.cfm ファイルに onRequest メソッドを記述しなかった場合、onRequestStart メソッドとリクエストされたページの間で Variables スコープは共有されません。ただし、Request スコープの変数は共有されます。 |
詳しくは、『CFML リファレンス』の onRequestStart を参照してください。
ユーザー認証
アプリケーションでユーザーのログインが必要な場合は、onRequestStart メソッドに認証コード(cflogin タグ、またはこのタグを呼び出すコードなど)を記述します。これによって、各リクエストの開始時にユーザーが認証されるようになります。セキュリティおよびログイン作成の詳細については、Securing Applications を参照してください。Adobe Dreamweaver の CF ログインウィザードで生成した認証コードを使用する例については、『CFML リファレンス』の onRequestStart を参照してください。
onRequest メソッドの使用
onRequest メソッドには、onRequestStart メソッドとの重要な違いが 1 つあります。それは、onRequest メソッドによってユーザーのリクエストがさえぎられるという点です。これは、次の 2 つのことを意味します。
- リクエストを明示的に(例えば cfinclude タグを使用して)呼び出さない限り、リクエストは処理されません。したがって、onRequest メソッドを使用することで、リクエストされたページコンテンツをフィルター処理したり、表示するページまたはページコンテンツを決定するスイッチを実装することができます。
- cfinclude を使用してリクエストを処理すると、その CFC インスタンスとリクエストされたページの間で Variables スコープが共有されます。したがって、その CFC のすべてのメソッドからそのページの Variables スコープの変数を設定できます。また、onRequestEnd メソッドを使用して、インクルードページで設定または変更された Variable スコープの任意の変数にアクセスできます。例えば、ページ内で使用される変数を onRequestStart メソッドまたは onRequest メソッドで設定することができます。
このメソッドをフィルターとして使用するには、次の例のように cfsavecontent タグの内側に cfinclude タグを記述します。
<cffunction name="onRequest"> |
詳しくは、『CFML リファレンス』の onRequest を参照してください。
onRequestEnd メソッドの使用
onRequestEnd メソッドでは、各リクエストの終了時に実行するコードを記述します。ColdFusion MX 6.1 までのバージョンでは、そのようなコードは "OnRequestEnd.cfm" ページに記述していました。このメソッドの代表的な用途としては、ダイナミックなフッタページの挿入などがあります。例については、『CFML リファレンス』の onSessionEnd を参照してください。
注意:Application.cfm ファイルに onRequest メソッドを記述しなかった場合、onRequestEnd メソッドとリクエストされたページの間で Variables スコープは共有されません。ただし、Request スコープの変数は共有されます。 |
詳しくは、『CFML リファレンス』の onRequestEnd を参照してください。
Application.cfc でのエラー処理
以降の節では、Application.cfc でエラーを処理する方法について簡単に説明します。エラーページとエラー処理の詳細については、エラーの処理を参照してください。onError メソッドを実装する方法の詳細については、『CFML リファレンス』の onError を参照してください。
Application.cfc でのエラー処理方法
Application.cfc では、次の方法を組み合わせてエラーを処理します。
- イベントメソッド(onApplicationStart、onRequestStart など)の中で try/catch エラー処理を使用して、イベントメソッド内で発生する例外を処理します。
- onError メソッドを実装します。CFML コード内の try/catch ハンドラーで直接処理されない例外は、すべてこのメソッドに送られます。このメソッドは、cfthrow タグを使用して、そこで処理しないエラーをすべて ColdFusion に渡して {{}} を処理させることができます。
cferror タグは、アプリケーションの初期化コード内で使用します。これは cfcomponent タグの後の、通常はアプリケーションの This スコープ変数を設定するコードの後に記述します。これらのタグでは、onError メソッドを実装しない場合のエラー処理方法、または onError メソッドでエラーが発生した場合の処理方法を指定します。また、アプリケーション固有の検証エラーハンドラーを実装することもできます。それには、たとえば次のようなタグを CFC の初期化コード内に記述します。
<cferror type="VALIDATION" template="validationerrorhandler.cfm">
- 以上のいずれの方法でも処理されないエラーは、ColdFusion のデフォルトのエラーメカニズムによって処理されます。デフォルトのメカニズムには、サイト全体のエラーハンドラー(ColdFusion Administrator で指定)や、ビルトインのデフォルトエラーページなどがあります。
これらの方法を使用すれば、エラーメッセージにアプリケーション固有の情報(連絡先情報、アプリケーションやバージョンの識別子など)を含めることができ、また、アプリケーション内のすべてのエラーメッセージを一貫した方法で表示できます。Application.cfc ページを使用することで、アプリケーション全体にわたる高度なエラー処理を実装できます。たとえば、エラー処理メソッドで特定のメッセージを表示したり、構造化されたエラー処理メカニズムを実現することができます。
注意:onError メソッドは、アプリケーションイベントメソッド onSessionEnd および onApplicationEnd 内で発生したエラーを処理しますが、リクエストコンテキストが存在していないので、ユーザーに対してメッセージは表示されません。onError 関数を使用すると、セッション終了時またはアプリケーション終了時に発生したエラーがログに記録されます。 |
onError メソッドによるサーバーサイド検証エラーの処理
サーバー側検証エラーは、実際には ColdFusion 例外です。したがって、アプリケーションで onError メソッドを使用している場合はこのメソッドにエラーが送られるので、そこで処理するか ColdFusion に渡して処理させる必要があります。
サーバー側検証エラーを識別するには、Arguments.Exception.StackTrace フィールドに coldfusion.filter.FormValidationException が含まれるかどうかを確認します。その後、エラーを onError ルーチンで直接処理するか、またはこのエラーを再度投げて、ColdFusion デフォルトの検証エラーページか、Application.cfc 初期化コードの cferror タグで指定したページに処理させます。
例:onError メソッドによるエラー処理
次に示す Application.cfc ファイルには、エラーを次のように処理する onError メソッドが含まれています。
- サーバー側検証エラーである場合は、ColdFusion にエラーを投げて処理させ、その結果として標準の検証エラーメッセージを表示します。
- その他のタイプの例外である場合は、エラーが発生したイベントメソッドの名前を表示し、例外情報をダンプします。この例では、Application.cfc のメソッドではなく CFM ページでしかエラーを生成していないので、イベント名は常に空の文字列になります。
<cfcomponent> |
この例をテストするには、次のコードを含んだ CFML ページを Application.cfc ファイルと同じページに作成し、テキスト入力フィールドに、有効なテキストや有効でないテキストを入力します。
<cfform> |
注意:サーバー側検証エラーについて詳しくは、データの検証を参照してください。 |
例:完全な Application.cfc
次の例は、すべてのアプリケーションイベントハンドラーの基本的な使用方法を示す、単純な Application.cfc ファイルです。
<cfcomponent> |