14

我正在尝试调试一个旧的 jsp 站点,因此我在运行 Windows 7 的本地计算机上安装了 tomcat 7 和 Netbeans IDE 7.2.1 并进行了所有设置。但是当我运行它时,我收到一个错误:

严重:servlet 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 很陌生,正在尝试对这个旧站点进行一些更改。我做了一些研究并读到 Tomcat 7 对此错误进行了一些更改。如果有人能引导我朝着正确的方向前进,我将不胜感激。

谢谢。

完整的堆栈跟踪:

严重:servlet jsp 的 Servlet.service() 抛出异常 org.apache.jasper.JasperException:/pages/caselisting.jsp(行:133,列:35)“${case.patientmaxdate}”包含无效表达式: javax.el.E​​LException:无法在 org.apache.jasper.compiler.ErrorDispatcher.dispatch 的 org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42) 解析表达式 [${case.patientmaxdate}] (ErrorDispatcher.java:408) 在 org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:1223) 在 org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:199) 在 org. org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1539) 中的 org.apache.jasper.compiler 中的 apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:875)。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) at 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) 在 org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java: 646) 在 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) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412) at 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) 在 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) 在 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) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at 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) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at org. java.util.concurrent.ThreadPoolExecutor 上的 apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1822)。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 是一个数组列表。

4

5 回答 5

45

不确定你是否最终解决了这个问题,但刚刚遇到了类似的问题并解决了它,我想我会参与进来。

Tomcat 7 中的表达式解析器显然比以前的版本更宽松。它不喜欢 EL 表达式中的属性名称与 Java 中的保留关键字发生冲突。

在您的示例中,解析器可能会抱怨您在 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}"/>

或者,您可以设置一个系统属性,使 Tomcat 7 更加宽松:

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

您需要将其添加到 Tomcat 7 属性窗口(运行 Tomcat7w.exe)的 Java 选项框中的属性列表的末尾。

在此处输入图像描述

然后,这将应用于您在 Tomcat 7 中运行的所有应用程序中的所有页面。

于 2013-05-09T13:55:08.773 回答
3

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>
于 2014-01-15T20:09:28.660 回答
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 所建议的那样

于 2015-11-18T15:39:23.307 回答
2

Tomcat 7 默认不包含 JSTL,您必须单独添加才能使用 EL 表达式。如果第 133 行是第一次在页面上使用 EL 表达式,那么您应该验证 JSTL 库是否包含在 $CATALINA_HOME/lib 或您的 WEB-INF/lib 目录中。

于 2013-02-01T21:13:47.453 回答
0

1:不要忘记结束的 "}"

看起来很简单,但是当表达式变得有点复杂时,我已经这样做了几次。

2:使用“.”时,设置属性静默失败:

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

该属性设置为单个字符串。但是解析时会分裂。{$my_namesapce.MY_VAR} 假设 my_namespace 是带有键“MY_VAR”的映射或带有属性“MY_VAR”的对象

于 2018-07-16T06:32:42.000 回答