ひがやすを技術ブログ

電通国際情報サービスのプログラマ

Tapestry入門記(3) TextField, Insert

さて今度は、お約束の足し算機能です。
AddInputページで受け取った内容をもとに計算して、
AddResultページに表示します。
入出力のプロパティやイベント処理は、Tapestryではページクラスが
担当します。StrutsのActionFormとActionが合体したようなクラスです。
ページクラスは、BasePageを継承して作ります。
足し算のための入力値を受け取るために最初、int型のプロパティを
定義しました。でも、バインディングでエラーになりました。
ラッパークラス(Integer)を使う必要があるようです。
Hibernate君もnull可のカラムをマッピングするときには、
ラッパークラスを指定する必要があるので、
個人的にプリミティブクラスはプロパティの型として使わないほうが
無難だと思うことにします。
フォームを使う場合、HTMLでは次のように指定します。


<form jwcid="@Form" listener="ognl:listeners.calculate">
jwcidでコンポーネントの型を指定するのはあまりよくないと思って
いるのですが、フォームの場合はこれで横着します。
listener属性のognl:listeners.の後に、ページクラスの
メソッド名を指定します。このメソッドは、IRequestCycleを
引数に持つ必要があります。
入力値を受け取るために、HTMLで次のように指定します。

<input jwcid="arg1" type="text"/> +
<input jwcid="arg2" type="text"/>
普通のHTMLのタグにjwcidがついているだけです。ただしタグは、
XHTMLに準拠(?)している必要がありそうです。
タグを閉じ忘れるとエラーになりました。
本当にXHTMLに準拠している必要があるのかはよく分かりません。
これに対するコンポーネントの定義は次のようになります。

<component id="arg1" type="TextField">
<binding name="value" expression="arg1"/>
</component>
<component id="arg2" type="TextField">
<binding name="value" expression="arg2"/>
</component>
input type="text"に相当するコンポーネントはTextFieldです。
valueパラメータにognlの式であるexpressionをバインディングします。
これで、ページクラスのarg1,arg2プロパティに入力した値が
自動的に設定されます。
ためしに、arg1プロパティにあらかじめnew Integer(1)を設定しておくと
バインディングのエラーになりました。
初期値が設定されると思ったのに。
いづれは解決しなければならない問題ですが、今日はとりあえず先に進み
ます。いい加減なのを心から恥じる。
次は、サブミットされた後のcalculateメソッドです。

public void calculate(IRequestCycle cycle) {
int result = arg1_.intValue() + arg2_.intValue();
AddResult next = (AddResult) cycle.getPage("AddResult");
next.setResult(new Integer(result));
cycle.activate(next);
}
単に他のページに遷移するだけなら、cycle.activate("ページ名")だけで
よいのですが、今回は、AddResultページに結果を渡したいので、
getPage()で取得後、結果を設定してactivate()を呼び出しています。
AddResultページのHTMLは次のようになります。

result:<span jwcid="result"/>
出力用のコンポーネントの定義は次のようになります。
Insertコンポーネントを使います。TextFieldと似ていますね。

<component id="result" type="Insert">
<binding name="value" expression="result"/>
</component>