2007年7月2日月曜日

JSTL & web-app (servlet?) version

web-app_2_3.dtd までしか対応していない app server でテストを行うことが発生。
たいていの環境は web-app_2_4.xsd で動いていたし、NetBeans 5.5 の作る
web.xml もそうなっている。

次のように DTD 指定に書き換えるだけでよさそうと最初は思った。

<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'
'http://java.sun.com/dtd/web-app_2_3.dtd'>

動作させるうちにすぐに問題に気がついた。JSTL の c:forEach が効かないのだ。
なんというか、式がそのまま表示されるだけだ。

結果として taglib の宣言を sun.com/ のあとに jsp があるものからないものに
直して動作するようになった。

(A)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

(B)
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>

JSTL のページを斜め読みする限り (A) は JSTL 1.1, (B) は JSTL 1.0 の
uri でどうやら式言語の評価方法も異なるようだ。しかも、それがサーブレット
コンテナのバージョンに依存しているということのようである。

確か、以前 2.4 + 1.0 でエラーで悩まされてそのときに (A) の記述を見つけて
そのように直して解決した記憶がおぼろげながらある。逆 2.3 + 1.1 の場合
にはよりわかりにくい状況になるということだ。よく調べたらありそうだが、
JCTL の動作のトレース情報は簡単に出せるのだろうか...

使用している JCTL のライブラリ自体は 1.1 のままでこのような違いがでて
いるのも不思議な感じ。taglib 指定で動作を変え、コンテナの使い方まで
変えてくるのであれば、良くない組み合わせに警告を出してくれると
いいのだが... OpenSource は怖い。

0 件のコメント: