为什么 JSTL 抱怨一个名为 "Error" 的变量 Tomcat 8

Why does JSTL complain about a variable called "Error" with Tomcat 8

我们有一个 Web 应用程序,使用 Tomcat 7 时工作得非常好。但是当我们在 Tomcat 8 上部署它时,我们总是在 HTML 页面上看到错误:

Error
javax.el.ELClass@550077ee 

HTML 页面是使用 JSP 和 JSTL 创建的。错误区域的JSTL代码为:

<c:if test="${Error!=null}">
  <span>${Error}</span>
</c:if>

只需将从 Java 端传递的变量更改为 "Error" 以外的任何变量(例如 XXXError),问题就会消失。

谁能解释一下问题出在哪里?我假设 "Error" 是一个保留字,但为什么这会影响 Tomcat 8 而不是 Tomcat 7?

谢谢,

菲尔

这里首先要注意的是 Tomcat 8 随 EL 3.0 一起提供,这与 Tomcat 7 随附的 EL 2.2 有很大不同。如果您还没有完成后,您可能想了解一些差异,包括集合流、lambda 和其他一些小的改进,如静态访问器、赋值和集合文字。

就您在 Error 中看到的行为而言,如果您将其视为 class (java.lang.Error) 则更有意义.在那种情况下,你有错误,这是一个 class 并且永远不会为空,这意味着你的 c:if 块将始终被执行。因此,您最终会得到输出中包含 class 错误的评估。

为避免此类冲突,请考虑不要使用大写字母作为变量名称中的第一个字符。如果您使用 error 而不是 Error,您就不会遇到这个问题。