当前位置: 首页 > 知识库问答 >
问题:

JSP错误:包含无效的表达式。未能分析表达式

霍建章
2023-03-14

我试图调试一个旧的jsp站点,所以我在运行Windows7的本地机器上安装了tomcat 7和Netbean IDE 7.2.1,并设置了一切。但是当我运行它时,我得到一个错误:

SEVERE: Servlet.service()为servlet jsp抛出异常org.apache.jasper.JasperExcture: /pages/caselisting.jsp(行: 133,列: 35)${case.patientmaxdate}包含无效表达式:javax.el.ELExcture:解析表达式[${case.patientmaxdate}]失败

这一行的代码是:

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

我对jsp非常陌生,我正试图对这个旧网站进行一些修改。我做了一些研究,读到Tomcat 7为这个错误做了一些更改。如果有人能指引我走向正确的方向,我将不胜感激。

谢谢。

完整的堆栈跟踪:

严重:Servlet。servlet jsp的service()引发了异常组织。阿帕奇。贾斯珀。JasperException:/pages/caselisting。jsp(第133行,第35列)“${case.patientmaxdate}”包含无效表达式:javax。埃尔。ELException:未能分析org上的表达式[${case.patientmaxdate}]。阿帕奇。贾斯珀。编译器。DefaultErrorHandler。jsperor(DefaultErrorHandler.java:42)位于org。阿帕奇。贾斯珀。编译器。错误调度员。调度(ErrorDispatcher.java:408)位于org。阿帕奇。贾斯珀。编译器。错误调度员。jspError(ErrorDispatcher.java:199)位于org。阿帕奇。贾斯珀。编译器。验证器$ValidateVisitor。org上的checkXmlAttributes(Validator.java:1223)。阿帕奇。贾斯珀。编译器。验证器$ValidateVisitor。访问(Validator.java:875)org。阿帕奇。贾斯珀。编译器。节点$CustomTag。在org接受(Node.java:1539)。阿帕奇。贾斯珀。编译器。节点$Nodes。访问org(Node.java:2376)。阿帕奇。贾斯珀。编译器。节点$Visitor。在org上访问body(Node.java:2428)。阿帕奇。贾斯珀。编译器。验证器$ValidateVisitor。访问(Validator.java:894)org。阿帕奇。贾斯珀。编译器。节点$CustomTag。在org接受(Node.java:1539)。阿帕奇。贾斯珀。编译器。节点$Nodes。访问org(Node.java:2376)。阿帕奇。贾斯珀。编译器。节点$Visitor。在org上访问body(Node.java:2428)。阿帕奇。贾斯珀。编译器。节点$Visitor。访问org(Node.java:2434)。阿帕奇。贾斯珀。编译器。节点$Root。在org接受(Node.java:475)。阿帕奇。贾斯珀。编译器。节点$Nodes。访问org(Node.java:2376)。阿帕奇。贾斯珀。编译器。验证器。组织上的ValidateExdirections(Validator.java:1795)。阿帕奇。贾斯珀。编译器。编译器。org上的generateJava(Compiler.java:217)。阿帕奇。贾斯珀。编译器。编译器。在org上编译(Compiler.java:373)。阿帕奇。贾斯珀。编译器。编译器。在org上编译(Compiler.java:353)。阿帕奇。贾斯珀。编译器。编译器。在org上编译(Compiler.java:340)。阿帕奇。贾斯珀。JspCompilationContext。在org上编译(JspCompilationContext.java:646)。阿帕奇。贾斯珀。servlet。JspServletWrapper。org上的服务(JspServletWrapper.java:357)。阿帕奇。贾斯珀。servlet。JspServlet。serviceJspFile(JspServlet.java:390)位于org。阿帕奇。贾斯珀。servlet。JspServlet。javax上的服务(JspServlet.java:334)。servlet。http。HttpServlet。服务(HttpServlet.java:728)位于org。阿帕奇。卡塔琳娜。果心ApplicationFilterChain。org上的internalDoFilter(ApplicationFilterChain.java:305)。阿帕奇。卡塔琳娜。果心ApplicationFilterChain。doFilter(ApplicationFilterChain.java:210)位于org。阿帕奇。卡塔琳娜。果心应用程序Dispatcher。在org上调用(ApplicationDispatcher.java:749)。阿帕奇。卡塔琳娜。果心应用程序Dispatcher。processRequest(ApplicationDispatcher.java:487)位于org。阿帕奇。卡塔琳娜。果心应用程序Dispatcher。doForward(ApplicationDispatcher.java:412)位于org。阿帕奇。卡塔琳娜。果心应用程序Dispatcher。在org上转发(ApplicationDispatcher.java:339)。阿帕奇。struts。行动请求处理器。doForward(RequestProcessor.java:1056)位于org。阿帕奇。struts。瓷砖。TileRequestProcessor。doForward(tileRequestProcessor.java:261)位于org。阿帕奇。struts。行动请求处理器。org上的processForwardConfig(RequestProcessor.java:388)。阿帕奇。struts。瓷砖。TileRequestProcessor。org上的processForwardConfig(tileRequestProcessor.java:316)。阿帕奇。struts。行动请求处理器。org上的进程(RequestProcessor.java:231)。阿帕奇。struts。行动ActionServlet。进程(ActionServlet.java:1164)位于org。阿帕奇。struts。行动ActionServlet。javax上的doGet(ActionServlet.java:397)。servlet。http。HttpServlet。javax上的服务(HttpServlet.java:621)。servlet。http。HttpServlet。服务(HttpServlet.java:728)位于org。阿帕奇。卡塔琳娜。果心ApplicationFilterChain。org上的internalDoFilter(ApplicationFilterChain.java:305)。阿帕奇。卡塔琳娜。果心ApplicationFilterChain。过滤器上的doFilter(ApplicationFilterChain.java:210)。安全过滤器。doFilter(SecureFilter.java:38)位于org。阿帕奇。卡塔琳娜。果心ApplicationFilterChain。org上的internalDoFilter(ApplicationFilterChain.java:243)。阿帕奇。卡塔琳娜。果心ApplicationFilterChain。doFilter(ApplicationFilterChain.java:210)位于org。阿帕奇。卡塔琳娜。果心标准包装阀。在org上调用(StandardWrapperValve.java:222)。阿帕奇。卡塔琳娜。果心标准连接阀。在org调用(StandardContextValve.java:123)。阿帕奇。卡塔琳娜。验证者。AuthenticatorBase。在org调用(AuthenticatorBase.java:472)。阿帕奇。卡塔琳娜。果心标准阀门。在org上调用(StandardHostValve.java:171)。阿帕奇。卡塔琳娜。阀门。错误报告阀。在org调用(ErrorReportValve.java:99)。阿帕奇。卡塔琳娜。阀门。检修阀。在org上调用(AccessLogValve.java:936)。阿帕奇。卡塔琳娜。果心标准引擎版本。在org上调用(StandardEngineValve.java:118)。阿帕奇。卡塔琳娜。连接器。郊狼适应者。服务(CoyoteAdapter.java:407)位于org。阿帕奇。郊狼。http11。抽象http11处理器。进程(AbstractHttp11Processor.java:1004)位于org。阿帕奇。郊狼。AbstractProtocol$AbstractConnectionHandler。进程(AbstractProtocol.java:589)位于org。阿帕奇。公猫util。网aprependpoint$SocketProcessor。在java上运行(aprenpoint.java:1822)。util。同时发生的线程池执行器。java上的runWorker(ThreadPoolExecutor.java:1110)。util。同时发生的线程池执行器$Worker。在java上运行(ThreadPoolExecutor.java:603)。朗。丝线。运行(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>

这里的案例列表是一个数组列表。

共有3个答案

毋弘光
2023-03-14

我也遇到了同样的问题,因为我们广泛使用了这种模式:

正如@will-keling所建议的

程修雅
2023-03-14

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>
慕宏峻
2023-03-14

不确定你是否最终解决了这个问题,但是刚刚遇到了一个类似的问题并解决了它,我想我应该帮忙。

Tomcat7中的表达式解析器显然比以前版本中的权限要小。它不喜欢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

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

这将适用于您在Tomcat7中运行的所有应用程序中的所有页面。

 类似资料:
  • 下面是我正在使用的正则表达式的最新版本,它抛出了错误“Invalid regular expression” XSD:正则表达式在位置4验证失败:当前选项设置不支持此表达式。 我在xsd文件中得到了这个异常,我正在message broker(IIB)中开发这个xsd。有谁能帮我解决这个问题吗?

  • 问题内容: 我收到一个错误: 致命错误:常量表达式在第214行的config.php中包含无效操作 那行是: 我是否在报价中犯了任何错误?或者别的地方? 我对错误消息的搜索仅显示了不同的原因(函数定义中的动态默认值)。 问题答案: 从 官方的PHP文档: 像任何其他PHP静态变量一样,静态属性只能在PHP 5.6之前使用文字或常量进行初始化。不允许使用表达式。在PHP 5.6和更高版本中,相同的规

  • 问题内容: 我有以下代码,出现错误“ PHP致命错误:常量表达式包含无效操作”。当我在构造函数中定义变量时,它可以正常工作。我正在使用Laravel框架。 我已经看到了这个问题:PHP错误:致命错误:常量表达式包含无效的操作,但是我的代码未将任何内容声明为静态,因此无法回答我的问题。 问题答案: 如上所述这里 类成员变量称为“属性”。您可能还会看到使用其他术语(例如“属性”或“字段”)来引用它们,

  • JSP 表达式可以把变量或者表达式输出到网页上,不需要 out.print() 就能输出数据。通常用于打印变量和方法的值。 JSP 表达式语法如下: <%= 表达式 %> 等效于 可以将 <%=表达式 %> 理解为 <% out.println(表达式) %> 的简写方式。这里需要注意,JSP 表达式不能以分号结尾。 例 1 使用 JSP 表达式显示欢迎消息,代码如下: 浏览器输出信息为: 欢迎来

  • 实际上,JSP表达式也是Java代码,只是这些Java代码被放到了<%= ... %>中。JSP编译器在翻译JSP表达式时,直接将<%= ... %>中的内容作为Java变量或表达式使用println方法输出到客户端。也就是说,将<%= ... %>中的内容翻译成println方法的参数值,而不是直接插入到由翻译JSP生成的Servlet类中。看下面的JSP表达式: <%= (3+4) * 5 %

  • 我正在尝试对DynamoDB表执行更新。 我搞不清楚哪里出了问题。 有人能帮帮我吗?