SAStruts/Action/urlPattern

SAStruts/Action/urlPattern

urlPattern というパラメータを使うと、クラス名やメソッド名を無視して任意の URL で対象のメソッドを呼び出すことができる。

任意の URL を任意のメソッドへマッピングする

特定の URL を特定のメソッドへ引込たい時もある。 その時はメソッドに urlPattern のパラメータを与える

こうするとActionまでは規約にしたがってマッピングされるが、 その先はメソッド名ではなくurlPatternが合致したメソッドが選択される。

@Execute(urlPattern="hohoho")
public String hoge(){
    return "piyo.jsp";
}

複数のURLを1個のメソッドにマッピングする

複数のURLを1個のメソッドにマッピングしたい場合もある

@Execute(urlPattern="hohoho")
public String hoge(){
    return "piyo.jsp";
}
@Execute(urlPattern="pipipi")
public String piyo(){
    return hoge();
}

2個作って片方に横流しすればよい

REST的なURLマッピング

Actionに対して?に続き&でズラズラ書いていくパラメータの渡し方もあるが、スラッシュで区切って渡したほうがREST的で美しい。 このように通常と違うパラメータの渡し方をしたい。

urlPattern は引数有りの場合もマッピングできる

class HogeAction{
    public String fuga;
    @Execute(urlPattern="hohoho/{fuga}")
    public String piyo(){
        fuga = fuga + "aaaa";
        return "fuga.jsp";
    }
}

メンバにfugaを作りアノテーションの urlPattern で、このようにメンバをカッコで括って指定する。

@Execute(urlPattern="hohoho/{fuga}")

そうすると、下記のような URL でアクセスした場合に fuga12345 がセットされる。

http://aaa/bbb/ccc/hoge/hohoho/12345

今の場合actionクラスに public のfugaというフィールドを作っているので fuga で受けているが、 クラスに ActionForm を指定していた場合、そちらが優先的に使われて fuga は無視されるので注意。

SAStruts/入力チェック にも書いたがこのパラメータに非アスキー文字を入れた場合イロイロちゃんと動作しない。 なのでここの部分は数値にとどめておくのが安全でわかりやすい。

命名規約とまったく違うURLを使いたい

ここまでくると SAStrtus のメリットがかなり削がれてしまうが、どうしてもやりたい場合

一番根本の IndexAction に、このように実装すれば完全に任意のURLを目的の Action に渡すことができる。

@Execute(validator = false, urlPattern="ho-ge/pi-yo/fu-ga")
public String index(){
    return "hoge/piyo/fuga";
}

パラメータのセパレータ

urlPattern では URL の意味の切れ目として使うセパレータはスラッシュを使うことが前提になっている。

{hoge}/{piyo}/{fuga}

内部実装の関係で、スラッシュ以外のセパレータでは、パラメータの切れ目を認識することができない。

拡張子を持つ URL の Action へのマッピング

SAStruts の標準設定として拡張子を持つ URL のアクセスは Action へはルーティングされず静的ファイルとして処理される。

これを認識させたい場合は、ルーティングファイルタを新しく書いて、web.xml のマッピングを記述することになる。

しかし、実用性の面でこれが問題になることは殆どない。

java/sastruts/action/urlpattern/start.txt · 最終更新: 2020-09-21 18:31 by ore