urlPattern の不思議でもないけど
urlPattern のマニュアルには以下の記述があります。
urlPattern要素(オプション)
urlPatternに一致するメソッドが呼び出されるようにします。デフォルトは、メソッド名になります。
URLがhttp://localhost:8080/sa-struts-tutorial/employee/edit/の場合、
URLからアクションのパス(http://localhost:8080/sa-struts-tutorial/employee/)を除き(edit/)
最後の/を取り除いた部分(edit)がパラメータ用のパスになります。パラメータ用のパスとurlPatternが一致したメソッドが呼び出されるので、今回の例だとedit()が呼び出されます。urlpatternに{パラメータ名}を指定することで、URLで{}に一致する部分をパラメータの値として取得できます。例えば、次のようにEmployeeAction#edit()が定義されているとします。
@Execute(urlPattern = "edit/{id}")
public String edit() {
...
}http://localhost:8080/sa-struts-tutorial/employee/edit/1にアクセスするとパラメータ用のパスは、edit/1になるので、idのパラメータに1が設定されて、 edit()が呼び出されます。
さていきなりですが sa-struts-tutorial の「条件(id=1)」を呼び出してやります。
URL は http://localhost:8080/sa-struts-tutorial/condition/1
なので、index が省略された形になっています。
べつに不思議ではありません。
@Execute(validator = false, urlPattern = "{id}")
public String index() {
return "index.jsp";
}
↓
@Execute(validator = false, urlPattern = "{id}")
public String somthing() {
return "index.jsp";
}
に書き換えて、
URL http://localhost:8080/sa-struts-tutorial/condition/something
にアクセスすると、
"id" is somthing.
という表示がされました。
最後の/を取り除いた部分(edit)がパラメータ用のパスになります。
とあるので、これも別に不思議じゃないです。
ところが index アクションで、これをやる場合は
@Execute(urlPattern = "{id}")
とアクション名を省略できます。
indexアクションを元に戻して、引数無しで URL にアクセスします。
ここからら不思議の始まりです。
@Execute(validator = false, urlPattern = "{id}")
public String index() {
return "index.jsp";
}
id にはなにが入っているでしょうか?
それともエラー(The requested resource (/sa-struts-tutorial/condition/) is not available.)になるでしょうか?
実は index の場合は id には null が入ります。
それ以外(先ほどの somethingなど)の場合は The requested resource is not available. になってしまいます。
恐らく index を特別扱いしているための副作用だと思いますが、これはパラメータが来たり、来なかったりするときに使えるんではと思いました。
実際に使ってみると、何も渡したくない場合は渡さないでURLを叩けるので使いやすくて便利です。
どこであっても urlPattern のパラメータの値が省略可能だったら、もっといいと思いました。