ページのロード時に自動的に実行される関数を、JSF ハンドラーに組み込むことができます。
JSF ハンドラーのプロパティー onPreRenderFunction、onPostRenderFunction、および onConstructionFunction を使用すると、ページのライフ・サイクルのさまざまなポイントで実行される関数を指定することができます。
これらの関数の実行時期は、ページの scope プロパティーの値によって決まります。
EGL 制御の Web ページにユーザーが初めてアクセスすると、EGL は JSF ハンドラーをロードします。このハンドラーは、実行時にページ Bean によって表示されます。ページのスコープが session (デフォルト) に設定されていると、その Bean は、ユーザーがそのページから離れてブラウズした場合でも、そのユーザーのセッション中はアクティブのままになります。ユーザーがそのページに戻っても、Bean は引き続き有効な状態になっています。
ページのスコープを request に設定した場合、ユーザーがそのページから離れてブラウズすると、Bean はアクティブではなくなります。このケースでは、Bean に保存されたデータはすべて失われてしまうため、ユーザーがそのページに戻ったときに、その Bean を再度ロードする必要があります。
- onConstructionFunction プロパティーで指定される関数は、ページ Bean のロード時に実行されます。そのため、スコープが session に設定されたページの場合、この関数が実行されるのは、ユーザーが初めてそのページにアクセスしたときだけになります。
スコープが request に設定されたページの場合、ユーザーがそのページにアクセスするたびに、この関数が実行されます。
これは、JSF 検証でエラーが発生したためにページが再表示される場合を除き、Bean が毎回再作成されるからです。
ただし、JSF ハンドラーの cancelOnPageTransition プロパティーを
yes に設定した場合、ユーザーが別のページに移動したときに、ページ Bean はセッションから除去されます (scope プロパティーが session に設定されている場合であっても、同様です)。
このケースでは、ユーザーがページに戻ると、ページ Bean を再ロードする必要があるため、onConstructionFunction が再度実行されます。
一回限りの初期化タスクの場合には、この関数が便利です。
変更される可能性があり、ページの最新表示時に再度ロードする必要のある、セッション変数またはその他のデータを取得する際には、onConstructionFunction を使用しないようにしてください。
代わりに、onPreRenderFunction を使用してください。このプロパティーの詳細については、onConstructionFunctionを参照してください。
- onPreRenderFunction プロパティーで指定される関数は、ページのスコープによる影響を受けません。この関数は、Bean がユーザーのセッションにあったかどうかにかかわらず、サーバーがページのレンダリングを開始するたびに実行されます。
以上のように、ページ Bean が初めてロードされたとき、ユーザーがページを最新表示したとき、別のページからユーザーがこのページにダイレクトされたとき、および JSF 検証エラーが原因でページが再表示されたときには、必ず onPreRenderFunction が実行されます。
- onPostRenderFunction プロパティーで指定される関数は、onPreRenderFunction に似た動作をします。ただし、この関数は、サーバーによるページのレンダリングの完了時に、毎回実行されます。
ページ Bean が初めてロードされたとき、
ユーザーがページを最新表示したとき、
別のページからユーザーがこのページにダイレクトされたとき、
および JSF 検証エラーが原因でページが再表示されたときに、
この関数が常に実行されます。
これらのプロパティーを複数指定する場合は、以下の点に注意してください。
- onConstructionFunction プロパティーで指定される関数は、onPreRenderFunction プロパティーで指定される関数の前に実行されます (両方の関数が指定されている場合)。
- 関数でパラメーターが受け入れられる場合、それらのパラメーターは一致していることが必要です。あるいは、一方の関数ではパラメーターを定義し、別の関数ではパラメーターを定義しない、ということも可能です。
- これらのプロパティーのうち、複数のプロパティーに同じ関数を指定することができます。ただし、それが意味するのは、その関数が複数回実行できるということだけです。
次の JSF ハンドラーのサンプルで、これらの関数を 2 つ使う方法を紹介します。
- EGL Web プロジェクト内に、loadTest.jsp という名前の新規 Web ページを作成します。
- エディターで開いているページを右クリックしてから、「ページ・コードの編集」をクリックして、新規ページの JSF ハンドラーを開きます。
- このサンプルに一致するように、JSF ハンドラーのコードを変更します。
package jsfhandlers;
handler loadTest type JSFHandler
{onConstructionFunction = onConstruction,
onPreRenderFunction = onPreRender,
scope = session,
view = "loadTest.jsp"}
numberOfLoads int;
messageString string;
function onConstruction()
numberOfLoads = 0;
end
function onPreRender(incomingNumber int)
numberOfLoads = incomingNumber + 1;
messageString = "You have viewed this page "
+ numberOfLoads + " times.";
end
function forwardBack()
forward numberOfLoads to "loadTest";
end
end
- JSF ハンドラーを保存して、閉じます。
- loadTest.jsp ページで、「パレット」ビューの「拡張 Faces
コンポーネント」ドロワーから
「出力」フィールドを追加する。
- その出力フィールドの横に、「パレット」ビューの「拡張 Faces
コンポーネント」ドロワーから
「ボタン - コマンド」を追加する。
- 「ページ・データ」ビューから出力フィールドに、messageString を直接ドラッグする。
これで、JSF ハンドラーの変数が、ページの出力フィールドにバインドされます。
- 「ページ・データ」ビューからコマンド・ボタンに、forwardBack() を直接ドラッグする。
これで、このボタンが、JSF ハンドラーの関数にバインドされました。
- ページを保存して、プロジェクトを生成します。
- そのページをサーバーで実行します。
このページを初めて実行したときに、「このページを 1 回表示しました (You have viewed this page 1 times)」と表示されます。
このケースでは、
onConstructionFunction プロパティーで指定されている関数が最初に実行され、
numberOfLoads 変数がゼロに設定されます。次に、
onPreRenderFunction プロパティーで指定されている関数が実行されると、この変数は 1 に設定され、メッセージ・ストリング変数は「このページを 1 回表示しました (You have viewed this page 1 times)」に設定されます。これ以降、このページを再ロードするたびに、この変数は 1 ずつ増加します。つまり、
onPreRenderFunction 関数は毎回実行されますが、
onConstructionFunction 関数は毎回実行されないということです。
scope を request
に設定して、このサンプルを実行すると、この変数は 1 を超えることはありません。ページが最新表示されるたびに、onConstructionFunction 関数によって変数がゼロに設定されるからです。
必ず JSF ハンドラーへの変更点を保存し、プロジェクトを生成し、サーバーに再公開してください。
これらの関数には、以下の制約があります。
- onConstructionFunction プロパティーおよび onPreRenderFunction プロパティーで指定した関数は
、ソース・アシスタントによる JSF コンポーネント・ツリーへのアクセスの説明のように、JSF コンポーネント・ツリーにアクセスできません。
onPostRenderFunction
プロパティーに指定されている関数は、JSF コンポーネント・ツリーにアクセスできます。
ただし、この関数は、ページがレンダリングされてブラウザーに送信された後に呼び出されるため、ページが最新表示されるまで、ページに対する変更はユーザーに表示されません。
- onConstructionFunction プロパティーおよび onPreRenderFunction プロパティーで指定された関数は
、sysLib.setError() を使って、コンポーネントのエラー・メッセージを
設定することはできません。
ただし、これらの関数は
、sysLib.setErrorForComponentID() を使用できます。
onPostRenderFunction で指定された関数は
、sysLib.setError() を使用できます。
- これらの関数は、forward to URL ステートメントを使用できますが、forward to label は使用できません。
詳しくは、これらのプロパティー専用の各トピックを参照してください。