ShowTable of Contents
一つ前の記事では、XPages における JSF のライフサイクルと、XPage やカスタムコントロールのページイベントとの関係をまとめました。
XPages における JSF ライフサイクル - ページイベント処理のタイミング
この記事では、コントロールがサポートするさまざまなプロパティがライフサイクル中でいつ評価されるのか
(JavaScript ロジックが割り振られていた場合には、そのロジックが実行される)、イベントがいつ実行されるのかをまとめます。
処理順序に依存関係のある JavaScript ロジックを XPage 中のあちこちに分散して配置するような場合や、
パフォーマンスを考慮する場合には、このような実行順序を理解しておくことは有用です。
入力系コントロールの場合
次の簡単なXPageを使って評価タイミングを見ていきます。
パネルが2つ配置され、1つめのパネル内に、計算結果フィールドとコンボボックスが配置されています。
タイミングを確認するのは、次のプロパティとイベント(
太字)です。
- XPage
beforePageLoad/afterPageLoad/afterRestoreView/beforeRenderResponse/afterRenderResponse
- 計算結果フィールド
rendered/value
- コンボボックス
rendered/readonly/selectItems.value/onchange
注:
value はコントロールにバインドする値を指定するプロパティです。
rendered はコントロールを表示するかどうかを指定するプロパティです。
readonlyはコントロールを入力可能か表示専用で表示するかを指定するプロパティです。
selectItems.valueはコンボボックスでリストされ選択可能な項目を指定するプロパティです。
コンボボックス自身のプロパティではなく、その子要素である selectItems の value プロパティとして指定します。
- ケース1:新規ページアクセスの場合
RenderResponse フェーズで、コントロールの各種プロパティが評価されていることが分かります。
コンポーネントツリーの処理上、プロパティの評価は1回のリクエストに対して必ずしも1回ではない点に注意してください。
このケースでは、コンボボックスのプロパティがそれぞれ2回ずつ評価されています。
- ケース2:コンボボックスで選択を行った場合 (ページ全体を更新)
このケースでは、計算結果フィールドとコンボボックスが部分更新の対象となっているため、Render Response フェーズでの評価は、
ケース1の場合と同様です。
加えて、Apply Request Values/Process Validation/Update Model Values の各フェーズにおいても、
rendered 等のプロパティが評価されています。
onchange イベントは、Invoke Application フェーズで実行されています。
- ケース3:コンボボックスで選択を行った場合 (パネル2を部分更新する場合)
このケースでは、計算結果フィールドとコンボボックスが部分更新の対象となっていないため、
Render Response フェーズでのプロパティの評価が行われなくなっています。
それ以外は、ケース2の場合と同様です。
Apply Request Values/Process Validation/Update Model Values の各フェーズにおいては、
部分更新の対象になっていなくても、プロパティの評価が行われていることに注意してください。
- ケース4:新規ページアクセスの場合 (「ページの読み込み時に計算」を設定)
プロパティなどに割り振られた JavaScript には、そのロジックをいつ実行するかを指定するオプションがあります。
デフォルトでは「動的に計算」が選択されているのですが、これを「ページの読み込み時に計算」に変更した場合の動作です。
このオプションを選択すると、ケース1と比べて、プロパティの評価が Render Response フェーズから、Restore View フェーズに
移動していることがわかります。
- ケース5:コンボボックスで選択を行った場合 (ページ全体を更新、「ページの読み込み時に計算」を設定)
プロパティの評価は、新規ページロード時の Restore View フェーズで行ってしまっているので、このケースでは、
一切の評価が行われていません。onchange イベントの処理が行われているだけです。
このように、「ページの読み込み時に計算」オプションを指定することで、プロパティの評価回数を最低限にすることが出来ます。
但し、onchange などのイベント処理により評価値を変更することが出来ません。
そのため、値がページ読み込み時に確定してしまうことが分かっているプロパティにのみ使用してください。
繰り返しコントロールの場合
パネル1の中に、繰り返しコントロールを配置し、さらにその中にコンボボックスを配置しています。
繰り返しは2回行うように設定してあります。
タイミングを確認するのは、次のプロパティとイベント(
太字)です。
- XPage
beforePageLoad/afterPageLoad/afterRestoreView/beforeRenderResponse/afterRenderResponse
- 繰り返しコントロール
rendered/value
- コンボボックス
rendered/readonly/selectItems.value/onchange
- ケース6:新規ページアクセスの場合
ケース1とほとんど同じです。RenderResponse フェーズで、コントロールの各種プロパティが評価されていることが分かります。
コンボボックスが繰り返しコントロールの中に配置され2回繰り返されるため、コンボボックスのプロパティ評価が2倍になっています。
- ケース7:コンボボックスで選択を行った場合 (ページ全体を更新)
ケース2に対応するケースですが、いくつかの相違点が見られます。
繰り返しコントロールの value プロパティは、Render Response フェーズだけではなく、Apply Request Values フェーズでも評価されるため、
都合2回の評価となります。
この点は要注意です。繰り返しコントロールの value プロパティでは繰り返されるデータを用意するため、場合により、時間のかかる重たい
ロジックを割り当てることがあり得ます。このケースから分かるように、重たい処理が2回実行されることになると、パフォーマンスに影響が出ます。
コンボボックスが繰り返しコントロール内に配置されたことで、Apply Request Values/Process Validation/Update Model Values の
各フェーズにおけるrendered の評価回数が2回から3回に変化しています。
- ケース8:コンボボックスで選択を行った場合 (パネル2を部分更新する場合)
ケース3の場合同様、ケース7に対して、Render Response フェーズでのプロパティの評価が行われなくなっています。
まとめ
以上、さまざまなバリエーションで、コントロールのプロパティ評価やイベントの処理がどのタイミングで行われるのかを見てきました。
その中から、特に重要なポイントをまとめておきます。
- プロパティ評価のタイミングと順序
さまざまなオプションにより、プロパティ評価のタイミングや順序が変化します。実行順序に依存関係のある JavaScript を分散して配置する場合、
自分が設定しているオプションの場合に、何がいつどの順で実行されるかを正しく理解していないと、不可解な予期せぬ問題に遭遇することになります。
- プロパティ評価の回数
プロパティ評価は、1回のリクエストに対して1回とは限りません。さまざまな条件により大きく変化します。そのため、プロパティに割り当てられた
JavaScript の中で、サイドエフェクトのあるようなロジックを実行することは厳禁です。例えば、rendered に割り当てられた JavaScript の中で、
何回ページの呼び出しが行われたかを数える目的で sessionScope.accessCnt++ のようなロジックを実行すると、期待する以上の回数を
数えてしまうことになります。
また、時間のかかる重い処理を実行することも避けることが望ましいです。例えば、あるコントロールを表示するかどうかを判断するために、
Domino 以外の外部システムにリモートで問い合わせる必要があり、その処理に秒単位の時間がかかるとします。そのような問い合わせロジックを、
対象のコントロールの rendered に直接割り当ててしますと、部分更新の際などに何度も実行されてしまい 10秒単位の処理時間が
かかってしまうことになります。
このような場合には、ページアクセスごとに1回しか実行されないことが保障されているbeforePageLoad/afterPageLoad/afterRestoreView などの
タイミングで実行し、結果をスコープ変数などに保存した上で、rendered ではその値を参照するだけにするなどの工夫を行います。
- 部分更新の際のプロパティ評価
部分更新を指定することにより、評価をする/しないが変化するのは Render Response フェーズのみです。
Apply Request Values/Process Validation/Update Model Values におけるプロパティの評価は、部分更新の対象であるかどうかとは無関係であり、
評価は行われます。
注:
プロパティの評価のタイミングは、プロパティが何かによりそれぞれ異なります。
ここでまとめられている情報は、対象となっているプロパティに対してのみ有効です。
また、Domino のバージョンにより、タイミングが異なる場合もあり得ます。
ここでまとめられている情報は Domino 8.5.2 に基づく情報です。