JSP错误:包含无效表达式。无法解析表达式

时间:2013-02-01 21:04:19

标签: jsp tomcat7

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

  

SEVERE:Servlet jsp的Servlet.service()抛出异常   org.apache.jasper.JasperException:/pages/caselisting.jsp(line:133,column:35)" $ {case.patientmaxdate}"包含无效表达式:javax.el.E​​LException:无法解析表达式[$ {case.patientmaxdate}]

该行的代码是:

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

我是jsp的新手,我正在尝试对这个旧网站进行一些更改。我做了一些研究,并读到Tomcat 7对此错误进行了一些更改。如果有人能引导我朝着正确的方向前进,我将不胜感激。

感谢。

完整的堆栈跟踪:

  

SEVERE:Servlet jsp的Servlet.service()抛出异常   org.apache.jasper.JasperException:/pages/caselisting.jsp(第133行,   专栏:35)&#34; $ {case.patientmaxdate}&#34;包含无效的表达式:   javax.el.E​​LException:无法解析表达式   [$ {case.patientmaxdate}] at   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)     在org.apache.jasper.compiler.Node $ CustomTag.accept(Node.java:1539)     在org.apache.jasper.compiler.Node $ Nodes.visit(Node.java:2376)at at   org.apache.jasper.compiler.Node $ Visitor.visitBody(Node.java:2428)at at   org.apache.jasper.compiler.Validator $ ValidateVisitor.visit(Validator.java:894)     在org.apache.jasper.compiler.Node $ CustomTag.accept(Node.java:1539)     在org.apache.jasper.compiler.Node $ Nodes.visit(Node.java:2376)at at   org.apache.jasper.compiler.Node $ Visitor.visitBody(Node.java:2428)at at   org.apache.jasper.compiler.Node $ Visitor.visit(Node.java:2434)at at   org.apache.jasper.compiler.Node $ Root.accept(Node.java:475)at at   org.apache.jasper.compiler.Node $ Nodes.visit(Node.java:2376)at 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)at   org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)at   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)at   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)at   javax.servlet.http.HttpServlet.service(HttpServlet.java:728)at at   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)     在   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)     在filter.SecureFilter.doFilter(SecureFilter.java:38)at   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是一个数组列表。

5 个答案:

答案 0 :(得分:42)

不确定你是否最终解决了这个问题,但刚刚遇到类似的问题并解决了问题,我以为自己会陷入困境。

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属性窗口的Java Options框中的属性列表的末尾(运行Tomcat7w.exe)。

enter image description here

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

答案 1 :(得分:3)

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>

答案 2 :(得分: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的建议

答案 3 :(得分:2)

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

答案 4 :(得分: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”属性的对象