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";
}

http://localhost:8080/sa-struts-tutorial/condition/

id にはなにが入っているでしょうか?
それともエラー(The requested resource (/sa-struts-tutorial/condition/) is not available.)になるでしょうか?

実は index の場合は id には null が入ります。
それ以外(先ほどの somethingなど)の場合は The requested resource is not available. になってしまいます。

恐らく index を特別扱いしているための副作用だと思いますが、これはパラメータが来たり、来なかったりするときに使えるんではと思いました。
実際に使ってみると、何も渡したくない場合は渡さないでURLを叩けるので使いやすくて便利です。
どこであっても urlPattern のパラメータの値が省略可能だったら、もっといいと思いました。