SAStrutsでのパラメーターの注意点
SAStrutsを久々に触ってハマった箇所をざっくりとメモ
とりあえずおさらい
IndexActionクラス
SAStrutsではactionパッケージの下に
作成するアプリのURLに対応するようにサブパッケージを作り、
その中にAbstructActionクラスから派生させたIndexActionクラスを配置する
action/IndexAction.java # "/"に対応
page1/IndexAction.java # "/page1/"に対応
page2/IndexAction.java # "/page2/"に対応
page1/chapter1/IndexAction.java # "/page1/chapter1/"に対応
各IndexActionクラスのメソッドは、
@Executeアノテーションを付記することでurlのサブディレクトリとなる。
ただしindex()のみは“/"でアクセス可能
メソッドを作る際の注意点
- Executeアノテーションを付けること
- publicで宣言
- 返り値はString型
@Execute(validator = false) public String index() { // "/" に対応 return "index.jsp"; } @Execute(urlPattern = "show/{userId}", input = "error.jsp") public String show() { // "/show" に対応 return "show.jsp"; } @Execute(urlPattern = "update/{userId}", input = "error.jsp") public String update() { // "/update" に対応 return "update.jsp"; }
@Executeアノテーションの引数でurlPatternを指定するとアクセスする際のパラメータを指定できる
@Resource @ActionForm protected IndexForm indexForm; @Execute(urlPattern = "show/{userId}", input = "error.jsp") // indexForm.userIdに自動的に値が入る public String show() { // "/show" に対応 〜〜〜 }
IndexFormについて
- IndexFormクラスはformパッケージ配下に作成しておく
- IndexFormクラスにはpublicなString型のメンバ変数"userId"を作成しておく
パラメーターの注意点
ここから今回の本題(昔悩んだのにすっかり失念していた)。
index()メソッドにパラメータを指定しないこと
package sample.action.hoge; 〜〜〜〜〜 〜〜〜〜〜 @Execute(urlPattern = "/{userId}" input="error.jsp") // <- こいつ!! public String index() { int uid = Integer.parseInt(indexForm.userId); 〜〜〜〜〜 return "index.jsp"; }
package sample.action.hoge.page1; 〜〜〜〜〜 〜〜〜〜〜 @Execute(validator = false) public String index() { 〜〜〜〜〜 return "index.jsp"; }
上記ソースの例では、
“/"と“/page1/"をURLとして設計している。
しかし/action/IndexActionクラスのindex()メソッドでは、
パラメータで“userId"を受け取るように指定されている。
このため“/page1/"にアクセスしても、
/action/IndexActionクラスのindex()メソッドで処理されてしまい、
/action/page1/IndexActionクラスへのリクエストは横取りされてしまう
よって意図した動きにはならない。
URLの設計を行なう時点でしっかりと頭に入れておかないと
実装時に気付いて慌てることになる(というか、なった)。