menu
書いてる野郎
orebike@gmail.com
urlPattern というパラメータを使うと、クラス名やメソッド名を無視して任意の URL で対象のメソッドを呼び出すことができる。
特定の URL を特定のメソッドへ引込たい時もある。 その時はメソッドに urlPattern のパラメータを与える
こうするとActionまでは規約にしたがってマッピングされるが、 その先はメソッド名ではなくurlPatternが合致したメソッドが選択される。
@Execute(urlPattern="hohoho") public String hoge(){ return "piyo.jsp"; }
複数のURLを1個のメソッドにマッピングしたい場合もある
@Execute(urlPattern="hohoho") public String hoge(){ return "piyo.jsp"; } @Execute(urlPattern="pipipi") public String piyo(){ return hoge(); }
2個作って片方に横流しすればよい
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 でアクセスした場合に fuga
に 12345
がセットされる。
http://aaa/bbb/ccc/hoge/hohoho/12345
今の場合actionクラスに public のfuga
というフィールドを作っているので fuga で受けているが、
クラスに ActionForm を指定していた場合、そちらが優先的に使われて fuga は無視されるので注意。
SAStruts/入力チェック にも書いたがこのパラメータに非アスキー文字を入れた場合イロイロちゃんと動作しない。 なのでここの部分は数値にとどめておくのが安全でわかりやすい。
ここまでくると 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}
内部実装の関係で、スラッシュ以外のセパレータでは、パラメータの切れ目を認識することができない。
SAStruts の標準設定として拡張子を持つ URL のアクセスは Action へはルーティングされず静的ファイルとして処理される。
これを認識させたい場合は、ルーティングファイルタを新しく書いて、web.xml のマッピングを記述することになる。
しかし、実用性の面でこれが問題になることは殆どない。