Employee Management4-(3)

ではemployeeList.htmlの画面組み立てを見ていく。ポイントはforEachタグを使った繰り返しかな。

<span m:inject="s:forEach"
    m:items="#{employeeDtoList}"
    m:var="e"
    m:varIndex="i"></span>
  • items属性:繰り返す対象
  • var属性:個々の要素にアクセスする名前
  • varIndex属性:ここの要素を表すインデックス名

この場合はemployeeDtoList(初期化処理で作成されたテーブルEMPの検索結果)の各要素をeとし、それが何番目の要素かはiで表す、ということになる。なるほど。で、実際に繰り返されるのはこのspanタグにはさまれたtrタグ。

<tr class="evenRow" m:class="#{i % 2 == 0 ? 'evenRow' : 'oddRow'}">
    <td class="right"><span m:value="#{e.empno}">7369</span></td>
    <td><span m:value="#{e.ename}">SMITH</span></td>
    <td><span m:value="#{e.job}">CLERK</span></td>
    <td class="right"><span m:value="#{e.mgr}">7902</span></td>
    <td><span m:value="#{e.hiredate}">1980/12/07</span></td>
    <td class="right"><span m:value="#{e.sal}">800</span></td>
    <td class="right"><span m:value="#{e.comm}"/></td>
    <td><span m:value="#{e.dname}">RESEARCH</span></td>
    <td><a href="employeeEdit.html" m:action="#{employeeListAction.goNext}">Edit
            <span m:inject="f:param" m:name="empno" m:value="#{e.empno}"/>
            <span m:inject="f:param" m:name="processMode" m:value="2"/>
        </a>
        <a href="employeeConfirm.html" m:action="#{employeeListAction.goNext}">Delete
            <span m:inject="f:param" m:name="empno" m:value="#{e.empno}"/>
            <span m:inject="f:param" m:name="processMode" m:value="3"/>
        </a>
        <a href="employeeConfirm.html" m:action="#{employeeListAction.goNext}">Inquire
            <span m:inject="f:param" m:name="empno" m:value="#{e.empno}"/>
            <span m:inject="f:param" m:name="processMode" m:value="4"/>
        </a>
    </td>
</tr>
</span>

trタグのm:classが素敵w。

<tr class="evenRow" m:class="#{i % 2 == 0 ? 'evenRow' : 'oddRow'}">

要は背景色を偶数行/奇数行で変えるためiからCSSのclassを求めているわけだけど、式が使えるんだね。まぁJSPでも同じことできるけど、余分な記号が入らないだけシンプル。

tdタグはこれといって目立った点はないかな。強いて言えば、先にforEachタグで宣言したeを使っていることくらいか(7369はプレビュー用ね)。

<td class="right"><span m:value="#{e.empno}">7369</span></td>

そして各行の右端には"Edit","Delete","Inquire"のリンク。セットするパラメータが違うだけで、基本的には同じ。以下はEdit用。

<a href="employeeEdit.html" m:action="#{employeeListAction.goNext}">Edit
    <span m:inject="f:param" m:name="empno" m:value="#{e.empno}"/>
    <span m:inject="f:param" m:name="processMode" m:value="2"/>
</a>

まずhrefはプレビュー用だからパス。action属性で指定されたメソッドの戻り値で遷移先が決まるのは他と同じ。このemployeeListActionはexamples.jsf.action.impl.EmployeeListActionImplのインスタンスでrequestスコープ、というのはemployee.diconに書いてある。

<component name="employeeListAction" class="examples.jsf.action.impl.EmployeeListActionImpl" instance="request">
	<aspect>actionInterceptorChain</aspect>
</component>

定義されてるプロパティは...結構あるな。

public class EmployeeListActionImpl implements EmployeeListAction {
    private int processMode;
    private ProcessModeDto processModeDto;
    private Integer empno;
    private EmployeeLogic employeeLogic;
    private EmployeeDto employeeDto;
                :
}

でもprocessModeDto, employeeLogic, employeeDtoは既出だからいいね。残りはprocessMode, empno。これはaタグの子タグでとして指定されたf:paramタグのパラメータ名に一致する。そしてsetterメソッドが用意されているので、S2JSFがMethodBindingで指定したgoNext()を実行する前にパラメータ値をセットしてくれる。なるほど。

それじゃgoNext()はどうなっているかというと、そのprocessModeを使って遷移先を決定するわけね。

public String goNext() {
	processModeDto.setProcessMode(processMode);
	switch (processModeDto.getProcessMode()) {
		case Constants.UPDATE_MODE :
			return "employeeEdit";
		default :
			employeeDto = employeeLogic.getEmployeeDto(empno);
			return "employeeConfirm";
	}
}

processModeDtoに選択されたモードをセットして、

  • UPDATE_MODE(Edit)のときは/employee/employeeEdit.html(=employeeEdit)
  • それ以外は/employee/employeeConfirm.html(=employeeConfirm)

へ遷移させる。getEmployeeDto()も既出なのでパス。

ここから先はレコード追加処理(CREATE_MODE)で見たような気もするけど、もう一度見てみることにする。