Employee Management3-(5)

/employee/employeeConfirm.htmlを見ていくことにする。最初はこれ。

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

これまでのパターンにあてはめるとexamples.jsf.action.impl.EmployeeConfirmInitActionImplだろうな、と思ってemployee.diconをみたらその通り。

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

プロパティはというと、これも見たね。

public class EmployeeConfirmInitActionImpl implements EmployeeConfirmInitAction {
	private EmployeeLogic employeeLogic;
	private EmployeeDto employeeDto;
			:
}

EmployeeLogicはテーブルEMPを操作するインタフェース定義で、その実装クラス(EmployeeLogicImp)がセットされる。EmployeeDtoはManaged-beanのような役割を持っている。このemployeeConfirm.htmlの場合、前画面のemployeeEdit.htmlの各フィールドでValueBindingされた結果が入る。

で、肝心のinitialize()は次のようになっている。

public String initialize() {
	if (employeeDto.getDeptno() != null) {
		String dname = employeeLogic.getDname(employeeDto.getDeptno());
		employeeDto.setDname(dname);
	}
	return null;
}

「deptnoが入力されてた場合は、それに対応するdnameを取得しろ」ということか。まぁぼちぼち見ることにする。まずemployeeDto.getDeptno()で返されるのは、employee.htmlのDepartmentコンボボックスで選択された値。それに対応する選択肢の名称(つまりdname)も一緒にValueBindingで取り出せればこの処理は不要なんだけど、ValueBindingは1つしかできないからここで取得するようにしているわけだ。

さてこのgetDeptno()メソッドはEmployeeLogicImplで次のようになっている。

public String getDname(Integer deptno) {
    return departmentDtoDao.getDname(deptno);
}

departmentDtoDaoは前に見たけど、テーブルDEPTに関連付けられたS2Daoの定義。そこにこのgetDname()に関する記述もある。

public interface DepartmentDtoDao {
	public Class BEAN = DepartmentDto.class;
	public List getAllDepartments();
	public String getDname_ARGS = "depno";
	public String getDname(Integer deptno);
}

ということは、このメソッドで実行されるSQLはexamples/jsf/dao/DepartmentDto_getDname.sqlにあるでしょ?と思ってみたらピンポン。確かにそういうファイルがありました(だってDaoと同じ場所(ディレクトリ)にあって、Daoのクラス名_メソッド名.sqlというネーミングルールに一致)。中身は次のようになっている。

select dname
from dept
where deptno = /*deptno*/10

これが実行されるときは/*deptno*/10の部分が、引数deptnoに置換される。10はこのSQLOracleで言えばSQL*Plusみたいなツールで実行するとき使われる値。その際/*deptno*/はコメントとして無視される。ともかくS2Daoはこの2つをまとめて引数の値で置き換える。結果はStringで返される。主キーだから該当レコードは高々1件だもんね。これをemployeeDtoにセットして、準備完了。