Employee Management3-(1)

今日はemployeeSearch.htmlにある[create]ボタンを見ていく。

<input type="button" value="create"
    m:action="#{employeeSearchAction.goEditForCreate}"
    onclick="location.href='employeeEdit.html'"/>

S2JSFの環境では、このボタンを押したとき実行されるのはemployeeSearchAction.goEditForCreate。MethodBindingだね。これが返す値(String)で次の遷移先が決まる。一方onclickはプレビューのとき使われる定義。このemployeeSearchActionはEmployeeSearchActionImplのインスタンスで、requestスコープで管理されるようemployee.diconで定義されている。

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

そしてEmployeeSearchActionImplは以下のプロパティを持っている。

public class EmployeeSearchActionImpl implements EmployeeSearchAction {
	private EmployeeLogic employeeLogic;
	private EmployeeSearchDto employeeSearchDto;
	private ProcessModeDto processModeDto;
					:
}

このうちEmployeeLogicについては、こっちで見たのでパス。EmployeeSearchDtoもこっちで見た。これはsessionスコープで管理されているので、それがセットされる。各プロパティにはブラウザから入力された値がセットされている。ここでお初なのはProcessModeDto。これはemployee.diconでincludeしているexamples/jsf/dicon/processmode.diconにある。

<components>
	<component name="processModeDto" class="examples.jsf.dto.ProcessModeDto" instance="session"/>
</components>

でもProcessModeDtoって何のインタフェースも実装していないPOJOなんだよね。この場合S2リファレンスマニュアルに書いてある自動バインディングautoの条件をどれも満たしていないように見える。「プロパティが明示的に指定されている場合はそれに従います」が該当するのか?でもよくわからない。そもそもこれは自動バインディングじゃないとか?まぁでも

ProcessModeDto processModeDto = (ProcessModeDto)container.getComponent("processModeDto");

みたいなことをしているんだよね。きっと(汗。ともかくProcessModeDtoはプロパティとしてprocessModeがあるだけのクラス。そのインスタンスがsessionで管理されている。で、これらの準備が終わると最初に書いたgoEditForCreate()が実行される。

public String goEditForCreate() {
	processModeDto.setProcessMode(Constants.CREATE_MODE);
	return "employeeEdit";
}

Constants(examples.jsf.common.Constants)は処理の状態を表す定数を定義しただけのインタフェース。

public interface Constants {
	public int CREATE_MODE = 1;
	public int UPDATE_MODE = 2;
	public int DELETE_MODE = 3;
	public int REFER_MODE = 4;
}

public static finalを使わない定数定義だね。だけど何か違和感。この方法だと定数を使う側のクラスは、この(定数を定義した)インタフェースを実装するものと思っていたが、EmployeeSearchActionImplはそうなっていない。代わりに(?)importしている。diconファイルには、関連しそうなことは書かれていないからS2の機能じゃなさそうだし...。この方法は、初めて見ました(汗。

ともかくここで「現在CREATE_MODEだよ」という状態が記録され、最後に"employeeEdit"が返される。これが[create]ボタンのaction属性の値となるんだね。後はaction属性に(MethodBindingでなく)文字列を書いた場合と同じように、faces-config.xmlが参照され、遷移するページが決まる。実際faces-config.xmlを見てみると次は、/employee/employeeEdit.htmlだということがわかる。

<navigation-rule>
    <navigation-case>
        <from-outcome>employeeEdit</from-outcome>
        <to-view-id>/employee/employeeEdit.html</to-view-id>
    </navigation-case>
</navigation-rule>

じゃ、そっちを見てみましょう。