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だと言う事を知らなくてもいいわけですね。


一応これで初期画面表示までが終わった。長かった。でもまだまだあるぞ(苦笑。