ui:repeatとEL Methodで世界が変わるJSF 2.0

JSF 2.0のアクションってELの新機能のMethod使えるんですな。これは世界が変わりますぞ。


JSF 1.xまでは引数なしの戻り値Stringがアクションだった。

<h:commnadButton action="#{Hoge.hogeAction}" value="押してね♪"/>
public String hogeAction(){

  //なんかのロジック

  return null;//画面遷移なし
}

これがJSF2.0ではこうかける。

<h:commnadButton action="#{Hoge.hogeAction(123)}" value="押してね♪"/>
public String hogeAction(int no){

  //なんかのロジック

  return null;//画面遷移なし
}

ボタンを押したときに引数で「123」という数値がわたってくる。



でも固定のパラメータ渡してもつまらんよね。

<ui:repeat items="#{Hoge.items}" var="item" varStatus="stat">
  <h:commnadButton action="#{Hoge.hogeAction( stat.index )}" value="押してね♪"/>
</ui:repeat>
public String hogeAction(int no){

  //なんかのロジック

  return null;//画面遷移なし
}

どのボタンを押したのかがすぐにわかるというわけだ。なんでもDataTable使わないといけない病からやっと開放されたともいえる。



さらに面白いものとしてインデックスではなくBeanそのものもちゃんとわたせる。

<ui:repeat items="#{Hoge.items}" var="item">
  <h:commnadButton action="#{Hoge.hogeAction( item )}" value="押してね♪"/>
</ui:repeat>
public List<HogeBean> getItems(){
  …
}

public String hogeAction(HogeBean item){

  //なんかのロジック

  return null;//画面遷移なし
}


jsfc属性を併用すればよくあるテーブルの表示も以下のようにかける。

<table border="1">
  <tr jsfc="ui:repeat"  value="#{Hoge.items}" var="item" >
    <td><span jsfc="h:outputText" value="#{item.id}"/></td>
    <td><span jsfc="h:outputText" value="#{item.name}"/></td>
    <td>
      <input type="submit" jsfc="h:commnadButton" action="#{Hoge.delete( item )}" value="この行を削除"/>
    </td>
  </tr>
</table>
public List<HogeBean> getItems(){
  …
}

public String delete(HogeBean item){

  hogeService.delete( item );//データベースから対象を削除
  items.remove( item );//画面表示用のリストから対象を削除

  return null;//画面遷移なし
}

もちろん、明細に<input type="text">もかけてちゃんとコンポーネントツリーもきれいに生成されているので、よくあるマスタメンテで、「行単位の編集だといちいち画面遷移が入って使い勝手が悪いんですけど」という顧客の要望(よくある)にもすぐに応えることができる。このへんは逆にアクションベースだとだるいことこの上ない。


それぞれの機能の説明は以下を参照