我正在尝试调试旧的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.ELException:无法解析表达式[$ {case.patientmaxdate}]
该行的代码是:
<td><c:out default=" " 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.ELException:无法解析表达式 [$ {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=" " escapeXml="false" value="${case.patientmaxdate}"/></td>
这里caselist是一个数组列表。
答案 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=" " escapeXml="false" value="${aCase.patientmaxdate}"/>
或者,您可以设置一个系统属性,使Tomcat 7更加宽松:
-Dorg.apache.el.parser.SKIP_IDENTIFIER_CHECK=true
您需要将它添加到Tomcat 7属性窗口的Java Options框中的属性列表的末尾(运行Tomcat7w.exe)。
然后,这将适用于您在Tomcat 7中运行的所有应用程序中的所有页面。
答案 1 :(得分: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=" " 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”属性的对象