JSP:不评估EL表达式

30 java jsp el taglib

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

 <c:forEach var="i" begin="1" end="10" step="1">
  <c:out value="${i}" />
  <br />
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
Run Code Online (Sandbox Code Playgroud)

我无法解决为什么forEach循环工作但输出不起作用.任何人都可以提供任何帮助都会很棒.

RHS*_*ger 66

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

<%@ page isELIgnored="false" %> 
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您使用maven原型创建了webapp,则正确答案是:http://stackoverflow.com/a/25372735/20654 (4认同)
  • 在Tomcat 5.5上,有(仅?)两个可能的原因:web.xml中的架构无效,或el-ignored配置选项. (2认同)

kev*_*ohr 39

我只是遇到了同样的问题,并一直在努力弄清楚出了什么问题.

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

一个区别是这次我使用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>
Run Code Online (Sandbox Code Playgroud)

一旦我意识到这是我的问题,我确信我有答案.所以我复制了我的2.5 web.xml标题之一,重建并重新部署.没有雪茄.无法相信这不是问题.清理项目,重新启动tomcat.不.

RHSeeger的回答让我尝试输入<%@ page isELIgnored ="false"%>.这解决了这个问题.但我仍然想知道为什么el开始被忽略了.

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

然后我从我的JSP中删除了<%@ page isELIgnored ="false"%>并重新部署,假设不会再次评估el,但令我惊讶的是,el被评估为罚款!

然后,确定它必须是某种缓存问题,我取消对web.xml的更改以重新创建问题.我重新部署,但仍然正在评估el,即使使用错误的web.xml.然后我清理了我的整个项目(我正在使用爆炸部署),吹走了展开的目录并重新创建它.然后我重新启动了tomcat.尽管web.xml很糟糕,但el似乎正在被正确评估.

最后我突然明白了.我只是在JSP中的某个地方添加了一个空格,重新打包并刷新页面.答对了!现在el没有得到评估.

所以,问题与web.xml中.除非它们已经改变,否则JSP不会被重新编译,这将进一步复杂化.不确定tomcat是否使用MD5总和来决定是否需要重新编译JSP或者是什么.另一种可能性是我正在使用tile,我知道它有一个缓存机制,但我不希望它能在tomcat重启后继续存在.

无论如何,除非你在修复web.xml之后修改你的JSP,否则关于EL是否会重新开始工作的所有赌注都将被取消.希望这能让别人头疼.我也很感兴趣,如果有人能告诉我是不是tomcat没有重新编译JSP或缓存JSP输出的磁贴.我很确定这是重新编译,因为在编译时是JSP应该弄清楚如何处理$ {} el表达式,对吧?Tiles实际上无法缓存被替换为el表达式的内容,否则会出现各种问题.


小智 16

它是web.xml中的标题导致问题

在maven生成的标题下面停止EL被评估.

<!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>
Run Code Online (Sandbox Code Playgroud)

使用下面的标题eval是EL.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
Run Code Online (Sandbox Code Playgroud)


Bou*_*tra 9

确保在web.xml中包含相关的命名空间.试着替换

<web-app>
Run Code Online (Sandbox Code Playgroud)

喜欢的东西

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">
Run Code Online (Sandbox Code Playgroud)

它为我修好了.您可以在Tomcat安装附带的示例应用程序中找到Tomcat实例的正确名称空间.