ZK要素はコンポーネント作成のほかにZUMLページをコントロールします。
<zk>...</zk>
特別な要素が他の要素を集めます。本当のコンポーネント(例えば、hbox or div)とは異なり、コンポーネントツリーの一部分ではありません。つまり、コンポーネントではありません。例えば、
<window> <zk> <textbox/> <textbox/> </zk> </window>
は下と同じ働きをします。
<window> <textbox/> <textbox/> </window>
では、何のために使うのでしょうか?
XMLのシンタックス制限により、ドキュメントのルートは一つのみ指定することができます。こうして、多数のルートコンポーネントを持つと、zkをドキュメントルートとして使用しなければならず、ルートコンポーネントをグループ化します。
<?page title="Multiple Root"?>
<zk>
<window title="First">
...
</window>
<window title="Second" if="${param.secondRequired}">
...
</window>
</zk>
コンポーネントのようなzk要素はforEach属性に対応できます。こうして、forEach属性を使って、条件によって違ったタイプのコンポーネントを生成します。以下の例では、mycolsはオブジェクトの集合であって、いくつかのメンバを持っています:isUseText()
、
isUseData()
、
isUseCombo()です。
<window>
<zk forEach="${mycols}">
<textbox if="${each.useText}"/>
<datebox if="${each.useDate}"/>
<combobox if="${each.useCombo}"/>
</zk>
</window>
<zscript [language="Java"]>
Scripting codes
</zscript><zscript src="
uri
" [language="Java"]/>
例えば、Javaコードといったスクリプトコードを定義します、そうしてページが処理されるときインタープリットされます。スクリプトコードの言語はデフォルトでJavaです(下を見てください) 。language属性を使用することで異なった言語を選ぶことができます。
zscript要素は上に示したように二つのフォーマットがあります。初めのフォーマットはページ中に直接スクリプトコードを埋め込みます。二つ目のフォーマットはスクリプトコードを含んでいる外部のファイルを参照します。
|
Attribute Name |
Description |
|---|---|
|
|
[Optional][Default: スクリプトコードを含んでいるファイルのURIを指定します。指定されている場合、直接埋め込まれているように、スクリプトコードは読み込まれます。
メモ:ファイルには直接インタープリットできる選択言語のソースコードが必要です。エンコードはUTF-8でなければなりません。クラスファイルを指定しないように注意しましょう。(Aka.bytecodes) |
|
|
[Optional][Default: 書かれているスクリプトコードの言語を指定します。 |
|
|
[Optional][Default: 初めの延期されてない言語の |
|
|
[Optional][Default: 処理する条件を定義します。 |
|
|
[Optional][Default: 処理しない条件を定義します。 |
ZKは初めのzscriptコードを処理する前、インタプリタを読み込みます。例えば、以下の例の中で、ユーザーがボタンをクリックするとき、Javaインタプリタは読み込まれます。
<button onClick="alert("Hi")"/>
一方で、zscript要素はページを読み込むときに処理される必要があるので、以下のZUMLページを読み込むとき、インタプリタは読み込まれます。
<window>
<zscript>
void add() {
}
</zscript>
<button onClick="add()"/>
</window>
インタプリタの読み込みを遅らせる場合は、deferredオプションにtrueを指定します。そうすると、ユーザーがボタンをクリックするまでは、インタプリタは読み込まれません。
<window>
<zscript deferred="true">
void add() {
}
</zscript>
<button onClick="add()"/>
</window>
【ヒント】: unlessとsrcと if属性中で指定されたEL表記の処理は遅らせます。
【ヒント】: インタプリタが読み込まれるまでに、コンポーネントがページからはずれたらzscriptコードは無視されます。例えば、前の例でウィンドウがページに属していないと判断された場合、延期されたzscriptはインタープリットされません。
一つのページで複数のスクリプト言語を使うことができます。
<button onClick="javascript:do_something_in_js()"/> <zscript language="groovy"> do_something_in_Groovy(); </zscript>
スクリプト言語が指定されていない場合、Javaが想定されます。デフォルトのスクリプト言語を変更したい場合、page属性を以下のように使用します。
<?page zscript-language="Groovy"?> <zscript> def name = "Hello World!"; </zscript>
ZKはJava, JavaScript,Ruby,Groovyをサポートしていますが、簡単に拡張することができます:
org.zkoss.zk.script
は
org.zkoss.zk.scriping.Interpreterインターフェースを実装するクラスを供給します。ネーム空間を操作する場合、直接実装する代わりに、org.zkoss.zk.scripting.util.GenericInterpreterクラスから得ることができます。また、インタプリタがBSF(Bean Scipring Framwork)をサポートしている場合、org.zkoss.scripting.bsh.BSFInterpreterクラスから得ることができます。
WEB-INF/zk.xml又はzk/config.xml中でスクリプト言語を宣言します。
<zscript-config> <zscript-language> <language-name>SuperJava</language-name><!-- case insensitive --!> <interpreter-class>my.MySuperJavaInterpreter</interpreter-class> </zscript-language> </zscript-config>
WEB-INF/zk.xmlについての詳細は開発用リファレンスを参照ください。また、zk/config.xmlについてはComponent Development Guideを参照してください。
要素を閉じるために使われるXML属性を定義します。要素の中身は属性の値です。name属性は属性名を指定します。属性の値が複雑、又は属性に条件が付いている場合に使うと便利です。
変数のセットを定義します。variables要素が親ページと親コンポーネントを持っていて、ページレベルで宣言されている場合、variables要素は親コンポーネントを持っていれば、 Component のsetVariableメソッドと同じ働きをします。
以下に書かれているように、variablesはプログラムなしで変数を指定するのに便利です。
<window> <variables rich="simple" simple="intuitive"/> </window>
上記は下記と同じ働きをします。
<window>
<zscript>
self.setVariable("rich", "simple", false);
self.setVariable("simple", "intuitive", false);
</zscript>
</window>
もちろん、値にEL表記を指定することができます。
<window> <window id="w" title="Test"><variables title="${w.title}"/> 1: ${title} </window> 2: ${title} </window>
コンポーネントのsetVariableのように、以下のように現IDスペースにローカル変数を宣言するかどうか決めることができます。指定されていない場合、local=”false”が想定されます。
<variables simple="rich" local="true"/>
カスタム属性のセットを定義します。custom属性は特定の領域と関係するオブジェクトです。使用できる領域はコンポーネント、スペース、ページ、デスクトップ、セッション、アプリケーションです。
以下に示したように、custom-attributesはプログラムなしでcustom属性を指定するのに便利です。
<window> <custom-attributes main.rich="simple" very-simple="intuitive"/> </window>
上記は以下と同じ働きをします。
<window>
<zscript>
self.setAttribute("main.rich", "simple");
self.setAttribute("very-simple", "intuitive");
</zscript>
</window>
さらに、custom属性を割り当てる領域を指定します。
<window id="main" title="Welcome">
<custom-attributes scope="desktop" shared="${main.title}"/>
</window>
上記は下記と同様の働きをします。
<window id="main">
<zscript>
desktop.setAttribute("shared", main.title);
</zscript>
</window>
ここで注意してほしいのは、EL表記はコンポーネントが作成されているときに処理されます。例えば、以下の例で${componentScope.simple}がnullと処理されます。どうしてでしょうか?それは<label value="${componentScope.simple}"/>のショートカットです。つまり、ELが処理されるとき、コンポーネントselfはウィンドウというより、ラベルです。
<window>
<custom-attributes simple="intuitive"/>
${componentScope.simple}
</window>
上記は下記と同様の働きをします。
<window>
<custom-attributes simple="intuitive"/>
<label value="${componentScope.simple}"/><!-- self is label not window -->
</window>
【ヒント】: attributeとcustom-attributesを混同しないよう注意してください。その二つに関係ありません。Attribute要素は閉じるためのXML属性を定義する一つの方法です。一方、custom-attributes要素はcustom属性を特定の領域に割り当てます。