JSP:EL表达式未被评估

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循环可以工作,但输出结果却没有生效。希望有人能提供帮助。

9个回答

66

我知道EL表达式处理默认应该是开启的,但有时我会遇到某些页面(甚至同一页面可能会改变行为)没有进行EL处理的情况。将以下内容添加到任何这样的页面的顶部应该可以解决这个问题:

<%@ page isELIgnored="false" %> 

我在每个页面中都添加了它,因为这样做不会有任何损害,并且我仍然不知道是什么根本原因导致页面偶尔停止解释EL表达式。


2
在Tomcat 5.5上,可能有(仅有?)两个原因:web.xml中的无效模式或el-ignored配置选项。 - Peter Štibraný
1
我(以及其他人)之前有一个单页面正常运行,但在更改页面上的某些内容(例如添加一些HTML代码)后,它突然停止了对EL表达式的解析。我能想到的唯一解释是Tomcat中存在某个错误,但由于通过上述代码手动启用可以解决问题,所以不值得深入挖掘。 - RHSeeger
4
如果你使用了Maven原型创建你的Web应用程序,正确的答案是这个:https://dev59.com/hHRA5IYBdhLWcg3w4SDo#25372735 - OscarRyz
@OscarRyz 就是这样。非常感谢! - smwikipedia
1
太棒了!我整天都头疼,直到看到这个解决方案。非常感谢你! - Thach Van

39

我刚刚遇到了这个问题,花了很长时间才弄清楚出了什么问题。

我已经从头开始开发过很多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 header之一,重新构建并重新部署。但没有成功。我无法相信那不是问题所在。清理项目,重启tomcat也没有用。
RHSeeger的答案让我尝试加入<%@ page isELIgnored="false" %>。这解决了问题。但我仍然想知道为什么el最初被忽略了。
我想el之所以被忽略是因为我的web.xml有问题,所以我仔细检查了它,并与一个我知道运行良好的另一个webapp的web.xml进行了比较。没有明显的区别。
然后我从我的JSP中删除了<%@ page isELIgnored="false" %>,重新部署,假设el不会再次被评估,但出乎我的意料,el却能够很好地被评估!
然后,我想这必须是某种缓存问题,于是撤消了我对web.xml的更改以重新创建问题。我重新部署,但即使是坏的web.xml,el也被正确评估。然后我清理了整个项目(我使用的是exploded deployment),删除了exploded目录并重新创建它。然后我重新启动了Tomcat。即使是坏的web.xml,el看起来仍能被正确评估。
最后我终于想到,我只是在JSP的某个地方添加了一个空格,重新打包它并刷新页面。太好了!现在el不再被评估了。
所以问题实际上在于web.xml。更进一步复杂化的是,除非它们发生了变化,否则JSP将不会被重新编译。不确定Tomcat是否使用MD5哈希值来决定是否需要重新编译JSP。另一个可能性是我正在使用tiles,我知道它有一个缓存机制,但我不希望它能在Tomcat重启后仍然存在。
总之,除非您在修复web.xml之后修改了JSPs,否则无法确定EL是否将再次开始工作。希望这可以为其他人节省麻烦。如果有人能告诉我是Tomcat没有重新编译JSP还是Tiles缓存了JSP的输出,我也很感兴趣。我相当确定这是重新编译,因为在编译时JSP应该需要弄清楚如何处理${} el表达式对吧?Tiles不能实际缓存替换到el表达式中的内容,否则会出现各种问题。

非常感谢,这正是我所经历的 - 从原型创建,并且EL和JSTL都不起作用,即使JSP文件与之前工作过的某个应用程序完全相同。修复了web.xml命名空间,重新启动,但仍然无法工作;最后修改了JSP,问题得到解决! - Ken Goh
这是Tomcat没有重新编译JSP文件。它会跟踪JSP文件的最后修改时间 - 新版本还会跟踪依赖项的最后修改时间。这些会在可配置的频率下进行检查(如果我没记错,通常为5秒),如果检测到更改,则会触发重新编译。.java文件可以位于Tomcat的工作目录中,并且会在重新启动后保留。 - Mark Thomas
@kevinmrohr非常感谢您详细的实验和答案。 - smwikipedia

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>

使用下面的header可以评估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">

太好了,我的一天得救了!谢谢! - Savrige
這個解決方案有效。 - michaeln peterson
Maven生成的原型在web.xml中的头部是问题的根本原因。更改标题对我有用。谢谢。 - chamina
如果您想继续使用<!DOCTYPE>元素,例如,您想定义一些包含文件,那么可以这样做。只需确保将DTD定义从DOCTYPE中移除并将其移动到Web应用程序中,如上所示。 - jomofrodo

8

请确保在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实例的正确名称空间。


2

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

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

1

我和Kevin遇到了类似的问题,我使用maven开始webapp,但在jsp中评估表达式时没有成功 - 我不得不删除DOCTYPE头 - 现在一切都很好,而不需要玩isELIgnored位 - maven生成链接到2.3的web.xml,正如Peter所述,默认情况下禁用EL


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

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

2
Tomcat 5.5也不需要在web.xml中进行EL的任何配置。Tomcat 5.0也是如此。如果你遇到了问题,那么它可能出现在其他地方。 - BalusC

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接