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