Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

Tomcat で JSP が動かない

JSP にアクセスしようとしたら(コンパイルもされずに:表示までの時間に注意)Tomcat からエラーコード 500 (Internal Server Error) が返ってくる。メッセージは次のような感じ。

 :
org.apache.jasper.JasperException: ????/WEB-INF/web.xml?XML?????: (? 11, ? 16)
 :
org.xml.sax.SAXParseException: The prefix "xsi" for attribute "xsi:schemaLocation"
 associated with an element type "web-app" is not bound.
 : 

このような場合、web.xml の web-app 要素をチェック。

<web-app
	xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsl="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
	http://java.sun.com/xml/ns/j2ee/web-app_2_4_xsd"
	version="2.4">

この部分を、強引だとは思うがこうしてしまう。

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

Servlet だけ動かす場合には、前者のままでも構わない(というか、DOCTYPE も無しで とだけしてしまえば OK)なのだが、JSP を使う場合はそれではダメらしい。

エラーの原因はよく分からない。xsi は "XML Schema Instance" の acronym ということは分かったけど内容についてはさっぱり。 XML を勉強する必要がありそうだ……。

「強引だ」というのは、Tomcat5 は Servlet API 2.4 に準拠している(というかそもそも実装参照じゃなかったっけ)のだけれど、DTDServlet API 2.3 のものを指しているから。