Tomcat6で動作していたJSPでTomcat7では例外が投げられる事がある

先日Tomcat6で動作していたアプリケーションをTomacat7で動作確認した所、いくつか例外が発生したのでメモ。

現象

JSPを表示した際に「org.apache.jasper.JasperException」が発生する。
私が遭遇した現象は2つ

  • Attribute qualified names must be unique within an element
  • The JSP specification requires that an attribute name is preceded by whitespace
Attribute qualified names must be unique within an element

エラーメッセージにある通り、属性が重複している場合に発生する。

HTTPステータス 500 - /exception.jsp (line: 7, column: 61) Attribute qualified names must be unique within an element

type 例外レポート

メッセージ /exception.jsp (line: 7, column: 61) Attribute qualified names must be unique within an element

説明 The server encountered an internal error that prevented it from fulfilling this request.

例外

org.apache.jasper.JasperException: /exception.jsp (line: 7, column: 61) Attribute qualified names must be unique within an element
	org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42)
	org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:408)
	org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:89)
	org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:171)
	org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:153)
	org.apache.jasper.compiler.Parser.parseInclude(Parser.java:849)
	org.apache.jasper.compiler.Parser.parseStandardAction(Parser.java:1116)
	org.apache.jasper.compiler.Parser.parseElements(Parser.java:1451)
	org.apache.jasper.compiler.Parser.parse(Parser.java:138)
	org.apache.jasper.compiler.ParserController.doParse(ParserController.java:242)
	org.apache.jasper.compiler.ParserController.parse(ParserController.java:102)
	org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:198)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
  • サンプルコード
<%@ page contentType="text/html; charset=Shift_JIS" %>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=Windows-31J">
</head>
<body>
  <jsp:include page="include.jsp" flush="false" flush="false"/>
</body>
</html>
The JSP specification requires that an attribute name is preceded by whitespace

こちらもメッセージ通り。属性と属性の間にスペースがない場合に発生。

HTTPステータス 500 - /exception2.jsp (line: 7, column: 46) The JSP specification requires that an attribute name is preceded by whitespace

type 例外レポート

メッセージ /exception2.jsp (line: 7, column: 46) The JSP specification requires that an attribute name is preceded by whitespace

説明 The server encountered an internal error that prevented it from fulfilling this request.

例外

org.apache.jasper.JasperException: /exception2.jsp (line: 7, column: 46) The JSP specification requires that an attribute name is preceded by whitespace
	org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42)
	org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:408)
	org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:89)
	org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:164)
	org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:153)
	org.apache.jasper.compiler.Parser.parseInclude(Parser.java:849)
	org.apache.jasper.compiler.Parser.parseStandardAction(Parser.java:1116)
	org.apache.jasper.compiler.Parser.parseElements(Parser.java:1451)
	org.apache.jasper.compiler.Parser.parse(Parser.java:138)
	org.apache.jasper.compiler.ParserController.doParse(ParserController.java:242)
	org.apache.jasper.compiler.ParserController.parse(ParserController.java:102)
	org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:198)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
  • サンプルコード
<%@ page contentType="text/html; charset=Shift_JIS" %>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=Windows-31J">
</head>
<body>
  <jsp:include page="include.jsp"flush="false"/>
</body>
</html>

教訓

Tomcat7で色々な規約に準拠したみたいなので、その影響でしょうか。
ただ、今回の件は規約云々とかTomcat7云々じゃなくて、普段からしっかり書いとけ!という一言ですな。