それでは/WEB-INF/urlrewrite.xmlに記述する内容について見ていこう。以下はStrutsの「アクション名.do」を「アクション名.html」にマッピングする場合の例だ。

<urlrewrite>
   <rule>
       <from>(.*)\.html</from>
       <to type="forward">$1.do</to>
   </rule>
</urlrewrite>

このように要素配下に変換ルールを記述していく。要素はマッチするURLのパターンで、正規表現で指定する(オプションでワイルドカード方式で指定することもできる)。要素は変換後のURLで、fromでマッチした正規表現のグループ(カッコで囲まれた部分にマッチした文字列)を$0、$1、$2などで参照することができる。また、要素のforward属性では変換後のURLにフォワード(forward)するか、リダイレクト(redirect)するかを指定する。

要素を使用することで、response.encodeURL()を経由するURLを任意のURLに変換して出力することが可能だ。

<urlrewrite>
   <outbound-rule>
       <from>(.*)\.do</from>
       <to>$1.html</to>
   </outbound-rule>
</urlrewrite>

これによって

<!-- 修正前 -->
<a href="login.do">ログイン画面へ</a>
<!-- 修正後 -->
<a href="<%= response.encodeURL("login.do") %>">ログイン画面へ</a>

実はStrutsのアクションの拡張子を変更するだけであれば、Url Rewrite Filterを使わなくてもweb.xmlでActionServletのマッピングを変更するだけでも対応可能だ。しかしUrl Rewrite ilterはより複雑、かつ柔軟なマッピングを行うことができる。たとえばパラメータとしてユーザIDを受け取りユーザの情報を表示するアクションがあったとしよう。通常のStrutsアプリケーションでは以下のようなURLになるはずだ。

userInfo.do?userId=ユーザID

これを次のようなURLにマッピングしてみよう。

userInfo/ユーザID

ルール定義は以下のようになる。

<rule>
    <from>userInfo/(.*)$</from>
    <to type="forward">userInfo.do?userId=$1</to>
</rule>

もちろんこれはルール定義の一例でしかないが、工夫次第で様々な変換が可能であることがおわかりいただけたのではないかと思う。