[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 メーリングリストの案内