【问题标题】:Struts 2: s:if inside s:iterator not workingStruts 2:s:if 内部 s:iterator 不工作
【发布时间】:2011-08-30 16:05:24
【问题描述】:

我有一个关于 struts 2 和 s:if 标签的问题。根据 s:if 以下示例的文档中的描述:

...
<s:iterator value="questao.alternativas" status="alternativa">
    <tr>
        <td>
            <s:if test="#alternativa.correta == true">Correta!</s:if>
        </td>
    </tr>
</s:iterator>
...

但这不适用于我的情况,您能帮忙吗?更多详情:

questao.alternativas 在动作中找到并且工作正常,所有“alternativas”都是“迭代”的!

getCorreta() 方法永远不会在上述示例中调用。

当使用值 true 时被打印出来。

有什么想法吗??

谢谢!

【问题讨论】:

    标签: struts2 if-statement iterator


    【解决方案1】:

    iterator 标记中指定status 会将IteratorStatus 的实例推送到值堆栈上。您需要查阅 IteratorStatus 的文档以了解要使用的有效属性,并且 correta 不是有效属性。如果您想访问当前迭代的对象,请指定 var 属性。

    编辑评论:
    没错,四元数说您不需要指定var 来访问当前迭代的对象。它已经在价值堆栈的顶部。

    【讨论】:

    • +1,因为参考了文档。不要使用 var 属性,除非你有嵌套的迭代器。在迭代器内部,当前对象位于值堆栈的顶部。如果alternativas 有一个名为“correta”的属性,请将您当前的if 语句替换为:Correta!...是的,就是这么简单...跨度>
    【解决方案2】:

    快速查看您的代码,我发现您正在引用条件(if)语句中的状态。您的条件应直接引用您正在迭代的列表中对象的访问器方法,例如:

    <s:iterator value="questao.alternativas" status="stat">
        <tr>
            <td>
                // If correta is a boolean value, there is not need to use an 
                // == operator at all
                <s:if test="%{correta}">
                    Correta!
                </s:if>
            </td>
        </tr>
    </s:iterator>
    

    当迭代器遍历提供的列表时,假设 questao.alternativas 是具有访问器方法的对象列表,您可以直接引用迭代器中的方法。

    迭代器中的状态使您可以访问迭代器的位置。例如,如果您想确定您的循环是否位于列表中的最后一个元素以执行某些特殊操作,您可以执行以下操作:

    <s:if test="%{#stat.last}">--- END OF LIST ---</s:if>
    

    或者获取当前元素在数组或列表中的索引位置:

    <s:property value=%{#stat.index} />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多