(続)web.xmlの要素の順番
http://d.hatena.ne.jp/muimy/20050514#p1
の続き。ちょっと整理。
少し昔の話題ですが、サーブレットAPI2.3→2.4になるときに、
web.xmlの構造がいくらか変わりました。大きく変わったのは、スキーマ(構造)の定義が、DTDからスキーマになったことです。
変わったメリットは、web.xml文書の文法をもちょっと細かく決めて定義できるということ。例えばこんなチェックがXMLのバリデータでできるようになりました。
-<servlet-name>はユニーク -<session-timeout>の子要素は数字だけ -<dispatcher>の子要素はREQUEST、FOWARD...などだけで、要素の出現回数は0〜"4"回
XMLのバリデータでチェックできるということは、つまり、APサーバを起動したり、サーバの検証ツールを実行とかしなくても、文法チェック機能のあるXMLエディタを使えば、編集しながら、その場でチェックが可能になるということです。
(まぁ、構造の定義は、W3CのXMLスキーマでなく、RELAX NGの方がよかったという話はおいておいて。。。)。
で、2.4でもう一つ変わったのが、
以下のweb.xmlは2.3では誤りです。だって、
<web-app> <servlet> <servlet-name>ServletA</servlet-name> <sevvlet-class>ServletA</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletA</servlet-name> <url-pattern>/servleta</url-pattern> </servlet-mapping> <servlet> <servlet-name>ServletB</servlet-name> <sevvlet-class>ServletB</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletB</servlet-name> <url-pattern>/servletb</url-pattern> </servlet-mapping> </web-app>
なのですが、この記述は2.4でもダメなようなのです。
<web-app> <servlet-mapping> <servlet-name>ServletA</servlet-name> <url-pattern>/servleta</url-pattern> </servlet-mapping> <servlet> <servlet-name>ServletA</servlet-name> <sevvlet-class>ServletA</servlet-class> </servlet> </web-app>
Tomcatの場合、起動時にエラーになります。
Caused by: java.lang.IllegalArgumentException: サーブレットマッピングは未知のサーブレット名 ServletA を指定しています
で、以下のことが疑問なのです。
「
の定義は、利用する 要素より後に書かないといけない」といったようなプチ仕様はどこかにあるのだろうか?
(というか、SPECを細かく読めば、きっと、このプチ仕様がどこかに書いてるような気がするんだけど、読み取れないので、知ってたら誰か教えてくださいみたいな感じです)
もしないとすれば、
アプリケーションサーバで、上のようなエラーになるのは、実装が仕様を満たしてないとも考えられるけど、それってTomcatだけ?それともWASやWebSphereもそうなの?
まぁ、そんな順番で書かないからいいっちゃいいんだけど。
5/29 追記:質問中
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=21266&forum=12&6
http://www.vc-net.ne.jp/~ytp/bbs/java/bbs23000.html
http://www.mail-archive.com/tomcat-user@jakarta.apache.org/msg153150.html
5/29 追記:APサーバによる違い
×Tomcat 5.5.9
×Jetty 5.1.3
○Weblogic8.1J SP4 ←動いた!?