/
XUpdate
XUpdate
「XML UI」 で説明されているように、Nexaweb Platform は UI の状態を XML ドキュメントに格納します。Nexaweb に対応したアプリケーションの設定によって異なりますが、Nexaweb Platform は、サーバーとクライアントの両方で UI ドキュメントのコピーを維持できます。ただし、この UI ドキュメントのクライアントサイドのコピーは常に UI を制御します。また、他のアプリケーションデータは他の XML ドキュメントに格納されている場合があります。
これらの XML ドキュメント、つまり UI ドキュメントとアプリケーション固有のドキュメントは、XUpdate を XPath と併用することによって宣言的に変更することができます。
XUpdate - XML ドキュメントを宣言的に変更するための言語で、既存のアプリケーションドキュメントを変更する場合に使用できます。
Xpath - XML ドキュメントの各部分をアドレス指定するための言語で、XUpdate シンタックスの一部として使用されます。
このトピックは以下のセクションから構成されています。
- XUpdate と XPath の概要
- XUpdate ページの作成
- その他の XUpdate コマンドの使用
- ショートカット シンタックスを使用した XML ドキュメントの更新
注: このトピックで「ドキュメント」という場合は、特に注釈のない限り、メモリに格納されている XML ドキュメントオブジェクトを指します。
XUpdate と XPath の概要
XUpdate は、XML ドキュメントを更新または変更するための XML 言語です。次の XUpdate ページの例では、UI ドキュメントでボタンを作成する方法を示します。
<xu:modifications document="nxml" version="1.0" xmlns:xu="http://nexaweb.com/xupdate"> <xu:append select="/nxml/rootPane"> <button text="a new button"/> </xu:append> </xu:modifications>
Nexaweb Platform 4.0 以降のバージョンでは、すべてのメモリ内ドキュメントに名前が付けられています。Nexaweb Platform では、UI ドキュメント用に "nxml" という名前が予約されています。
XUpdate は XPath 式を使用して、ドキュメント内の場所を指定します。Nexaweb Platform は XPath 1.0 仕様に対応しています。上の例で、"/nxml/rootpane" は、ドキュメントルートの <nxml> タグの子である <rootPane> タグを特定する XPath 式です。
"/nxml/rootPane" は場所のパスです。評価が行われると、コンテキストノードへの相対的なノードのセットを返します。この場合は、'/' となります。Nexaweb Platform では、各 UI ドキュメントは、1 つの <nxml> 要素の下に <rootPane> 要素を 1 つだけ持つことができます。つまり、"/nxml/rootPane" は '/child::nxml/child::rootPane[1]' の短縮形です。
- child は軸の例で、場所のステップによって選択されたノードとコンテキスト ノード間のツリー関係を指定します。
- nxml と rootPane はノード テストの例で、ノードの種類と、場所のステップによって選択されたノードの拡張名を指定します。
- [1] は述語の例で、任意の式を使用して、場所のステップによって選択されたノードのセットをさらに絞り込みます。
XUpdate ページは、静的ファイル、またはサーバーページまたはサーブレットが動的に生成するページとして作成できます。各 XUpdate ページは、1 つ以上の <xu:modifications> 要素を含む、整形式の XML ドキュメントです。複数の <xu:modifications> 要素がページに含まれている場合は、1 つの <nxml> ルートノードにこれらの要素をラップして、整形式のページにする必要があります。次に、上の例で使用されているアイテムについて説明します。
- document - 操作が実行されるドキュメントの名前を指定します。
- xmlns:xu - XUpdate 命令の名前空間を指定します。http://www.nexaweb.com/xupdate を参照してください。
- select - 要素、属性、またはテキスト オブジェクトのセットに対して評価する XPath 式を指定します。<create-document> 以外の XUpdate 文には select 文が必要です。
サンプル 1: JSP ページを使用して、イベントハンドラとして使用する XUpdate 文を生成する方法
XUpdate ページは Nexaweb のイベントハンドラとして動作します。次の例は、XML コードのスニペットと、XUpdate を使用してイベント処理を行う XML ファイルを示します。
<button text="Append Button at End" onCommand="appendButton.jsp"/>
appendButton.jsp ファイルの全体は次のようになります。
<% String newButtonName = "myNewButton"; %> <xu:modifications document="nxml" version="1.0" xmlns:xu="http://nexaweb.com/xupdate"> <xu:append select="/nxml/rootPane"> <button text="<%=newButtonName%>"/> </xu:append> </xu:modifications>
サンプル 2: XUpdate を使用して新規 XML ドキュメントを作成する方法
この例では、XUpdate 文により、<name> と <address> の子を持つ "nexaweb" ドキュメントが作成されます。次に、同じ変更ブロック内にある 2 番目の XUpdate 文で、<phone> の子が追加されます。作成が完了すると、com.nexaweb.xml.DocumentRegistry.findDocument() を使用してこのドキュメントにアクセスできます。
<xu:modifications document="nexaweb" version="1.0" xmlns:xu="http://nexaweb.com/xupdate"> <!-- create-document コマンドは最初のコマンドでなければなりません。 --> <xu:create-document> <nexaweb> <name>Nexaweb</name> <address>Cambridge</address> </nexaweb> </xu:create-document> <xu:append select="/nexaweb"> <phone>617-577-8100</phone> </xu:append> </xu:modifications>
サンプル
3: MCO コード次の例では、作成された "nexaweb" ドキュメントのルート要素をクライアントの MCO コード内で検出します。
ClientSession session = getSession(); Document document = session.getDocumentRegistry().findDocument("nexaweb"); Element element = document.getRootElement();
XUpdate を使用した初期 UI ページの作成
XUpdate ドキュメントを使用して初期 UI ページを作成するには、次の特別な規則が適用されます。
- 最初の XUpdate 文で、<rootPane> 要素を "/nxml" ノードに追加する必要があります。
- 後続の XUpdate 文では、'/nxml/rootPane' ノードまたはその子に追加できます。
この方法は、「XUpdate を使用して新規 XML ドキュメントを作成する方法」で紹介した例と異なります。この方法の場合は、ア プリケーションを起動した直後、開発者コードが実行される前に "nxml" UI ドキュメントが存在します。初期 UI を作成する XUpdate では、ルートとして 1 つの <nxml> タグと唯一の要素を持つ "nxml" ドキュメントが既に存在することを仮定する必要があります。
また、XUpdate に依存せずに、ShortcutSyntax (以下に詳述) を使用して、初期 UI の記述を作成することもできます。ShortcutSyntax は、同じページで XUpdate と共に使用することができます。ただし、この方法を使用する場合には、ShortcutSyntax のセクションで説明する特別な注意が必要です。一般的にはこの 2 つを一緒に使用せず、可能な場合には XUpdate だけ、または ShortcutSyntax だけを使用して初期ページを宣言することをお勧めします。
XUpdate コマンドの使用
XUpdate を使用すると、Java コードを記述またはコンパイルしないで、XML ドキュメントを使用できるため、Nexaweb に対応したアプリケーションを開発する場合に生産性が向上します。また、柔軟性のあるコマンドを数多く使用できます。ここでは、XUpdate コマンドのサンプルとそのコード例を示します。正確なシンタックスと詳細については、XUpdate スキーマのリファレンスを参照してください。
insert-after
次の例は、insert-after コマンドの使用方法を示します。関連するコマンドには、insert-before、instert-at などがあります。
<xu:insert-after select="/nxml/rootPane/window[1]/panel[1]"> <panel/> </xu:insert-after>
append
次の例は、append コマンドの使用方法を示します。
<xu:append select="/nxml/rootPane/window[1]"> <panel/> </xu:append>
set-attribute
次の例は、set-attribute コマンドの使用方法を示します。
関連するコマンドには、attribute、remove-attribute などがあります。
<xu:set-attribute select="/nxml/rootPane/window[1]/panel[1]> <xu:attribute name="myattr" value="myvalue" /> </xu:set-attribute>
replace-children
次の例は、replace-children コマンドの使用方法を示します。
関連するコマンドには、replace などがあります。
<xu:replace-children select="/nxml/rootPane/window[1]"> <panel/> <panel/> <label text="mylabel"/> </xu:replace-children>
remove-element
次の例は、remove-element コマンドの使用方法を示します。
関連するコマンドには、remove-attribute などがあります。
<xu:remove-element select="/nxml/rootPane/window[1]/panel[1]"/>
variable, value-of
次の例は、value-of 変数コマンドの使用方法を示します。
<xu:variable name="myvar" select="/nxml/rootPane/window[1]/panel[1]" clone="true"/> <xu:append select="/nxml/rootPane/window[1]"> <xu:value-of name="myvar"/> </xu:append>
clone
次の例は、clone コマンドの使用方法を示します。
<xu:clone select="/nxml/rootPane/window[1]" deep="true" />
ショートカットシンタックスを使用した XML ドキュメントの更新
ショートカットシンタックスの特徴は次のとおりです。
- XUpdate 文に依存することなく、アプリケーションの初期 UI を宣言する
- XUpdate を使用せずに、ウィンドウとダイアログを <rootPane> に表示する
本来、ショートカットシンタックスは、<rootPane> タグに追加する XUpdate 文を使用する場合に簡便な表記法を提供するものです。
次の項目にすべて該当する場合、ショートカットシンタックスの表記法が使用されます。
- XUpdate でラップされていない NXML タグが対象ページにある
- 対象ページが <include> タグでインクルードされていない
- 対象ページがアプリケーションの最初のページであるか、<window>、<dialog>、または <messageDialog> をルート要素として持つ (また、ラップされる "nxml" タグではない)
Nexaweb Platform では、次の規則に従って、ショートカット表記法でページが処理されます。
- <rootPane> タグがページになく、rootPane が UI ドキュメントでインクルードされていない場合は、rootPane タグが作成され、ルートの <nxml> タグの下にある UI ドキュメントに追加されます。次に、ページのコンテンツが、新たに作成された <rootPane> に追加されます。この処理は、Nexaweb で <rootPane> が自動的に作成される場合にのみ行われます。
- <rootPane> タグがページにない場合は、このタグがアプリケーションのルートの <nxml> タグに自動的に追加されます。ただし、<rootPane> が既に UI ドキュメントにある場合は、ルート ペインが 2 つ作成されるため、アプリケーションでエラーが発生します。
NXML タグが XUpdate でラップされていないページや <include> タグによってインクルードされていないページがあると、そのページはショートカットシンタックスであるとみなされます。次に、このショートカット表記法を 使用して初期 UI を宣言する例をいくつか示します。
index.nxml - 起動ページ
<!-- rootPane をルートの "nxml" タグに追加します。 --> <rootPane> <label text="hello world"/> <button text="click for hello world window" onCommand="window.nxml"/> </rootPane>
または
<-- rootPane を自動的に作成して "nxml" タグに追加し、ラベルとボタンをそのルートペインの下に配置します。 --> <nxml> <label text="hello world"/> <button text="click for hello world window" onCommand="window.xml"/> </nxml>
または
<!-- rootPane を自動的に作成して "nxml" タグに追加し、その下にボタンを配置します。 --> <!-- 起動ページのこのシンタックスでは、要素を 1 つだけ持つことができます。 --> <button text="click for hello world window" onCommand="window.xml"/>
window.xml
<!-- これらのタグを直接インクルードすると、起動ページ以外のページにウィンドウ、ダイアログ、メッセージダイアログのみを挿入できます。 --> <window caption="hello world window"/>
または
<nxml> <!-- これらのタグを直接インクルードすると、起動ページ以外のページにウィンドウ、ダイアログ、メッセージダイアログのみを挿入できます。 --> <window caption="hello world window"/> </nxml>