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"が表示される。
最後はボタンの定義だけど、長くなったので次回にする(汗。