【问题标题】:struts2 contains test in iterator tagstruts2 在迭代器标签中包含测试
【发布时间】:2011-12-12 08:43:05
【问题描述】:

这是我在 jsp 中的代码:

<s:iterator value="sources" status="sourceStatus">
  <s:property value="sourcesCheck"/>
  <s:property value="#sourceStatus.index"/>
  <s:if test="%{sourcesCheck.contains(#sourceStatus.index)}">
    true
  </s:if>
  <s:else>
    false
  </s:else>
</s:iterator>

sourcesCheck 是我从我的操作中传递的一个数组,其中填充了值 0、1、2、3、4、5。我的 jsp 上的结果显示 sourcesCheck 为 0,1,2,3,4,5,但是,测试总是错误的。为什么?我已经尝试过为 sourcesCheck 使用 int 和 String 值。包含如何工作?如果 index 不是 String 或 int,它是什么?

【问题讨论】:

  • Ischin 的答案之外的另一个选择是使用类似 Apache Commons 的 ArrayUtils.contains 类,但 IMO 一个真正的集合是一个更好的主意。

标签: java struts2 iterator contains


【解决方案1】:

使用此代码:

        <s:iterator value="sources" status="sourceStatus">
            <s:property value="sourcesCheck"/>
            <s:property value="#sourceStatus.index"/>
            <s:if test="%{#sourceStatus.index in sourcesCheck}">
                true
            </s:if>
            <s:else>
                false
            </s:else>
        </s:iterator>

【讨论】:

  • 这也行不通; sourcesCheck 是一个数组,永远不会等于整数。
  • @DaveNewton 感谢您的通知。 :) 我将源错误解释为数组,将源检查错误解释为整数属性。
  • 感谢 Dave 和 James,虽然我最终使用 == 并通过一些操作设法得到了我想要的东西,但我测试了这段代码,它工作正常。
【解决方案2】:

Array 没有任何方法可以实现。考虑java.util.List

例如

List<Integer> sourcesCheck = Arrays.asList(0, 1, 2, 3, 4, 5);

比较java.util.List.contains(Integer)

<s:if test="sourcesCheck.contains(#sourceStatus.index)">

</s:if>

【讨论】:

    【解决方案3】:

    我觉得应该是这样的

    <s:if test="%{sourcesCheck.contains('#sourceStatus.index')}">
    

    因为你想检查一个值而不是一个变量。

    【讨论】:

    • 如何在表达式中使用双引号?
    • @James 有时编译器可以处理它。一个很好的例子是 JSTL。但在这种情况下不要使用撇号。
    • 在这种情况下,表达式应该类似于 test="%{sourcesCheck.contains('#sourceStatus.index')}"
    • 编辑以反映@JamesJithin 的评论。在 JSP 标记内部,没有编译器允许您在包装属性值和在该值内部使用相同的引号。这与在 HTML 标记属性中嵌入自定义标记不同。
    猜你喜欢
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    相关资源
    最近更新 更多