【问题标题】:Highlight rows in a table with Struts2使用 Struts2 突出显示表格中的行
【发布时间】:2011-09-07 19:48:31
【问题描述】:

我正在预处理用户上传的一些数据,我想告诉他们是否有任何数据行无效。我认为检查每一行是有意义的,如果有错误将该行号添加到错误行的哈希集中,然后在输出时检查当前索引是否在哈希集中,并突出显示该行。

这里是相关的jsp:

    <table>
        <tr>
            <s:iterator value="prettyNames">
                <th><s:property /></th>
            </s:iterator>
        </tr>
        <s:iterator value="importList" status="stat">
            <tr class="class="${lineErrors.contains(%{#stat.index}) ? 'highlight' : ''}"">
                <s:iterator>
                    <td><s:property /></td>
                </s:iterator>
            </tr>
        </s:iterator>
    </table>

其中 highlight 将背景颜色设置为红色。但是我在 Eclipse 中收到警告说“”测试“不支持运行时 表达式”,页面返回 500 错误,“根据 TLD 或标记文件中的属性指令,属性测试不接受任何表达式”。

突出显示表格中任意行的正确方法是什么?

【问题讨论】:

  • jonathan.cone 的回答应该是正确的。但是您需要确保public Set&lt;Integer&gt; getLineErrors() {} 存在于操作类中。

标签: java jsp struts2


【解决方案1】:

您看到此错误的原因是因为您尝试评估 Struts2 标记属性内的标准 JSP EL 表达式,在本例中为“test”。您需要将 OGNL 表示法与 S2 标记一起使用,如下所示(假设 lineErrors 针对 ValueStack 解析):

<table>
    <tr>
        <s:iterator value="prettyNames">
            <th><s:property /></th>
        </s:iterator>
    </tr>
    <s:iterator value="importList" status="stat">
        <s:if test="%{lineErrors.contains(#stat.index)}">
            <tr class="highlight">
                <s:iterator>
                    <td><s:property /></td>
                </s:iterator>
            </tr>
        </s:if>
        <s:else>
            <tr>
                <s:iterator>
                    <td><s:property /></td>
                </s:iterator>
            </tr>           
        </s:else>
    </s:iterator>
</table>

当然,更短的方式是这样的,将 S2 属性标签嵌套在类属性中,但这样可读性较差:

<table>
    <tr>
        <s:iterator value="prettyNames">
            <th><s:property /></th>
        </s:iterator>
    </tr>
    <s:iterator value="importList" status="stat">
        <tr class="<s:property value='%{lineErrors.contains(#stat.index) ? "highlight" : ""}' />">
            <s:iterator>
                <td><s:property /></td>
            </s:iterator>
        </tr>           
    </s:iterator>
</table>

【讨论】:

  • 这个结果是服务页面源中的&lt;tr class="class="%{lineErrors.contains(#stat.index) : 'highlight' : ''}"&gt; 行。它没有得到评估。
  • OGNL 表达式不会在 Struts2 标记属性之外进行计算。用您正在尝试的内容更新您的源代码示例,我将发布一个更完整的示例。现在,您的示例显示“
  • 好的,Java Drinker 的回答表明他们可以。我的问题中发布的是我目前正在尝试的 JSP。
  • 您在 S2 操作中有一个名为 lineErrors 的集合,其中的 getter 名为 getLineErrors?
  • 有一个很好的例子,通过使用迭代器状态对象的奇数和偶数属性来构建具有交替行的表:struts.apache.org/2.0.14/docs/iterator.html
【解决方案2】:

你拥有它的方式不是有效的 XHTML。你不能在任何你喜欢的地方开始&lt;tr&gt;标签。我会将其重写为类似

<tr class="${lineErrors.contains(%{#stat.index}) ? 'highlight' : ''}">
    <!--whatever-->
</tr>

这就是我在 Facelets 中会做的事情,所以 EL 在 struts 中的工作方式可能相同。我不确定我是否理解正在发生的 %{#... 疯狂

【讨论】:

  • 好的,谢谢,不知道你可以在jsp中做一个三元运算符。不过,与我的问题无关,因为将条件更改为,例如,true 工作得很好。我也不明白%{# 的疯狂,我只是在学习这个:P
  • 如果变量不是来自您的操作,则为变量添加前缀#。 %{expression} 将表达式表示为 OGNL 表达式,大多数 struts2 标签都假设是这种情况,不需要将表达式包装在 %{} 中。
猜你喜欢
相关资源
最近更新 更多
热门标签