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は空っぽのまま。とりあえず初期化処理はここまで。