actionとforward周り
最近電波を垂れ流してばかりで、まともな検証をしてなかったのですが、
勉強のためにチュートリアルとか最近のissueを見ているうちに、気づいたことを挙げます。
仕様and/or既出かもしれないけど、とりあえず。
パスを分割したときの、実行メソッドの選択
/japan/tokyo/
というパスにアクセスされたときに、
action.JapanAction#tokyo()
と、
action.japan.TokyoAction#index()
という2つの実行メソッドがあるとき、 どちらが呼ばれるか。
→JapanAction#tokyo()
のほうでした。
実務上は、ある階層のアクションクラスと同名のサブパッケージを作るべきではなさそうに思うので、ほんの好奇心で調べました。これはこういうものだと知っておく程度で十分ですね。
上位パスへの戻り
SAStrutsでは実行メソッドの戻り値で遷移先を指定します。このとき、上位パスへ遷移したい場合にどうすればよいでしょうか。
たとえば、チュートリアルでEmployeeAction
にbackToTop()
という実行メソッドを作ります。これがコールされたときに、チュートリアルのトップページに戻りたいとします。
return "/";
と書いておき、/sa-struts-tutorial/employee/backToTop/
を呼び出したところ、action.IndexAction
が呼び出されて、トップページが表示されます。ですが、URLは/sa-struts-tutorial/employee/backToTop/
のままです(forwardなので当然にそうなる)。
これだと、引き続いて「足し算」を実行しようとすると、足し算のリンクが相対パス指定(add/
)なので、/sa-struts-tutorial/employee/backToTop/add/
にアクセスしようとして404エラーになります。そのため、このようにするなら、トップページでは、今の
<li><a href="add/">足し算</a></li>
のような相対パスではなくて
<li><a href="/sa-struts-tutorial/add/">足し算</a></li>
のように絶対パスで指定する必要があります。(多分・・・)