ShowTable of Contents
ビューコントロールでは、ビューの列のプロパティで「列の値をリンクとして表示する」にチェックをつけておくことで、
ビューの列をリンク表示にすることができます。(下図は 8.5.2 の場合の例)
このリンクは、同じページ内で画面遷移をするものです。
別ウインドウで開くリンクにするためのプロパティは現状は提供されていません。
ここでは、ロジックなどを使って、ビューコントロールの列のリンクを、別ウインドウで開くリンクにする方法を紹介します。
(なお、当記事で紹介するステップやスクリーンショットは基本的にバージョン 8.5.2 のものです。)
ビューの列にサーバーサイド JavaScript でロジックを記述し、リンクタグを自分で書き出すようにします。
まず、ビューコントロールを選択した状態で、プロパティビューの「すべてのプロパティ」タブを開き、「データ」>「var」
プロパティに適当な変数名を入力します。下図では「viewEntry」としています。
これにより、ビューの列でサーバーサイド JavaScript ロジックを記述する際に、ここで指定した変数名でビューの各行の
ビューエントリーオブジェクトにアクセスすることができるようになります。
次に、リンク表示したいビューの列を選択して、プロパティビューの「表示」タブを開きます。
ここで 「コンテンツの種類」を「HTML」にします。これにより、ビューの列のサーバーサイド JavaScript ロジックで記述した
HTML 文字列が、エスケープされずにそのまま出力されるようになります。
また、HTMLの中でリンクタグは自分で記述するので、「列の値をリンクとして表示する」のチェックを外しておきます。
さらに、同じプロパティビューの中の「データ」タブを開きます。
ここで、「データの表示に使用する項目」で「計算結果の値」を選択して、リンクタグを出力するサーバーサイド JavaScript
を記述します。サーバーサイド JavaScript の例は以下のようになります。
var linkUrl = "myform.xsp?action=editDocument&documentId=" + viewEntry.getUniversalID();
return "<a href='" + linkUrl + "' target='_blank' class='xspLinkViewColumn'>" + viewEntry.getColumnValue("name") + "</a>"
サーバーサイド JavaScript コードの1行目ではリンクの URL を生成しています。
「列の値をリンクとして表示する」プロパティを使用した際にはリンクの URL を内部的に自動生成してくれていたため、
URL を意識する必要はありませんでした。しかし、今回のようにリンクの HTML を自分で生成する場合には、URL も
自分で組み立てる必要があります。
URL の構成は以下のようになっています。
まず最初の myform.xsp の部分は、開きたい XPage の名前です。ここでは「myform」という XPage を開くため、拡張子
「.xsp」を末尾に付与した「myform.xsp」を指定しています。
続いて「?」の後に URL パラメータを2つ指定します。
1つ目は「action」パラメータで、文書を編集モードで開くか読み取り専用モードで開くかを指定します。編集モードで開き
たい場合は「action=editDocument」、読み取り専用モードで開きたい場合は「action=openDocument」と指定します。
2つ目は「documentId」パラメータで、開きたい文書の UNID を指定します。 文書 UNID は、先にビューコントロールの
var プロパティで指定した変数名(ここでは viewEntry)を使用して、「viewEntry.getUniversalID()」で取得できます。
サーバーサイド JavaScript コードの2行目では、リンクタグを出力しています。
href 属性に先ほど作成したリンクURL、target 属性に「_blank」を指定することで、別ウインドウで開くリンクにしています。
class 属性に指定した「xspLinkViewColumn」は、ビューコントロールで使用されているリンクのスタイルで、デフォルトの
ビューコントロールと同じ見栄えにするために指定しています。(見栄えが異なってもかまわない場合は不要です)
リンクの文字列は、先ほどと同様ビューコントロールのvar プロパティで指定した変数名(ここでは viewEntry)を使用して、
「viewEntry.getColumnValue("列名")」により列の値を表示するようにしています。
以上で、ビューの列のリンクが別ウインドウで開くようになります。
8.5の場合は、ビューの列のプロパティの「データ」タブからは「計算結果の値」を選択することができません。
代わりに、「すべてのプロパティ」タブの「data」>「value」プロパティで「値の計算」を選択して、先ほどと同様のサーバー
サイド JavaScript を記述してください。
(8.5.1以降の場合でも、この value プロパティでの指定方法は利用できます)
リンクを別ウインドウで開くようにすることで、複数ウインドウでの操作が可能になります。
しかしその場合、サーバーで状態を保持しているページの数に上限があることに注意しておく必要があります。
以下の技術情報にも詳細が掲載されています。
XPage は JSF(Java Server Faces) という技術をベースとしており、XPage の各ページにおけるすべてのフィールドの
値やプロパティなどの状態(ステート)をサーバー側で一定時間保持しておく仕組みを持っています。
しかし、サーバーのリソースには限りがあるため、XPage では1セッションにつき状態を保持しておくページ数に上限を
設定し、古いページの状態は破棄することでサーバーの負荷を軽減しています。
ウインドウが1つの場合は、基本的にはこの上限値を意識することはありません。
(※ブラウザの戻るボタンを過剰に使用すると、上限値にかかって古いページの状態が破棄されている場合はあります)
しかしウインドウが複数ある場合、以下のようなケースで上限値を超え、正常に動作しない場合が考えられます。
- 複数あるウインドウのうちの1つで、状態保持ページ数の上限値を超えるページ遷移を行った後、
別のウインドウに移って操作を行った場合
- 状態保持ページ数の上限値を超えるウインドウでページを開き、古いウインドウに戻って操作を行った場合
→ どちらの例も別ウインドウのページは古いページとして状態が破棄されているため、正常に動作しません
そのため、リンクを別ウインドウで開かせるような XPages アプリケーションを開発する場合には、こうしたケースに遭遇
しないように、アプリケーションのユースケースを想定して上限値を見積もり、適切に設定しておく必要があります。
(もしくは、別ウインドウでの遷移ではなく、部分更新などを使って同一ページ内にデータを表示する仕様を検討する
ことも考えられます。XPages ではこちらの部分更新の方式がお勧めです。)
「サーバーに状態を保持しておくページ数の上限値」は、「アプリケーションのプロパティ」の設定によって変わります。
具体的には、「アプリケーションのプロパティ」の「XPage」タブで、左下の「パフォーマンス」セクションにある「サーバー
ページの保持」の設定によって、状態保持ページ数の上限値は以下のようになっています。
- ページをメモリに保存
ページの状態をサーバーのメモリ上に保存します。ページ保持数の上限値はデフォルトで 4 です。
メモリのためパフォーマンスは向上します。
- ページをディスクに保存
ページの状態をサーバーのファイルに保存します。ページ保持数の上限値はデフォルトで 16 です。
ファイルに書き込むため、メモリの場合よりパフォーマンスは落ちますが、メモリよりはリソースが
豊富なためスケーラビリティが向上します。
- 現在のページのみをメモリ保存
上記2つを組み合わせた方式で、現在のページのみをメモリ上に、それ以外をファイルに保存します。
ページ保持数の上限値は、「ページをディスクに保存」の場合と同様で、デフォルトで 16 です。
- サーバーのデフォルト
サーバー上の xsp.properties ファイルに定義されているデフォルトの設定が採用される。
何も設定していない場合はデフォルトである「ページをメモリに保存」が使用される。
例えば、「ページをメモリに保存」を選択している場合は、サーバー上に状態が保持されているのは 4 ページである
ため、4ページ以上遷移をすると古いページの状態は順番に破棄されていくことになります。
それぞれの設定におけるページ保持数の上限値は、xsp.properties というプロパティファイルで変更することも
可能です。しかし、サーバーのメモリやディスク容量などのパフォーマンスに非常に大きな影響を与えますので、
サーバーの能力やトランザクション数などを十分に検討をした上で変更を適用するようにしてください。