ひがやすを技術ブログ

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

Tapestry入門記(9) Submit

サブミットされたときの処理は、フォームに
Submitコンポーネントが1つしかない場合には、
これまでやってきたようにFormコンポーネント
listenerパラメータを使います。


<form jwcid="@Form" listener="ognl:listeners.submit">
それでは複数のSubmitコンポーネントがある場合はどうするのでしょうか。
1つはSubmitコンポーネントにタグ(名前)をつけて
ページのプロパティに代入しておく方法です。
Submitコンポーネントのselectedパラメータで
クリックされたときに代入するページのプロパティを指定し、
tagパラメータで、selectedパラメータで指定したプロパティに
代入する値を指定します。Tapestry in Actionでは
tagパラメータにString以外も使えるよと書いてありますが、
String以外の使い方が(119Pでは)書いてません。
OGNLを使えばよいようです。やってみました。

<form jwcid="@Form" listener="ognl:listeners.submit">
<input type="submit" jwcid="@Submit"
selected="ognl:submitTag"
tag="ognl:1"
label="up"/>
<input type="submit" jwcid="@Submit"
selected="ognl:submitTag"
tag="ognl:2"
label="down"/>
<input type="submit"/>
</form>
3つのSubmitに対し、最初の2つはtagを割り当て、最後のやつは
tagなしです。tagなしのやつをクリックしたときには、
submitTagプロパティは更新されないのですが、
ここで注意が必要です。更新されないので前の値が残ってしまう
のです。
そこで登場するのがPageRenderListenerです。
こいつで、初期化してしまえばいいのです。
Submit.java

public class Submit extends BasePage
implements PageRenderListener {

private int submitTag_;

public int getSubmitTag() {
return submitTag_;
}

public void setSubmitTag(int submitTag) {
submitTag_ = submitTag;
}

public void submit(IRequestCycle cycle) {
System.out.println("submitTag:" + submitTag_);
}

public void pageBeginRender(PageEvent event) {
submitTag_ = 0;
}
}

ページって複数のリクエスト間で状態が維持されているように
みえるけど、セッションで管理されるのかしら。-> id:masataka_kさん