Employee Management3-(2)

/employee/employeeEdit.htmlもやっぱり初期化メソッドで始まるのね。

<html xmlns:m="http://www.seasar.org/maya"
    m:action="#{employeeEditInitAction.initialize}"
    m:extends="/WEB-INF/layout/layout.html">

このemployeeEditInitActionはemployee.diconでexamples.jsf.action.impl.EmployeeEditInitActionImplクラスのインスタンスで、requestスコープと宣言されている。

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

このクラスもいくつかのプロパティを持っている。

public class EmployeeEditInitActionImpl implements EmployeeEditInitAction {
	private EmployeeLogic employeeLogic;
	private Integer empno;
	private ProcessModeDto processModeDto;
	private EmployeeDto employeeDto;
	private List departmentDtoList;
				:
}

またEmployeeLogicですね。こっちで見たように、EmployeeLogicはテーブルEMPに対する操作を定義したインタフェースで、その実装クラスがEmployeeLogicImplで、そのインスタンスがここにセットされる。empnoは単なるプロパティでしょう。ProcessModeDtoは前に書いたように、プログラムの状態管理用。EmployeeDtoも前に見た。これはJSFのmanaged-bean的な役割を持つもの。最後はdepartmentDtoListはsetterメソッドがないから、EmployeeEditInitActionImpl生成時点では何も行われない。action属性で指定されたinitialize()の中でセットされることになる。そのinitialize()は次のようになっている。

public String initialize() {
    departmentDtoList = employeeLogic.getAllDepartments();
    if (processModeDto.getProcessMode() == Constants.UPDATE_MODE) {
        employeeDto = employeeLogic.getEmployeeDto(empno);
    }
    return null;
}

getAllDepartments()で何が行われるかはこっちで見た。つまりテーブルDEPTの全レコードを取得して、requestスコープで管理されるインスタンスにする(departmentDtoListにはgetterメソッドがあるから)。次のif文では、現在の状態がUPDATE_MODE(編集状態)ならempnoをキーにテーブルEMPを検索した結果をemployeeDtoへ取得する。これをHTMLファイルでValueBindingすることにより、値が自動的に画面表示される。でも今はCREATE_MODEだから検索は行われず、empnoは空っぽの状態で終わる。まぁこれからレコードを追加しようとしているんだから、画面の入力フィールドも空じゃないとへんだよね。

で、そのgetEmployeeDto()。employeeLogicというかEmployeeLogicImplでは

public EmployeeDto getEmployeeDto(Integer empno) {
    return employeeDtoDao.getEmployeeDto(empno);
}

と定義されている。employeeDtoDaoはこっちで見たように、テーブルEMPに関連付けられていて、getEmployeeDto()については以下のような定義があるだけ。

public String getEmployeeDto_ARGS = "empno";
public EmployeeDto getEmployeeDto(Integer empno);

ARGSアノテーションはgetEmployeeDto()メソッドの引数名をS2Daoに教えてるわけですね。で、このメソッドの呼び出しにより実行されるのはexamples/jsf/dao/EmployeeDtoDao_getEmployeeDto.sql。Daoと同じ場所(ディレクトリ)にあって、Daoのクラス名_メソッド名.sqlというネーミングルールに一致するからこれが使われる。中身は、

select empno,ename,job,mgr,hiredate,
sal,comm,e.deptno,e.versionno,d.dname
from emp e left outer join dept d on e.deptno = d.deptno
where
empno = /*empno*/7788

という感じで、ふつーのSQL文に見えるけど、/*empno*/はバインド変数コメントで、さっきのARGSアノテーションの名前と一致するから、getEmployeeDto()の引数で置換される。たとえばempno=8765だとすれば、

empno = /*empno*/7788

empno = 8765

になるわけだ。なるほど。でも上に書いたように、今はCREATE_MODEだからこの検索は実行されない。だからemployeeDtoは空っぽのまま。とりあえず初期化処理はここまで。