[Seasar-user:17562] 【SAStruts】 urlPatternに使えない文字について

Kento SAWADA [E-MAIL ADDRESS DELETED]
2009年 5月 31日 (日) 20:28:06 JST


SAStruts関係者のみなさま

はじめまして、kentoと申します。

現在進行中のプロジェクトでSAStrutsを使わせていただいたのですが
urlPatternがらみで困ったことがありました。

たとえば、「/item/{name}」とアクセスされたときにnameで指定された
商品のページが表示されるとします。
ItemAction#index()でurlPatternに{name}と設定すれば実現できますが
以下の場合に問題がありました。

1) nameに「.」(ドット)が含まれている場合

RoutingFilterで、pathに「.」が含まれている場合にスキップする処理が
はいっているためItemAction#index()が呼び出されない。
URLエンコードしても、request.getServletPath()で得られるpathは
デコードされたものになってしまうため、同様。

2) nameに「 」(スペース)が含まれている場合

URLエンコード時にスペースは「+」に置換されますが、
request.getServletPath()では「+」をスペースに置換しないため
(Apache Tomcat 5.5.26にて。バグ?)
本来はスペースであるはずの部分が「+」になってしまう。
「%2B」が「+」にデコードされてしまうため、スペースなのか「+」なのか
区別できない。

今回のプロジェクトでは、リンク生成時にスペースを「%20」に
「.」を「%252E」(2重エンコード)に置換する処理をかけて
パラメータ取得時に「%2E」を「.」に置換する処理をかけています。

どうも美しくないので、以下のようにすることを提案いたします。

1) RequestUtil.getPath()が返すパスはデコードされていない状態とし
(RequestScopeを使えば可能?)RoutingFilter内ではそのまま処理する。
2) S2ExecuteConfig#getQueryString()内でパラメータをURLデコードする。

こうすると、「/」や「?」などもURLエンコードすることで
パスに埋め込むことができるので、URL設計が自由になると思うのですが
いかかでしょうか?

ご意見、ご指摘など、よろしくお願いいたします。



Seasar-user メーリングリストの案内