Championがスピーカーを務めるセッションにフォーカスを当てたレポートブログを紹介してきました。XPages」のセッションに参加した内容を振り返りたいと思います。このセッションではStackoverflowで寄せられた質問などをもとにXPAGESでの間違ったアプローチの紹介やトラブルシューティングの方法などノウハウ情報を満載の内容となっていました。このセッションではXPAGESの基礎知識を持っていることが前提になっており「XPAGESを既に使っている人は挙手してください」と質問すると会場のほぼすべての人が手を挙げていたのも印象的でした。Connectのセッションならではの光景です。documentidプロパティでは常に式言語(EL)を使うことこのセッション内の数あるトピックの中でも全てのXPAGES開発者が知っておくべきノウハウであり、知らずにやってしまいがちな落とし穴であると思ったのがこの「documentidプロパティなどでは常に式言語(EL)を使う」ということでしたので、私自身でテストしたサンプルコードを交えてこのトピックを掘り下げて紹介したいと思います。※ちなみに式言語(EL)とは${...}もしくは#{...}で始まるコードの事で#{javascript:...}ではないことと区別しています。documents?」でPaul氏が自ら回答している内容にも絡んでいるのですが、Paul氏が指摘するには、式言語(EL)を使わなければページロード時にdocumentidのプロパティ計算ロジックが4回も呼ばれてしまうと指摘しています。こちらに用意したサンプルコードを見てください。--></xp:panel></xe:widgetContainer></xp:panel></xp:view>Domino文書データソースを定義する箇所でdocumentIdプロパティに対して値の計算をしています。UNIDを引っ張ってきたいのでViewを取得して文書を取得してそのUNIDを返すというロジックになります。皆さんもこれに似たロジックを書いた経験はないでしょうか?このサンプルには1つの致命的な問題と2つの推奨されないコードが含まれています。1つ目の致命的な問題とはbeforePageLoadにてviewScopeの変数をセットしデータソース内でそのviewScope変数を利用しているという箇所です。これはデータソースのほうが先にプロセスが走りその後にbeforePageLoadのプロセスが走るため5行目のviewScope.selectedPageが意図したとおりに設定されずサーバーエラーを起こしてしまいます。そこでひとまず問題を解決するために以下のようにコードを書き換えます。--></xp:panel></xe:widgetContainer></xp:panel></xp:view>beforePageLoadでのviewScopeの利用をやめ、8行目にビューの値をハードコードで渡してやりました。これでとりあえずサーバーエラーは回避され、見かけ上は意図したとおりにブラウザでこのコードを表示されるでしょう。その1しかし、このコードにはまだ推奨されないコードが含まれており、試しにブラウザでこのコードを表示してみるとAdministratorのコンソールに以下のような出力があることが確認できます。foundこのように、documentIdの値の計算の処理が4回も呼び出されています。これこそが今回Paul氏が指摘する問題の箇所になります。Paul氏によると4回も呼び出される理由は以下のようになります。【${...}もしくは#{...}】を使わなかった場合、documentIdのようなプロパティをPanel内に追加した場合、beforePageLoadの後に2回呼び出されるXPage内に追加した場合、beforePageLoadの前に2回呼び出される。response時に2回呼び出されるということで、上記サンプルの場合4回呼び出されるということになります。そこで回避策として式言語(EL)を利用することでこの問題は回避されます。以下に1回のみ呼び出される式言語(EL)を利用したサンプルコードを追加します。foundのように1回しか呼び出されていないことが確認できます。式言語(EL)で「動的に計算」を利用しているため、beforePageLoadで設定されたscope変数が利用できていることにも注目してください。documentId=”#{viewScope.docId}”の箇所がdocumentId=”#{javascript:viewScope.docId}”では意図した動作になりません。その2Domino文書のデータソースを定義する際にignoreRequestParams=”true”を明示的に定義してやらないとURLパラメータのdocumentIdで指定された値が常に優先されるため、このようなロジックを書くときはignoreRequestParams=”true”を明示的に定義してやるべきです。今回はこのブログを書くにあたってPaul氏の指摘を深堀して実証実験を行ってみましたが、実際にPaul氏のセッションではこれに似た内容がいくつもスライドとデモで紹介され、どれもがものすごいスピードで紹介されるためはっきり言ってついていくのがやっとな状態のかなりレベルの高い内容となっていました。Connectに来た甲斐があったと思える、そんなセッションでした。こちらのセッションのスライドは既に公開されており、こちらより確認できます。2013からのセッションがタイトル別にまとめられています。2016年のセッションもいくつか登録されているようなので確認してみてください。アプリ開発などをしたりします。XPagesの仕事をしているとテンションが通常の1.25倍ぐらい高くなります。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。コメントデータの処理方法の詳細はこちらをご覧ください。Connections、Sametimeのインテグレーション、開発を行うプロフェッショナル集団です。お客様のニーズにあった技術支援を全国どこでも専門エンジニアが対応いたします。コーポレーションより、ビジネスパートナーとして認定されています。