JSP:不计算 EL 表达式

2022-09-01 11:07:19

我有一个在Tomcat 5.5上运行的JSP页面。我有以下代码:

 <c:forEach var="i" begin="1" end="10" step="1">
  <c:out value="${i}" />
  <br />
</c:forEach>

我得到的输出是:

${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 

我无法弄清楚为什么 forEach 循环正在工作,但输出不起作用。任何人都可以给予的任何帮助都会很棒。


答案 1

我知道默认情况下它应该处于打开状态,但是我不时地在EL处理没有发生的页面(甚至是更改行为的同一页面)中运行。将以下内容添加到任何此类页面的顶部应该可以解决此问题:

<%@ page isELIgnored="false" %> 

我将其添加到每个页面,因为它没有伤害,我仍然不知道偶尔导致页面停止解释EL表达式的根本原因。


答案 2

我只是遇到了同样的问题,并花了很长时间试图找出问题所在。

我从头开始开发了很多Web应用程序。为什么这个人突然不合作了?

一个不同之处在于,这次我使用 maven webapp 原型来生成项目结构。它创建了一个 web.xml文件,如下所示:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
</web-app>

一旦我意识到这是我的问题,我就确信我有答案。因此,我复制了一个 2.5 web.xml 标头,重新构建并重新部署。没有雪茄。不敢相信这不是问题所在。清理了项目,重新启动了雄猫。不。

RHSeeger的回答使我尝试输入<%@ 页面isELIgnored=“false” %>。这解决了问题。但我仍然想知道为什么一开始就被忽视了。

我认为 el 被忽略了,因为我的 web.xml出了问题,所以我仔细检查了它与另一个 webapp 的 web 进行比较.xml我知道它工作正常。没有明显的差异。

然后我从我的JSP中删除<%@页面isELIgnored=“false” %>,并重新部署,假设不会再次评估el,但令我惊讶的是,el被评估得很好!

然后,考虑到它一定是某种缓存问题,我撤消了对Web的更改.xml以重新创建问题。我重新部署了,但仍然正确评估了el,即使网络不好.xml。然后,我清理了整个项目(我使用的是分解部署),吹走了分解的目录并重新创建它。然后我重新启动了雄猫。尽管如此,尽管网络很糟糕.xml,但el似乎得到了正确的评估。

终于,我恍然大悟。我只是在 JSP 中的某个位置添加了一个空格,重新打包了它,然后刷新了页面。宾果游戏!现在 el 没有得到评估。

所以问题在网络.xml。由于JPP除非更改,否则不会被重新编译,这将使情况变得更加复杂。不确定tomcat是否使用MD5总和来决定是否需要重新编译JSP或什么。另一种可能性是我正在使用磁贴,我知道它有一个缓存机制,但我不希望它在tomcat重新启动后幸存下来。

无论如何,除非您在修复Web.xml后修改JPP,否则所有关于EL是否会再次开始工作的赌注都是错误的。希望这能省去别人的头疼。如果有人能告诉我是tomcat没有重新编译JSP还是瓷砖缓存JSP的输出,我也很感兴趣。我很确定这是重新编译,因为在编译时,JSP应该弄清楚如何处理${} el表达式,对吧?切片实际上无法将替换的内容缓存到 el 表达式中,否则会出现各种问题。