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>
じゃ、そっちを見てみましょう。