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の設計を行なう時点でしっかりと頭に入れておかないと
実装時に気付いて慌てることになる(というか、なった)。