Employee Management2-(2)

次はemployeeSearch.htmlのメイン部分である

<span m:inject="s:insert" m:name="body">
	:
</span>

の内部を見てみる。このspanタグで囲まれた部分がlayout.htmlの

<span m:inject="s:insert" m:name="body"/>

の部分を置き換えるわけだね。で、最初に出てくるのが

<span m:inject="h:messages" m:globalOnly="true" m:class="error"/>

これは

<h:messages globalOnly="true" class="error"/>

といったJSFのエラーメッセージ用のタグになるのでしょう。詳細はJSF本で確認する。ここからが本番。最初はEmployeeNo欄の定義。

<tr>
    <td class="label">EmployeeNo</td>
    <td><input type="text" id="empno"
            m:value="#{employeeSearchDto.empno}"
            class="right">
            <span m:inject="s:validator" m:binding="#{empnoRangeValidator}"/>
        </input>
        <span m:inject="h:message" m:for="empno" m:class="error"/>
    </td>
</tr>

ポイントはinputタグの

m:value="#{employeeSearchDto.empno}"

かな。このemployeeSearchDtoはemployee.diconで次のように定義されている。

<component name="employeeSearchDto" class="examples.jsf.dto.EmployeeSearchDto" instance="session"/>

instance="session"なので、sessionスコープで管理されるインスタンスとなる。このEmployeeSearchDtoクラスの中身はというと、プロパティ + setter/getterメソッド + toString()で構成された、いわゆるPOJOJSFで言えばmanaged-beanに相当するんだろうな。きっと。上の場合empnoはプロパティ名を表していて

  • ページ送信時、この欄に入力された内容をsetEmpno()経由でemployeeSearchDtoへ設定する。このときgetParameter()で取得した値(String型)を設定先のプロパティの型に合わせて自動的に型変換もしてくれる。
  • ページ表示時、getEmpno()の結果をこの欄に設定する

といったことをしてくれる。これすごく便利だね。これだけでも使う価値はあると思う(オーバーかな)。

このINPUTタグにはもうひとつ別なタグが含まれている。

<span m:inject="s:validator" m:binding="#{empnoRangeValidator}"/>

これは入力値の検証(validation)ですね。対象はこれを囲んでいるid="empno"と名付けられたフィールドの入力値。検証するのはbindingで指定されているempnoRangeValidator。これはexamples/jsf/dicon/allvalidator.diconで以下のように定義されている。

<component name="empnoRangeValidator" class="javax.faces.validator.LongRangeValidator">
	<property name="maximum">10000</property>
</component>

このLongRangeValidatorはJSF標準のvalidatorで整数値の範囲をチェックするもの。セッターインジェクションで、プロパティmaximumに10000をセットしたものを生成する。JSFだと次のような感じかな。

<f:validateLongRange maximum="10000"/>

つまり「整数値で4桁未満ならOK」にしたい、とうことでしょう。NGだったらどうする?当然エラーメッセージ出すよね。ということで以下のタグ。

<span m:inject="h:message" m:for="empno" m:class="error"/>

これもこんな↓感じかな。

<h:message for="empno" class="error"/>

for属性で指定してされている"empno"は、このEmployeeNoを入力するinputタグのidで指定されたものと同じ。つまりこのmessageタグはEmployeeNo用のもの。なるほど。このあたりはJSFの知識も必要になるんだね。当たり前だけど(苦笑。