ShowTable of Contents
XPages で定義したデータソースは、ページを構成するコントロールツリーの構造および生存時間に関して、有効範囲のスコープを持ちます。
シリーズ目次:
構造的スコープ
ページを構成するコントロールのツリー構造に対して、データソースの有効スコープの基本は、
「定義した場所の内側およびその子孫において有効である」となります。
以下は、XPage 内にネストする2つのパネルを配置し、一番外側の XPage およびその中の2つのパネルの
それぞれのレベルにおいて、Domino 文書タイプのデータソースとそれを参照する計算結果フィールドを配置した例です。
XPageのレベル:
定義したデータソース: document1
配置した計算結果フィールド: computedField1
外側パネルのレベル:
定義したデータソース: document2
配置した計算結果フィールド: computedField2
内側パネルのレベル:
定義したデータソース: document3
配置した計算結果フィールド: computedField3
このような配置において、それぞれの計算結果フィールドにバインド可能なデータソースは以下のようになります。
computedField1: document1
computedField2: document1, document2
computedField3: document1, document2, document3
この関係は、パネルコントロールをビューコントロールやカスタムコントロールに置き換えた場合や、
利用するデータソースのタイプを Domino ビューに置き換えた場合も同様です。
構造的スコープとデータソース保存動作の関係
編集モードの Domino 文書タイプのデータソースを利用している場合、ユーザーはその値を編集、保存することが可能です。
通常、データソースの保存を行う場合には、以下の3つの方法が利用されます。
「送信」タイプのボタンコントロールを利用する
XPage内に「送信」タイプのボタンを配置した場合、ユーザーがそのボタンをクリックするとページ内で定義されている
データソースが自動的に保存されます。
注意する点は、XPage が複数のデータソースを定義していた場合です。「送信」タイプのボタンは、全てのデータソースを
一括して保存します。個別のデータソースを指定して動作することはできません。
「文書の保存」シンプルアクションを利用する
ボタンコントロールやリンクコントロールなどの onclick イベントなどに、「文書の保存」シンプルアクションを指定します。
ユーザーがそれらのコントロールをクリックすると、データソースの保存が行われます。
「文書の保存」シンプルアクションでは、保存する対象のデータソースを明示的に指定することが可能です。
複数のデータソースを定義する XPage 内で、明示的に保存する対象を指定した場合には、指定したデータソースのみが
保存されます。
明示的な指定を行わなかった場合には、グローバル変数である currentDocument が指定されたものとみなされます。
currentDocument に関する詳しい説明は、
「データソースの内部動作」
の説明を参照してください。
この保存対象データソースの指定の際には、上述のデータソースの構造的スコープが有効である点に注意してください。
例えば上図の例で、「文書の保存」シンプルアクションが割り当てられたボタンコントロールを外側パネルの内側かつ内側パネルの外側に
配置した場合、指定可能なデータソースは、document1 あるいは document2 のみであり、document3 はスコープ外のため
指定することはできません。
「データソースの保存」シンプルアクションを利用する
ボタンコントロールやリンクコントロールなどの onclick イベントなどに、「データソースの保存」シンプルアクションを指定します。
ユーザーがそれらのコントロールをクリックすると、ページ内の全てのデータソースの保存が行われます。
この動作は「送信」タイプのボタンと同様です。
時間的スコープ
データソースのサポートするプロパティのひとつとして、scope プロパティがあります。
このプロパティは「すべてのプロパティ」から指定可能であり、データソースの時間的有効範囲を指定するすることができます。
指定可能なスコープはスコープ変数の種類と同じ以下の4つで、その意味も同等です。
- application
- session
- view
- request
指定がない場合のデフォルトは view スコープです。
スコープを変更した場合の挙動の変化を、具体的な例を通して見ていきます。
2つの XPage を用意します。
1つめはビューコントロールを配置したページです。文書一覧を表示するためのものです。
Subject 列には「列の値をリンクとして表示する」を指定し、次の2つめの XPage を開くように設定します。

view XPage (全ての文書を列挙するビューを表示する)
2つめは、選択した文書を表示するためのページです。Domino 文書タイプのデータソースを持ち、文書のフィールド値を表示します。
追加で2つのボタンが配置されています。ひとつは view ページに戻るためのもの、
もうひとつは、Domino 文書表示のための表を部分更新して最新の情報を表示させるためのものです。
合わせて、データソースがオープンされたことを確認するために、queryOpenDocument イベントに
JavaScript のロジックも割り当てられています。

form XPage (選択した Domino 文書を表示する)
このような XPage は、Domino アプリケーションを XPage で作成する際の最も基本的な組み合わせです。
このサンプルに対して、以下の操作を順に行います。
- view ページをアクセスして文書一覧を表示する
- 任意の1つを選択してクリックし、form ページに表示させる
- 「更新」ボタンを押して、文書表示を更新する
- Notes クライアント等の別クライアントを利用して、現在表示中の文書を裏で更新する
- 再度「更新」ボタンを押して、文書表示を更新する
- 「戻る」ボタンを押して view ページに戻り、別の文書を選択して form ページに表示させる
データソースのスコープを変えながらこれらの操作を行った結果が以下の表示なります。
request スコープの場合
データソースは http リクエストのたびに生成と破棄を繰り返します。
form ページの新規ページロード時、部分更新時に関わらず、アクセスがあるたびにデータソースが生成され、
文書のフィールド値が読み込まれています。
そのため、毎回 queryOpenDocument が発生しています。
別クライアントによる裏からの文書更新および view ページ経由での選択文書の切り替え両方に対して、常に最新の
フィールド値が表示されています。
view スコープ (デフォルト) の場合
データソースは新たにページを表示する際に生成され、同じページにとどまる限り破棄されることなく再利用されます。
データソースがオープンされるのは view ページから文書を選択したときのみであり、form ページ内にとどまって
部分更新を繰り返す限りは、データが更新されることはありません。
そのため、form ページ内にとどまっている間に裏から変更が行われても、表示されるフィールド値が更新されることは
ありません。
session スコープの場合
データソースは最初のアクセス時に生成され一旦生成されるとページのリロードに関係なくセッションが続く限り
破棄されることなく再利用されます。
データソースが生成されるのは、view ページで始めて文書を選択して form ページを表示させたときのみであり、
それ以降ページを遷移して選択を変更しても、作成し直されることはありません。
そのため、裏から文書を更新したり文書選択を変更したりしても、form ページに表示されるフィールド値が変化することは
ありません。
以上のように、データソースのスコープにより生成、破棄されるタイミングが変化し、そこから取得されるフィールド値も
異なったものになります。
データソースの新規生成には Java オブジェクトの生成および元となった Domino 文書やビューのオープンとデータの
読み込みなどの操作が必要であり、XPage アプリケーションのパフォーマンスに影響します。
そのため、アプリケーションが実現しなければいけない機能の内容によって、最適なものを選択します。
別クライアントによる裏からの更新も含めて、常に最新の情報を入手する必要がある場合には request スコープを利用します。
但し、HTTP リクエストごとにデータソースの生成と破棄を繰り返すため、一番重い処理となります。
別ページに遷移したのち元のページに戻ってきた際にも、前回利用していたデータソースの値を保持しておく必要がある場合には
session スコープを利用します。生成と破棄が最小限なため、一番軽い処理となります。