Employee Management3-(3)

/employee/employeeEdit.htmlの初期化メソッドが終わったので続きを見ていく。構造的には/employee/employeeSearch.htmlと同じだね。と、思ったらいきなりひっかかる。

<span m:value="Create"
	m:rendered="#{processModeDto.processMode == 1}"
	m:class="display" class="notdisplay">
	Create
</span>

うーん。なんだろ。これ。class属性が2つもあるし。renderedって何?ってぐぐってみたらSeasar-user MLで参考になるpostを発見。なるほど。一種の条件分岐か。value/renderedの両方と、renderedのみの場合があるのね。

<span m:value="値1" m:rendered="条件式1">値2</span>
<span m:rendered="条件式2">値3</span>

上の場合、このspanタグの評価結果は

  • 条件式1がtrueなら値1。falseなら何も返さない。値2はプレビュー用。
  • 条件式2がtrueなら値3。falseなら何も返さない。値3プレビューでも使われる。

となる。値3にはまた別なspanタグを書いたりしてネストすることもできる。

ということで、最初のspanタグはprocessModeDto.processMode == 1ならvalue属性の"Create"になる。spanタグで囲まれている方の"Create"はプレビュー用。同じ"Create"だからちょっとわかりにくい。そうなるとこのspanのm:classはrendered = true(つまりS2JSF環境で実行して条件が成立したとき)使われるCSSのclassで、ただのclass(notdisplay)はプレビュー用のもの、という解釈か。条件式の中身はいいね。processModeDtoはこっちで見たように、sessionで管理されている処理状態管理用のインスタンス。"1"は何かというとexamples.jsf.common.Constantsで定義されているCREATE_MODEのことだろうね。だからこのspanタグの意味は「現在CREATE_MODEなら"Create"」でしょう。しかしここで"1"ってリテラルをベタ書きするのもどうかと思うけどなぁ~。

まぁそれは置いといて、次の

<span m:value="Edit"
    m:rendered="#{processModeDto.processMode == 2}">
    Edit
</span>

も同じ考えだね。"2"はexamples.jsf.common.ConstantsのUPDATE_MODEの値でしょう。次に出てくるのはhidden。

<input type="hidden" m:value="#{employeeDto.versionNo}"
    m:rendered="#{processModeDto.processMode == 2}"/>
<input type="hidden" m:value="#{employeeDto.empno}"
    m:rendered="#{processModeDto.processMode == 2}"/>

UPDATE_MODEの時は、これらの値をhiddenで保持する。実際の生成例は次のような感じ。

<input type="hidden" id="_id199:_id201" name="_id199:_id201" value="33"/>
<input type="hidden" id="_id199:_id203" name="_id199:_id203" value="7369"/>

画面上versionNo/empnoは表示しないけど、これがわからないと更新できなくなるからだろうね。でもprocessMode == 1というか、CREATE_MODEの時は、このhiddenタグは生成されない。spanタグのrenderedとちょっと違い、条件式が成立しなけばinputタグ自体生成されないんだね。

で、次がEmployeeNo(主キーempno)用のフィールド。

<td class="label">EmployeeNo</td>
<td>
    <input id="empno" type="text"
        m:value="#{employeeDto.empno}"
        m:class="display right"
        class="notdisplay"
        m:required="true"
        m:rendered="#{processModeDto.processMode == 1}"/>
    <span m:inject="h:message" m:for="empno" m:class="error"
        m:rendered="#{processModeDto.processMode == 1}"/>
    <div class="right" m:rendered="#{processModeDto.processMode == 2}">
        <span m:value="#{employeeDto.empno}">7788</span>
    </div>
</td>

このinputタグはrenderedでCREATE_MODEの時だけ生成されるようになっている。そのときは

  • value属性でemployeeDto.empnoとbindされる
  • required属性がtrueだから、多分入力必須なんだろうな

ということがわかる。次のmessageも同様にCREATE_MODEの時だけ生成される。一方UPDATE_MODEで生成されるのは、その後のdivタグの部分。なるほどrenderedの条件式がtrue、つまりUPDATE_MODEのときだけ、内部のspanタグが評価される。ただしプレビューのときは"7788"が固定で表示される。結局このtdタグ内部では

  • CREATE_MODE:入力欄生成。employeeDto.empnoとbind。
  • UPDATE_MODE:employeeDto.empnoの値を表示するだけ。
  • プレビュー時:7788を表示

という3つのケースを記述しているんだね。

つぎはEmployeeName。これもemployeeDto.enameとbind。

<td class="label">EmployeeName</td>
<td><input type="text" m:value="#{employeeDto.ename}" value="SCOTT"/></td>

もっともemployeeDtoは、こっちで見たように、

  • CREATE_MODE:各プロパティには何もセットされていない(デフォルト値)
  • UPDATE_MODE:該当EMPレコードの内容

となっている。だから何かが表示されるのは、UPDATE_MODEのときだけ。プレビュー時は固定的に"SCOTT"が表示される。

最後はボタンの定義だけど、長くなったので次回にする(汗。