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云々じゃなくて、普段からしっかり書いとけ!という一言ですな。