August 8, 2008

Tomcat 6.0.18 重大な変更

2008年7月31日にリリースされた Apache Tomcat の最新バージョン 6.0.18 ですが、JSP の処理系である Jasper にこんな変更が。

Changelog
にこのような記載があります。

45015: You can't use an unescaped quote if you quote the value with that character.

これにより、カスタムタグの属性値に Runtime Expression を埋め込んだ際に、式の中に "" を記述する場合はエスケープが必要になりました。

つまり、従来は

<t:tag value="<%= request.getAttribute("name")%>" />

とか書けたのに、

<t:tag value="<%= request.getAttribute(\"name\")%>" />

と書かなくてはならない状況になってしまったのです。

今まで動作していたのに、Tomcat のバージョンを上げたら動かなくなるアプリケーションも少なくないでしょう。


Tomcat 開発プロジェクトは、たまーに、こういうことをしますね。
現実論・実用性よりも、下位互換性を崩してでも理想論・あくまで仕様としての正しさを追い求めるというか。

setCharacterEncoding() の時もそうでした。

商用のアプリケーションサーバ製品ではこのようなことはしないでしょう。


内部的に Tomcat や Tomcat と同じ実装を使う JBoss や Glassfish も、次回以降のバージョンは要注意ですね。


追記:
動いていた方がオカシイという声もいただきますが、それは正論ふりかざしているだけです。今まで動いていたものが動かなくなるのは、現場をあまりに無視した行為です。setCharacterEncoding()の時もそれで大ブーイングだったわけで。

さらに追記:
システムプロパティ org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING で挙動を元に戻す設定ができるようになっているとのことです。(takayoshiさんよりコメント欄にて情報をいただきました。ありがとうございます)
setCharacterEncoding()の時もそうでしたが、Reference Implementationにも使われる実装ということで仕様に忠実でなければという立場と、現場でも利用されることを意識しなければならない立場の板挟み感が伝わってきます(笑)

3 コメント:

Anonymous said...

システムプロパティ org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING で挙動を元に戻す設定ができるようになっているので、妥当な修正でしょう。

takayoshi said...

あ、anonで投稿しちゃった。

liebejudith said...

お、ねこぴありがとう。
従来の動きに戻すパスが用意されていたのね。
setCharacterEncoding()の時みたいに(笑)

Post a Comment