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" />

回避策

以下のどれか。

  1. 送信したいデータを持つコントロールがSubmitコンポーネントよりも必ず上に来るようにレイアウトをうまく考える。
  2. listenerはformに記述し、Submitコンポーネントのtag属性やselected属性を利用して処理を分岐する。
  3. 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 {
   	// ・・・
  }
}