【问题标题】:JSP: EL expression is not evaluated [duplicate]JSP:EL表达式未评估[重复]
【发布时间】:2010-10-22 02:15:21
【问题描述】:

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

【问题讨论】:

    标签: java jsp el taglib


    【解决方案1】:

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

    <%@ page isELIgnored="false" %> 
    

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

    【讨论】:

    • 在 Tomcat 5.5 上,有(只有?)两个可能的原因:web.xml 中的架构无效,或者 el-ignored 配置选项。
    • 我(和其他人)有一个页面工作正常,并且在更改页面上的某些内容(即添加一些 html)后,它只是停止评估 EL 表达式。我能想出的唯一解释是 Tomcat 中的某个错误,但不值得深入研究,因为手动启用它(通过上面的代码)可以解决问题。
    • 如果您使用 maven 原型创建您的 web 应用程序,正确答案是:stackoverflow.com/a/25372735/20654
    • @OscarRyz 就是这样。非常感谢!
    • 太棒了。在阅读此解决方案之前,我整天都在头疼。非常感谢!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • Tomcat 5.5 也不需要在 web.xml 中对 EL 进行任何配置。 Tomcat 5.0 也没有。如果您遇到了问题,那是在其他地方。
      【解决方案4】:

      我也遇到了同样的问题,并且一直在试图找出问题所在。

      我从零开始开发了许多网络应用程序。这个怎么突然不合作了?

      一个不同之处是这次我使用了 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 的回答让我尝试放入 。这解决了问题。但我还是想知道为什么 el 一开始就被忽略了。

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

      然后我从我的 JSP 中删除了 并重新部署,假设不会再次评估 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 表达式中的内容,否则会出现各种问题。

      【讨论】:

      • 非常感谢,这正是我所经历的——从原型创建,EL 和 JSTL 都不起作用,即使 JSP 文件使用的代码与之前运行的某些应用程序完全相同.修复了 web.xml 命名空间,重启了,还是不行;终于修改了JSP,并且排序了!
      • Tomcat 没有重新编译 JSP。它跟踪 JSP 文件的最后修改 - 较新的版本还跟踪依赖项的最后修改时间。这些以可配置的频率检查(通常为 5 秒,如果有记忆的话),如果检测到更改,则会触发重新编译。 .java 文件可以位于 Tomcat 的工作目录中,并且会在重新启动后持续存在。
      • @kevinmrohr 非常感谢您详细的实验和回答。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        确保在 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 实例找到正确的命名空间。

        【讨论】:

        • 工作,拯救了我的一天! :D
        【解决方案7】:

        来自控制器:

        @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
        

        【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 这可以拯救我的一天!谢谢!
          • 此解决方案有效。
          • maven 在 web.xml 中生成原型的标头是问题的根本原因。更改标头对我有用。谢谢
          • 如果你想继续使用 例如,你想定义一些包含,你可以这样做。只需确保从 DOCTYPE 中删除 DTD 定义并将其移动到 web-app,如上所示。
          【解决方案9】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-07-08
            • 2015-06-26
            • 1970-01-01
            • 2016-05-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-16
            相关资源
            最近更新 更多