JSF2.2試してみた - メッセージまわり

バリデータと、ユーザプログラムで設定するメッセージについて。JSFが用意しているバリデータのメッセージが変更可能なのは知ってて、とりあえずどんな感じになるのか掴んでおきたかった。

ちなみに、バリデータの有無にかかわらず、Faceletがバインドしているオブジェクト(例えば Calc.setRight(long))の型に合わせた、型チェックは勝手にやってくれてた。デフォルトのメッセージはアレな感じだけど、ちょっとだけ感心した。


それはそれとして、バリデータではなく、管理ビーンの処理(アクション)で、いわゆるギョーム的なメッセージを付与して画面に返したいなんてのは良くある話で、かつエラーになった項目の背景色を赤にして目立たせたいなんてのもよくある話だよねと。
その辺は、こちらを参考に実装してみた。
JSFでエラーのある項目の背景色を変える - じゃばらの手記


その結果が、管理ビーンからフラッシュメッセージを使う事と、Faceletから component.clientid でエラー(バリデータが invalid)かどうかを判定するアレなコード。

<table>
  <tr>
    <td>
      <h:inputText id="left" label="左辺" value="#{calcView.calc.left}"
                   style="#{faceUtils.valid(component.clientId)}" required="true">
        <f:validateLongRange maximum="99999"/>
      </h:inputText>
    </td>
    <td></td>
    <td>
      <h:inputText id="right" label="右辺" value="#{calcView.calc.right}"
                   style="#{faceUtils.valid(component.clientId)}" required="true">
        <f:validateLongRange maximum="99999"/>
      </h:inputText>
    </td>
  </tr>
  <tr>
    <td><h:message for="left"/>#{flash.left}</td>
    <td>&nbsp;</td>
    <td><h:message for="right"/>#{flash.right}</td>
  </tr>
</table>

clientIdが自動発行されるので、messageタグとフラッシュメッセージを別々に用意したり、HTML要素のID知ってるのに、わざわざ component.clientid とかやって面倒だなと思ってたら、単なる思い込みだったと、キクタローさんのサンプルで知った(実にありがたいw
#prependId属性ってのを false にするといいらしい。


実装のイケてなさはさておき、とりあえず、

  • アクションの処理中に、特定の項目に紐づけたメッセージを出力できる
  • エラーになった入力項目を目立たせる事ができる

ことはわかった。


あと知っておきたいのは、

  • アクションの結果に応じて、特定の入力項目の属性(入力不可、非表示)を切り替えられるかどうか
  • (できたら、動的に入力項目を増減・入れ替えできるかどうかも)

なんだけど、その前にちょっと寄り道した(つづく)。