Employee Management1-(4)
えっと、どこまで行った?あーEmployeeSearchInitActionImplの前準備までね。そうすると、これでemployeeSearch.htmlのhtmlタグで指定したactionの部分が起動されるわけ。
<html xmlns:m="http://www.seasar.org/maya" m:action="#{employeeSearchInitAction.initialize}" m:extends="/WEB-INF/layout/layout.html">
実際に動くのはEmployeeSearchInitActionImpl#initialize()だよ。
public String initialize() { departmentDtoList = employeeLogic.getAllDepartments(); return null; }
このemployeeLogicは先に自動セットされたもの。実際に呼び出されるのはEmployeeLogicImpl#getAllDepartments()。
public List getAllDepartments() { return departmentDtoDao.getAllDepartments(); }
そこからさらにDepartmentDtoDao.getAllDepartments()を呼び出す。
public interface DepartmentDtoDao { public Class BEAN = DepartmentDto.class; public List getAllDepartments(); public String getDname_ARGS = "depno"; public String getDname(Integer deptno); }
おっとこれはインタフェースで実装クラスを作ってない。getAllDepartments()の内容を含めS2Daoが自動生成してくれるんでしょう。このメソッドに対するSQL文は、SQLファイルとして定義されていません。でもコンソールには
DEBUG 2005-05-14 12:59:27,265 [http-8080-Processor24] SELECT DEPT.deptno, DEPT.dname, DEPT.loc, DEPT.versionno FROM DEPT
といったログが出てるので単純に全カラム/全レコード取得して、それをDepartmentDtoを要素とするListオブジェクトとして返す、というものなんでしょう。最初は"getAll" + "XXX" という具合に、getAllがキーワードになっているかと思ったがそういうことではないようだ。そのあたりのルールも知りたいけど、ソース追っかけるのは大変だな。
ま、それは置いといて。これでinitialize()は終わったけど、このEmployeeSearchInitActionImplにはinitialize()でセットしたプロパティdepartmentDtoListに対するgetterメソッドとしてgetDepartmentDtoListがあるので、このプロパティが自動的にrequestスコープの属性として保管される。あーこれで初期化処理は終了。長かったよ、ママン(笑。
それじゃemployeeSearch.htmlの続きを見てみましょう。
<span m:inject="f:param" m:name="layoutTitle" m:value="Employee Management"/> <span m:inject="s:insert" m:name="body"> : </span>
最初のspanはこのemployeeSearch.htmlが継承しているというか、上書きするlayout.htmlの
<title m:value="#{layoutTitle}"/>
にセットする値の定義。問題は次のbodyのところ。これは処理結果を入れるとこだけど、基本的にはEMPテーブルのカラムに対応したinputの定義なんだけど、deptnoはコンボボックスになっている。
<select id="deptno" m:value="#{employeeSearchDto.deptno}" m:items="#{departmentDtoList}" m:itemValue="deptno" m:itemLabel="dname" m:nullLabel="Please select"> <option value="">Please select</option> <option value="10">ACCOUNTING</option> <option value="20">RESEARCH</option> <option value="30">SALES</option> <option value="40">OPERATIONS</option> </select>
employeeSearchDto.deptnoはあとでやるとして、departmentDtoListは要チェック。これはEmployeeSearchInitActionImpl#initialize()終了後、自動的にrequestスコープに格納されたパラメータだね。これがコンボボックスの選択肢として使われる。つまりdepartmentDtoListに格納されたDepartmentDtoオブジェクトのdnameが選択肢で、deptnoが選択されたときサーバへ渡される値、ということだね。うーん。だけどさ、このdepartmentDtoListに格納されている要素がDepartmentDtoだということをどうやって調べているんだろう。不思議だ。ちなみにoptionの部分はプレビュー用で実行時は無視される。
2005/5/18追記
t-uchimaさんからコメント。なるほど。確かにitemValue/itemLabelで指定されたプロパティに対応するgetterメソッドがあればリフレクションでアクセッサメソッド取得、プロパティの値を取り出しができますね。だから相手がDepartmentDtoだと言う事を知らなくてもいいわけですね。
一応これで初期画面表示までが終わった。長かった。でもまだまだあるぞ(苦笑。