2012-07-11 56 views
0

我有一个jsp,它接收(验证后)一个名为errorList的Map<String, Vector<ErrorMessage>>。这包含页面上的每个属性的错误列表。同样的jsp也用于数据的初始输入,在这种情况下,不会有地图可用。EL空条件不能按预期工作

有,否则我创建了下面的表达式:

<c:if test="${not empty errorList}"> 
    <div class="warningbox"> 
     <div class="warning"> 
      <c:forEach var="error" items="${errorList['PropertyAttribute.KIND']}"/> 
       test: ${error.errorMessage} 
      </c:forEach> 
     </div> 
    </div> 
</c:if> 

事我会想到:
1.在填写首次在errorList不存在(甚至通过检查验证request.getAttributeNames()。因此if体不应该被执行,不是真的,实际上if体被执行... 为什么
2.当Vector为空时,永远不应该执行forEach体。在rea在网页上的结果是“测试:”。这只是很荒谬。

也许不是一个不重要的事实。我使用谷歌应用程序引擎

+0

@JB Nizet。上面不是100%准确的代码。我目前没有我的代码,只是为了解释我的问题。 $ {errorList ['attributeName']} – Juru 2012-07-11 10:33:44

+0

已将代码更改为实际代码。 – Juru 2012-07-11 10:58:40

回答

1

我看到三种可能性:

  1. errorList(这确实应该被命名为errorMap)出现在请求属性,而不是空的(但你排除了这种可能性)
  2. ,有一个页面,或会话或名为errorList的应用程序范围属性不为空。你可以通过使用${not empty requestScope.errorList}来排除这种情况。
  3. 您会在页面上看到“测试”,因为EL被忽略或者因为核心标记库没有在JSP中声明。检查生成的HTML代码以查看它的外观。
+0

谢谢,会试试! – Juru 2012-07-11 14:51:59

+0

解决!我在包含核心库时遇到了错误,谢谢! – Juru 2012-07-12 05:34:09

+0

显然你不能直接链接到我的例子中的枚举PropertyAttribute,因为EL没有直接访问java类。为了克服这个问题,我不得不在EL中用<%= PropertyKind.KIND.toString()%>设置一个新的变量。使用这个新的var然后作为地图上的键的作品。但对我而言,这是EL中缺少的东西。它使我的页面更具动态性,只有一个地方可以更改表单项名称。 – Juru 2012-07-12 05:38:40