listenerをどこに記述するか
続報があります。こちら
listener属性を指定する事でページクラスにあるメソッドの呼び分けができるようになります。この機能は便利なのですが以下のようなクセがあり、知らないとハマリます(ハマリました。。。)
formコンポーネントで記述
submitボタンが複数あっても同じlistenerが呼ばれる。
<form jwcid="@Form" listener="ognl:listeners.submit">
Submitコンポーネントで記述
ボタンによってlistenerを分けられるがsubmitボタンよりも下に記述されているコントロールは、同一Formであったとしてもセットされない。
例)以下の場合、submitするとhoge1は送信されるがhoge2はnullになる。
<input jwcid="@TextField" type="text" value="ognl:hoge1" /> <input jwcid="@Submit" listener="ognl:listeners.submit"/> <input jwcid="@TextField" type="text" value="ognl:hoge2" />
回避策
以下のどれか。
- 送信したいデータを持つコントロールがSubmitコンポーネントよりも必ず上に来るようにレイアウトをうまく考える。
- listenerはformに記述し、Submitコンポーネントのtag属性やselected属性を利用して処理を分岐する。
- Submitを使わずにLinkSubmitなどを使う。(但しLinkSubmitはJavaScriptが使えない環境では動作しない。)
上記回避策2の例
- page仕様
<property-specification name="selectedComponent" type="java.lang.String"/> <component id="hogeSubmit" type="Submit"> <binding name="selected" expression="selectedComponent"/> </component>
- ページテンプレート
<form jwcid="@Form" listener="ognl:listeners.submit"> <input jwcid="@TextField" type="text" value="ognl:hoge1" /> <input jwcid="hogeSubmit" tag="hoge1"/> <input jwcid="@TextField" type="text" value="ognl:hoge2" /> <input jwcid="hogeSubmit" tag="hoge2"/> </form>
- ページクラス
public void submit(IRequestCycle cycle) { if (getSelectedComponent().equals("hoge1")) { // ・・・ } else { // ・・・ } }