マクロ
Platform 4.2+ が必要
マクロでのパラメータの使用
マクロを使用すると、Nexaweb Platform によりメモリにロードされて随時実行される有効なNexaweb ページの命令(XModify、MCO、データなど) のグループに名前を関連付けることができます。
Nexaweb 4.2.x では、java.text.MessageFormat シンタックス(Nexaweb Java アプリケーション向け) を使用して、ロジックを実行するマクロでパラメータを指定できるので、マクロで引数を受け取ることができます。MessageFormat シンタックスでは、引数の引き渡し先と引数のフォーマット(カンマ区切りやドル記号などを含む数値フォーマットなど) を指定できます。マクロでパラメータを使用すると、各マクロを再利用してさまざまなコンポーネントを操作できるので、各マクロの柔軟性が向上します。たとえば、2 つの別なウィンドウを閉じる場合に、パラメータを使用せずに2 つのマクロを個別に記述して閉じることもできますが、パラメータを使用すると1 つのマクロ記述で閉じることができます。
クライアントサイドのロジックの開発にマクロを使用すると、次のような利点があります。
- クライアントUI の開発に使用するものと同じXML ベースのツールを使用できます。
- サーバーへの往復伝搬が必要ありません。Nexaweb クライアント環境へのポータビリティがあります。
- 将来の
次の例では、パラメータを使用しないマクロの使用方法を示します。
<modifications document="ui"> <remove select="id(‘‘MyWindow’’)"> </modifications>
次の例では、パラメータを使用するマクロの使用方法を示します。
マクロ:
<xm:modifications xmlns:xm="http://openxal.com/core/xmodify">
<remove select="id(''{0}'')">
< /xm:modifications>
このマクロの呼び出し:
onCommand=”macro:mymacro.execute (‘Window1’)
マクロの定義の概要
次に、マクロの定義の基本フォーマットを示します。
<macro xmlns:macro="http://openxal.org/core/macro">
name = name-attribute-type
(パラメータに置き換わるとNexaweb ページ要素になる、任意の有効なNexaweb 要素または文字列)
< /macro>
name-attribute-typeには、このマクロを一意に識別する名前を指定します。
マクロを定義する際は、次の点に注意してください。
- マクロ名は、一意である必要があります。新しいマクロを既存のマクロと同じ名前で作成すると、新しいマクロによって古いマクロが上書きされます。では、マクロに含まれるNexaweb ページの命令はすべて文字列に変換され、java.text.message フォーマットを使用してフォーマット設定されるので、マクロ内のNexaweb ページの命令は、java.text.message フォーマットシンタックスに準拠している必要があります。たとえば、java.text.message フォーマットシンタックスに準拠するには、Nexaweb ページの命令の一重引用符や中かっこをエスケープする必要があります。
- Nexaweb
パラメータを使用しないマクロのXModify コマンドの定義
次の例では、XModify コマンドを使用するマクロを含むページを示します。このマクロでは、パラメータは使用しません。
この例では、ページに、mymacroというマクロが含まれています。このマクロの本文には、XModify コマンド(set-attribute) が1 つだけ含まれており、ラベル("mylabel") のテキストを変更します。ユーザーがボタン"Execute Macro" を押すと、このマクロが実行されて、ラベルの名前がOld Text からNew Text に変更されます。
<xal xmlns="http://openxal.org/ui">
<macro:macro name="mymacro" xmlns:macro="http://openxal.org/core/macro">
<xm:modifications xmlns:xm="http://openxal.com/core/xmodify">
<xm:set-attribute select="id(''mylabel'')">
<xm:attribute name="text" value="New Text" />
</xm:set-attribute>
</xm:modifications>
</macro:macro>
<horizontalFlowPane align="center">
<label text="Old Text" id="mylabel" backgroundColor="green"/>
<button text="Execute Macro" onCommand="macro:mymacro.execute()"/>
</horizontalFlowPane>
</xal>
パラメータを使用するマクロのXModify コマンドの定義
次の例では、同じマクロのパラメータを使用する場合と使用しない場合を示します。
<xal xmlns="http://openxal.org/ui">
<macro:macro name="mydialog" xmlns:macro="http://openxal.org/core/macro">
<xm:modifications xmlns:xm=http://openxal.com/core/xmodify>
<xm:append select="/xal/rootPane">
<dialog title="My Dialog" closeable="false" focused="true" centered="true">
<label text="My dialog is your dialog, from California, to the New York islands"/>
</dialog>
</xm:append>
</xm:modifications>
</macro:macro>
<macro:macro name="generic-dialog" xmlns:macro="http://openxal.org/core/macro">
<xm:modifications document="ui" xmlns:xm="http://openxal.com/core/xmodify">
<xm:append select="/xal/rootPane">
<dialog title="{0}" closeable="{1}" focused="{2}" centered="{3}">
<label text="{4}"/>
</dialog>
</xm:append>
</xm:modifications>
</macro:macro>
</xal>
次に、パラメータを使用するマクロへのマクロ呼び出しを示します。
<macro:macroCall name="generic-dialog" xmlns:macro="http://openxal.org/core/macro"> <macro:parameter>ThisIt</macro:parameter> <macro:parameter>true</macro:parameter> <macro:parameter>true</macro:parameter> <macro:parameter>false</macro:parameter> <macro:parameter>Answer</macro:parameter> < /macro:macroCall>
次に、パラメータを使用するマクロへのイベントハンドラ呼び出しを示します。
<button onCommand="macro:generic-dialog.execute( 'ThisIt', 'true', 'true', 'false', 'Answer' )" />
マクロ内のパラメータの指定
java.text.MessageFormatを使用して、属性値に対するNexaweb 命令のマクロパラメータを指定します(Java MessageFormat シンタックスの詳細については、http://java.sun.com/j2se/1.4.2/docs/api/ を参照してください)。
メモ: JVM (Java 仮想マシン) 1.4 またはそれ以前のバージョンでは、マクロで使用できるプレースホルダの数に制限があります。それより後のJVM では、プレースホルダを無制限に指定できます。この制限の詳細については、java.sun.com を参照してください。
MessageFormat シンタックスでは、一重引用符( ' ) 文字は特殊文字であり、
MessageFormat で無視される文字列リテラルの指定に使用します。したがって、このフォーマットでは、一重引用符を使用する場合、代わりに一重引用符を2 つ( '' ) 使用する必要があります。
メモ: 一重引用符 ' を2 つ使う必要があります。二重引用符 " では機能しません。
そのため、マクロで使用しないNexaweb 命令は、次の例の最初の文字列のようになりますが、マクロで使用するNexaweb の同じ命令は、この例の2 番目の文字列のようになります。
id('mywindow')
id(''mywindow'')
マクロ呼び出しまたはイベントハンドラ呼び出しで、Nexaweb 命令の実行時に、パラメータを置き換える実際の値を指定します。
マクロでは、次の2 つのタイプのパラメータを指定できます。
- リテラルとして指定する静的な値。XPath 文として指定する動的な値。
- ドキュメントに対して
イベントハンドラ内のパラメータの指定
<button onCommand="macro:generic-dialog( {id('myDialogTitleField')/@text}, 'true', 'true', 'false', {MyDataDocument:id('myTextField')/@text} )" />
プログラム的なマクロの定義と呼び出し
次の例では、プログラム的なマクロの定義を示します。
MacroContainer macroContainer = ClientSession.getMacroContainer();
Macro macro = macroContainer.createMacro
("<xm:modifications xmlns:xm=http://openxal.com/core/xmodify"> +
" <xm:append select=\"/xal/rootPane[1]\">" +
" <dialog>" +
" <label text=\"Call me Ishmael. Some years ago- never mind how long precisely...\" />" +
" </dialog>" +
" </xm:append>" +
"</xm:modifications>" );
macroContainer.putMacro("nexaweb-examples-herman-melville-dialog", macro);
次の例では、プログラム的なマクロ呼び出しを示します。
MacroContainer macroContainer = clientSession.getMacroContainer();
Macro melvilleMacro = macroContainer.getMacro( "nexaweb-examples-herman-melville-dialog" );
melvilleMacro.execute();
Macro genericXModifyMacro = macroContainer.getMacro( "nexaweb-examples-generic-xmodify" );
genericXModifyMacro.execute( new Object [] { "remove-element", "id('anElementId')", "" } );
genericXModifyMacro.execute( new Object [] { "append", "/xal/rootPane[1]", "<dialog><label text=\"Mylabel\"/></dialog>" } );
マクロのデバッグとトラブルシューティング
マクロをデバッグするには、アプリケーションのクライアントコンフィギュレーションファイル(nexaweb-client.xml) で、次のようにマクロのデバッグログを有効にします。
<log-configuration> <log name="Macro" log-level="debug"/> < /log-configuration>