Подтвердить что ты не робот

Ошибка JSP: содержит недопустимое выражение. Не удалось проанализировать выражение

Я пытаюсь отлаживать старый jsp-сайт, поэтому я установил tomcat 7 и Netbeans IDE 7.2.1 на свой локальный компьютер, работающий под управлением Windows 7, и получил все настройки. Но когда я запускаю его, я получаю сообщение об ошибке:

SEVERE: Servlet.service() для сервлета jsp исключение org.apache.jasper.JasperException:/pages/caselisting.jsp(строка: 133, column: 35) "$ {case.patientmaxdate}" содержит недопустимые выражения: javax.el.ELException: не удалось проанализировать выражение [ ${case.patientmaxdate}]

Код в этой строке:

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

Я очень новичок в jsp и пытаюсь внести некоторые изменения в этот старый сайт. Я сделал некоторые исследования и прочитал, что Tomcat 7 внесла некоторые изменения для этой ошибки. Я был бы признателен, если кто-то может вести меня в правильном направлении.

Спасибо.

Полная трассировка стека:

SEVERE: Servlet.service() для сервлета jsp исключение org.apache.jasper.JasperException:/pages/caselisting.jsp(строка: 133, столбец: 35) "$ {case.patientmaxdate}" содержит недопустимые выражения: javax.el.ELException: не удалось проанализировать выражение [$ {case.patientmaxdate}] в 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:199)   в org.apache.jasper.compiler.Validator $ValidateVisitor.checkXmlAttributes(Validator.java:1223)   в org.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)   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.Node $Visitor.visit(Node.java: 2434) at org.apache.jasper.compiler.Node $Root.accept(Node.java: 475) at org.apache.jasper.compiler.Node $Nodes.visit(Node.java: 2376) at org.apache.jasper.compiler.Validator.validateExDirectives(Validator.java:1795)   в org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:217)   на 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) at 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:728) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)   в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)   в org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)   в org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)   в org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412)   в org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)   в org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1056)   в org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:261)   в org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:388)   в org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:316)   в org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:231)   в org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)   в org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)   в javax.servlet.http.HttpServlet.service(HttpServlet.java:621) в Уровеньвыше: org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)   в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)   на filter.SecureFilter.doFilter(SecureFilter.java:38) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)   в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)   в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)   в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)   в org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)   в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)   в org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)   в org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)   в org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)   в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)   в org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)   в org.apache.coyote.AbstractProtocol $AbstractConnectionHandler.process(AbstractProtocol.java:589)   в org.apache.tomcat.util.net.AprEndpoint $SocketProcessor.run(AprEndpoint.java:1822)   в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)   в java.util.concurrent.ThreadPoolExecutor $Worker.run(ThreadPoolExecutor.java:603)   в 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 - список массивов.

4b9b3361

Ответ 1

Не уверен, закончили ли вы решение этой проблемы, но у меня была аналогичная проблема и ее решение, я думал, что у меня есть.

Парсер выражения в Tomcat 7, по-видимому, менее разрешительный, чем в предыдущих версиях. Это не нравится имена атрибутов в выражениях EL, которые сталкиваются с зарезервированными ключевыми словами в Java.

В вашем примере анализатор может жаловаться на то, что вы используете имя переменной "case" в вашем forEach-цикле. Имя "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}"/>

В качестве альтернативы существует системное свойство, которое вы можете установить, что сделает Tomcat 7 более допустимым:

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

Вам нужно добавить это в конец списка свойств в окне "Параметры Java" в окне свойств Tomcat 7 (запустите Tomcat7w.exe).

enter image description here

Это будет применяться ко всем страницам всех приложений, которые вы используете в Tomcat 7.

Ответ 2

Ключевые слова Java (например, case, instanceof, if, while, class, return, static и т.д.) не могут использоваться как имена переменных/функций в 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

У меня была та же проблема, вызванная нашим широким использованием этого шаблона: <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

Ответ 4

Tomcat 7 по умолчанию не включает JSTL, вы должны добавить это отдельно, чтобы использовать выражения EL. Если строка 133 является первым случаем использования выражения EL на странице, вы должны проверить, что библиотека JSTL включена в $CATALINA_HOME/lib или в ваш каталог WEB-INF/lib.