SAStrutsのフォワード用URLにどうしても"."を入れたい場合

SAStrutsで別のアクションにフォワードする場合、URLにクエリーを付けることもできますが*1、こういうURLだと動作しませんでした。

return "/foo?num=1234.56";

理由は、org.seasar.struts.config.S2ActionMapping#createForward(String, boolean)で、"."が含まれるURLはJSPと見なされて、頭に"/WEB-INF/view"が付いたURLに変換されるため。

S2ActionMappingをそのまま使う場合は、以下の方法で回避可能。

対策1. "."を"%2e"に置換する。

URLデコード不要で特に問題なく使えました。

対策2. requestのParameterMapに項目追加。

SAStrutsで管理されてるrequestのgetParameterMap()は変更可能なようなので、クエリーの代わりにパラメータをput。
パラメータをログ出力するのとかは面倒。

対策3. Struts形式のURLにして":"を含める。

":"があるとURLが一切変換されなくなるので、自前でS2ActionMapping#createRoutingPath(String)を呼んでURLを変換した後、クエリーとかフラグメントとして適当に":"を追加。
動くけど汚い。

対策4. 適当な文字に置換して、フォワード先で戻す。

対策1で十分。

結論

なるべくなら、ちゃんとActionFormでなんとかした方が良さそう。
どうしようもないときは1か2で。

*1:ちゃんとフォワード先でparameterMapにも格納されてる