web-dev-qa-db-ja.com

JSPエラー:無効な式が含まれています。式の解析に失敗しました

古いjspサイトをデバッグしようとしているので、Tomcat7とNetbeans IDE 7.2.1をWindows7を実行しているローカルマシンにインストールし、すべてをセットアップしました。しかし、実行すると、エラーが発生する:

重大:サーブレットjspのServlet.service()が例外org.Apache.jasper.JasperExceptionをスローしました:/pages/caselisting.jsp(行:133、列:35) "$ {case.patientmaxdate}"に無効な式が含まれています: javax.el.E​​LException:式の解析に失敗しました[$ {case.patientmaxdate}]

その行のコードは次のとおりです。

<td><c:out default="&nbsp;" escapeXml="false" value="${case.patientmaxdate}"/></td>

私はjspを初めて使用し、この古いサイトにいくつかの変更を加えようとしています。私はいくつかの調査を行い、Tomcat7がこのエラーに対していくつかの変更を加えたことを読みました。誰かが私を正しい方向に導いてくれれば幸いです。

ありがとう。

完全なスタックトレース:

重大:サーブレットjspのServlet.service()が例外org.Apache.jasper.JasperExceptionをスローしました:/pages/caselisting.jsp(行:133、列:35)「$ {case.patientmaxdate}」に無効な式が含まれています: javax.el.E​​LException:org.Apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.Java:42)atorg.Apache.jasper.compiler.ErrorDispatcher.dispatchで式[$ {case.patientmaxdate}]の解析に失敗しました(ErrorDispatcher.Java:408)at org.Apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.Java:199)at org.Apache.jasper.compiler.Validator $ ValidateVisitor.checkXmlAttributes(Validator.Java:1223)atorg。 Apache.jasper.compiler.Validator $ ValidateVisitor.visit(Validator.Java:875)at org.Apache.jasper.compiler.Node $ CustomTag.accept(Node.Java:1539)at org.Apache.jasper.compiler.Node $ Nodes.visit(Node.Java:2376)at org.Apache.jasper.compiler.Node $ Visitor.visitBody(Node.Java:2428)at org.Apache.jasper.compiler.Validator $ ValidateVisitor.visit(Validator.Java: 894)org.Apache.jでasper.compiler.Node $ CustomTag.accept(Node.Java:1539)at org.Apache.jasper.compiler.Node $ Nodes.visit(Node.Java:2376)at org.Apache.jasper.compiler.Node $ Visitor。 visitBody(Node.Java:2428)at org.Apache.jasper.compiler.Node $ Visitor.visit(Node.Java:2434)at org.Apache.jasper.compiler.Node $ Root.accept(Node.Java:475) org.Apache.jasper.compiler.Node $ Nodes.visit(Node.Java:2376)at org.Apache.jasper.compiler.Validator.validateExDirectives(Validator.Java:1795)at org.Apache.jasper.compiler.Compiler .generateJava(Compiler.Java:217)at org.Apache.jasper.compiler.Compiler.compile(Compiler.Java:373)at org.Apache.jasper.compiler.Compiler.compile(Compiler.Java:353)atorg。 Apache.jasper.compiler.Compiler.compile(Compiler.Java:340)at org.Apache.jasper.JspCompilationContext.compile(JspCompilationContext.Java:646)at org.Apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.Java: 357)org.Apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.Java:390)at org.Apache.jasper.servlet.Jsp Servlet.service(JspServlet.Java:334)at javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:305)at org.Apache .catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)at org.Apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.Java:749)at org.Apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.Java :487)org.Apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.Java:412)at org.Apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.Java:339)atorg.Apache.struts.action。 RequestProcessor.doForward(RequestProcessor.Java:1056)at org.Apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.Java:261)at org.Apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.Java:388)at org .Apache.struts.tiles.TilesRequestProcessor.processForwardConfig( TilesRequestProcessor.Java:316)at org.Apache.struts.action.RequestProcessor.process(RequestProcessor.Java:231)at org.Apache.struts.action.ActionServlet.process(ActionServlet.Java:1164)at org.Apache.struts .action.ActionServlet.doGet(ActionServlet.Java:397)at javax.servlet.http.HttpServlet.service(HttpServlet.Java:621)at javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)atorg。 Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:305)at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)at filter.SecureFilter.doFilter(SecureFilter.Java:38)at org .Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:243)at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperVal .Java:222)org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:12 3)org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:472)at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:171)at org.Apache.catalina.valves.ErrorReportValve .invoke(ErrorReportValve.Java:99)at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:936)at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)atorg。 Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:407)at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1004)at org.Apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(Abstract Java:589)org.Apache.Tomcat.util.net.AprEndpoint $ SocketProcessor.run(AprEndpoint.Java:1822)at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1110)at Java.util.concurrent .ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.Java:603)at Java.lang.Thread.run(Thread.Java:722)

エラー行を囲む完全なコードは次のとおりです。

 <c:forEach items="${caselist}" var="case">
   <tr onMouseOver="this.bgColor='#EEEEEE';" onMouseOut="this.bgColor='';">
    <td><c:out default="&nbsp;" escapeXml="false" value="${case.patientmaxdate}"/></td>

ここで、caselistは配列リストです。

13
Ratan

あなたがこれを解決することになったのかどうかはわかりませんが、同じような問題を抱えて解決したばかりなので、私はチップインすると思いました。

Tomcat 7の式パーサーは、以前のバージョンよりも明らかに許容度が低くなっています。 Javaの予約キーワードと衝突するEL式の属性名は好きではありません。

あなたの例では、パーサーは、forEachループで変数名 'case'を使用していると文句を言っている可能性があります。 「case」という名前は明らかに予約済みのJavaキーワードです。

変数名を予約されていない名前(おそらく「aCase」)に変更する必要があります。

<c:forEach items="${caselist}" var="aCase">
   <tr onMouseOver="this.bgColor='#EEEEEE';" onMouseOut="this.bgColor='';">
    <td><c:out default="&nbsp;" escapeXml="false" value="${aCase.patientmaxdate}"/>

または、Tomcat7をより寛容にするように設定できるシステムプロパティがあります。

-Dorg.Apache.el.parser.SKIP_IDENTIFIER_CHECK=true

これを、Tomcat 7プロパティウィンドウのJavaオプションボックス)のプロパティリストの最後に追加する必要があります(Tomcat7w.exeを実行します)。

enter image description here

これは、Tomcat7で実行しているすべてのアプリのすべてのページに適用されます。

42
Will Keeling

Javaキーワード(caseinstanceofifwhileclassreturnstaticなど)は、ELの変数/関数名として使用できません。

<c:forEach items="${caselist}" var="cs">
   <tr onMouseOver="this.bgColor='#EEEEEE';" onMouseOut="this.bgColor='';">
    <td><c:out default="&nbsp;" escapeXml="false" value="${cs.patientmaxdate}"/></td>
</c:forEach>
3
user3199855

このパターンを広範囲に使用したために、同じ問題が発生しました:<c:if test="${actionVar.class.name == 'MyClass'}"> <c:import url="${actionVar.cellRender}" /></c:if>追加することで修正された問題:org.Apache.el.parser.SKIP_IDENTIFIER_CHECK=trueから/etc/Tomcat7/catalina.properties

@ will-keelingによって提案されたように

3
Tim Pizey

Tomcat 7にはデフォルトでJSTLが含まれていません。EL式を使用するには、JSTLを個別に追加する必要があります。 133行目がページでEL式を使用する最初のオカレンスである場合は、JSTLライブラリが$ CATALINA_HOME/libまたはWEB-INF/libディレクトリに含まれていることを確認する必要があります。

2
user2033899

1:最後の「}」を忘れないでください

単純に見えますが、式が少し複雑になったときにこれを数回行いました。

2:「。」を使用すると、属性の設定はサイレントに失敗します:

<% pageContext.setAttribute("my_namespace.MY_VAR", MY_VAR); %>
${my_namespace.MY_VAR}

属性は単一の文字列として設定されます。ただし、解析時に分割されます。 {$ my_namesapce.MY_VAR} my_namespaceが、キー「MY_VAR」のマップまたはプロパティ「MY_VAR」のオブジェクトであると想定します。

0
J.M.I. MADISON