HTMLエスケープ
入力されたURLをリンクで表示したいから、taglibを作ったのは
http://d.hatena.ne.jp/n-kizashi/20080805#1217947846
で書いたとおりである。これはJSPで表示するときの話だったけど、同じようなことを、AjaxでJsonでのやりとりでしたかった。つまりActionでエスケープ処理をする必要がある。
つまり、Action上で、
- HTMLエスケープをしてから、
- URLをリンクにおきかえる
ということが必要になる。
当初は、何も考えず、またエスケープも自前でやるのはあほらしかったので、Commons Langを使って、
str = StringEscapeUtils.escapeHtml(str);
return HtmlUtil.url2link(str)
としていた(HtmlUtilは自作クラスです)。しかしこうすると、
http://hogehoge/foo/barああああ
という文字列の場合、変換したら「ああああ」までリンクに含まれてしまう。これはなんかイヤだ。
よくよくみると StringEscapeUtils.escapeHtml(str) は、日本語もエスケープしてしまうのだ。この場合、「ああああ」と絶対参照に変換されてしまう。そのあと、url2link がかまされるのでまだURL文字列だと認識され、リンク化されてしまうのだ。
日本語はそっとしてほしいのだ。かといって、自前でHTMLエスケープを作るのもいやだなぁと思っていたら、SAStrutsのtaglibにある Functionクラスのescapeメソッドがstaticでpublicになっているのを発見!(そして、そういやこのブログでひがさんとそういうやりとりをしたのを思い出した→http://d.hatena.ne.jp/n-kizashi/20080807#c1218157936)
で、解決。