2008年12月10日水曜日

ZK: MVC

GenericFowardComposerを拡張したコントローラ・クラスを作成しwindowのapply属性の値に設定すると、イベント・リスナーが自動的に登録されると同時にzulコンポーネントとコントローラのフィールドが自動的に紐つけられる。このためコントローラのコードが非常にすっきり記述できるようになった。

ボタンをクリックすると2個のintboxの値を足し算しlabelへ表示するサンプル
ビュー

<window id="win" title="MVCサンプル" border="normal" width="300px" apply="Controler1">
<hbox>
<intbox id="arg1"/> + <intbox id="arg2"/> <button label=" = " id="addBtn" /> <label id = "ans"/>
</hbox>
</window>


コントローラ

public class Controler1 extends GenericForwardComposer {
private Intbox arg1; //ビューの<intbox id="arg1"/>コンポーネントと自動的に紐付けされる
private Intbox arg2; //ビューの<intbox id="arg2"/>コンポーネントと自動的に紐付けされる
private Label ans; //ビューの<label id="and"/>コンポーネントと自動的に紐付けされる

// addBtnボタンの onClickイベント・リスナー
public void onClick$addBtn(Event e) throws Exception{
ans.setValue(String.valueOf(arg1.getValue() + arg2.getValue()));
}
}

コントローラでビューのzulコンポーネントと同じ型でidと同じ名称のフィールドを宣言するとzulコンポーネントと自動的に紐つけされる。
onイベント名$コンポーネント名の形でイベント・リスナーを書いておけば自動的に登録され対応するビューのコンポーネントのイベントが処理できる


データバインド
S2JDBCを使いFirebirdに付属のemployeeテーブルをリストと明細で表示するサンプル。

データバインダを利用するにはビューを<?init class="org.zkoss.zkplus.AnnotateDataBinderInit" ?>で初期化する。
バリアブル・リゾルバにorg.zkoss.zkplus.seasar.DelegatingVariableResolverを使用しSeasar変数jdbcManagerを利用できるようにする。

ビュー

<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit"?>
<?variable-resolver class="org.zkoss.zkplus.seasar.DelegatingVariableResolver"?>
<window id="win" title="Employee" border="normal" width="300px" apply="MyControler">
<listbox id="empListbox" width="200px" rows="10" multiple="true" height="100%"
checkmark="true" model="@{controler.empData}" selectedItem="@{selected}">
<!--
controlerはMyControlerのdoAfterComposeメソッドでWindow変数に追加されている。
aWindow.setVariable("controler", this, true); //aWindowはdoAfterComposeの引数
empDataはcontrolerで定義されているList<Employee>型のプロパティ
-->
<listhead>
<listheader label="姓" />
<listheader label="名" />
</listhead>
<listitem self="@{each=employee}">
<listcell label="@{employee.lastName}"/>
<listcell label="@{employee.firstName}"/>
</listitem>
</listbox>
<vbox>
<hbox>姓: <label value="@{selected.lastName}"/></hbox>
<hbox>名:<label value="@{selected.firstName}"/></hbox>
<hbox>内線番号: <label value="@{selected.phoneExt}"/></hbox>
<hbox>入社日:<label value="@{selected.hireDate}"/></hbox>
</vbox>
</window>


コントローラ

public class MyControler extends GenericForwardComposer {
private List<Employee> empData;
private JdbcManager jdbcManager; //super.doAfterComposeのコール後Seasar変数と自動で紐付けされる

@Override
public void doAfterCompose(Component aWindow) throws Exception {
super.doAfterCompose(aWindow);

// 自分自身をwindowの変数に追加するとビューからアクセス可能なオブジェクトになる。
aWindow.setVariable("controler", this, true);
empData = jdbcManager.from(Employee.class).getResultList();
}

//zulのListboxのmodelプロパティには controler.empData を設定する
public List<Employee> getEmpData() {
return empData;
}
}

0 件のコメント: