データバインディング

データバインディングを使用すればGUIコンポーネントとオブジェクトのプロパティをマッピングすることができます。
メリットとしては一度設定するだけで、GUIコンポーネントとオブジェクトのプロパティ値の同期をとれることが上げられます。

例えばテキストボックスとラベルを用意してそれらのコンポーネントとプロパティをマッピングすることでテキストボックスに入力した値を動的にラベルのプロパティに反映できます。
このおかげでプロパティの値を変更するためのコーディングをする必要がなくプログラムをかなりすっきりさせることができるので、それだけでも十分使える機能だと思います。


ZKではデータバインディングを行うための方法がいくつかあるのですが、
現時点で一番新しくもっともシンプルな方法を紹介します。
まずBookInfo.javaというJavaBeansを用意します。


BookInfo.java


package zk.test.form;

public class BookInfo {

private String title;
private String author;

public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}

まず1つ目の方法を紹介します。
次のzulファイルを用意してください。


binding01.zul


<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" ?>
<window id="mainwin" xmlns:a="">http://www.zkoss.org/2005/zk/annotation">
<grid width="400px">
<rows>
<row>
タイトル:
<a:bind value="book.title"/>
<textbox/>
</row>
<row>
著者:
<a:bind value="book.author"/>
<textbox/>
</row>
<row>
タイトルの表示:
<a:bind value="book.title"/>
<label/>
</row>
<row>
著者の表示:
<a:bind value="book.author"/>
<label/>
</row>
</rows>
</grid>

<zscript>
// BookInfoの初期化
import zk.test.form.BookInfo;
BookInfo book = new BookInfo();
book.setTitle("本のタイトル");
book.setAuthor("山田花子");
</zscript>
</window>

ZUMLページにJavaのソースを組み込みたくない場合は二つ目の方法を利用してください。


BookInfoInit.java


package zk.test.form;

import org.zkoss.zk.ui.Page;
public class BookInfoInit extends org.zkoss.zkplus.databind.AnnotateDataBinderInit {
// このメソッドをオーバーライドします
public void doAfterCompose(Page page) {

BookInfo book = new BookInfo();
book.setTitle("本のタイトル");
book.setAuthor("山田花子");

// BookInfoを"book"というキーでバインドします
page.setVariable("book", book);

super.doAfterCompose(page);
}
}

zulファイルは下記の通りとなります。


binding02.zul


<?init class="zk.test.form.BookInfoInit" ?>
<window id="mainwin" xmlns:a="">http://www.zkoss.org/2005/zk/annotation">
<grid width="400px">
<rows>
<row>
タイトル:
<a:bind value="book.title"/>
<textbox/>
</row>
<row>
著者:
<a:bind value="book.author"/>
<textbox/>
</row>
<row>
タイトルの表示:
<a:bind value="book.title"/>
<label/>
</row>
<row>
著者の表示:
<a:bind value="book.author"/>
<label/>
</row>
</rows>
</grid>
</window>

2つ目の方がZUMLページをすっきりさせる事ができるので個人的にはお勧めです。