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で。