JSP:不评估EL表达式

时间:2009-04-27 15:14:12

标签: 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>

我得到的输出是:

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

我无法解决为什么forEach循环正在工作但输出无效。任何人都可以提供任何帮助都会很棒。

9 个答案:

答案 0 :(得分:65)

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

<%@ page isELIgnored="false" %> 

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

答案 1 :(得分:38)

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

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

这次有一点不同,我使用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的回答让我尝试输入&lt;%@ page isELIgnored =“false”%&gt;。这解决了这个问题。但是我仍然想知道为什么el开始被忽略了。

由于我的web.xml出现问题,我认为el被忽略了,所以我与其他webapp的web.xml进行了仔细检查,我知道它工作得很好。没有明显的差异。

然后我删除了&lt;%@ page isELIgnored =“false”%&gt;从我的JSP,并重新部署,假设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表达式的内容,否则会出现各种问题。

答案 2 :(得分: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>

使用下面的标题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">

答案 3 :(得分: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实例的正确名称空间。

答案 4 :(得分:2)

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

<jsp:directive.page isELIgnored="false"/>

答案 5 :(得分:1)

与Kevin有类似的问题,我使用maven开始使用webapp但是在jsp中评估表达式并不高兴 - 我不得不删除DOCTYPE标题 - 现在一切都很好而不用isELIgnored bit -maven生成web.xml哪个链接到彼得所说的2.3默认禁用EL

答案 6 :(得分:0)

出于可能的原因,请在Javascript String.replace(/\$/,str) works weirdly in jsp file查看我的回答。

更长的答案:$ {i}表达所谓的“表达语言”。有时,可以禁用表达式语言。请参阅上述答案,了解可能的原因以及如何启用它。

答案 7 :(得分:0)

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

答案 8 :(得分: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