30

我有一个在 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 循环工作但输出不工作。任何人可以提供的任何帮助都会很棒。

4

9 回答 9

66

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

<%@ page isELIgnored="false" %> 

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

于 2009-04-27T15:21:05.487 回答
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>

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

RHSeeger 的回答让我尝试放入 <%@ 页面 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 或什么。另一种可能性是我正在使用瓷砖,我知道它有一个缓存机制,但我不希望它能够在 tomcat 重新启动后继续存在。

无论如何,除非您在修复 web.xml 之后修改您的 JSP,否则关于 EL 是否会再次开始工作的所有赌注都将失败。希望这可以避免其他人头疼。如果有人能告诉我是tomcat没有重新编译JSP还是缓存JSP的输出,我也很感兴趣。我很确定这是重新编译,因为在编译时 JSP 必须弄清楚如何处理 ${} el 表达式,对吧?Tiles 不能真正缓存被替换到 el 表达式中的内容,否则会出现各种问题。

于 2011-08-12T03:13:24.133 回答
17

这是导致问题的 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>

使用下面的标头 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">
于 2014-08-18T22:01:14.957 回答
9

确保在 web.xml 中包含相关的名称空间。只是尝试更换

<web-app>

有类似的东西

<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">

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

于 2014-01-11T10:09:35.440 回答
2

对于那些感兴趣的人,JSP 2.0 的等效 XML 语法是:

<jsp:directive.page isELIgnored="false"/>
于 2015-11-18T15:00:18.477 回答
1

与凯文有类似的问题,我使用 maven 开始使用 webapp,但对 jsp 中的表达式求值并不满意 - 我不得不删除 DOCTYPE 标头 - 现在一切都很好,无需使用 isELIgnored 位 - maven 生成链接到 2.3 的 web.xml正如彼得所说,默认情况下禁用了 EL

于 2013-01-03T13:04:48.910 回答
0

出于可能的原因,请参阅我在Javascript String.replace(/\$/,str) 中的答案在 jsp 文件中奇怪地工作。

更长的答案: ${i} 是所谓的“表达语言”中的表达。有时,可以禁用表达式语言。有关潜在原因以及如何启用它的方法,请参见上述答案。

于 2009-04-27T15:21:51.023 回答
0

使用tomcat6。它不需要在 web.xml 中对 EL 进行任何配置。

于 2010-04-23T08:50:36.267 回答
0

从控制器:

@RequestMapping(value = "createcustomer",method = RequestMethod.GET)
    public String customer(Model model)
    {
        Customer cus=new Customer();
        cus.setCustomerNumber("Test");
        model.addAttribute("customer",cus);
        return "createcustomer";
    }

在视图中:

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> 

<div class="cl">    
   <form:form commandName="customer" method="POST">

      <p>Name: <c:out value="${customer.CustomerNumber}"></c:out></p>

   </form:form>
<div>

输出:

Name: Test
于 2014-04-11T10:25:30.243 回答