2011-09-07 32 views
3

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

下面是相关的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> 

在高亮设置背景颜色为红色。然而,我在Eclipse中得到一个警告,说“”test“不支持运行时 表达式”并且页面返回500错误,“根据标记文件中的TLD或属性指令,属性测试不接受任何表达式”。

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

+0

jonathan.cone的答案应该是正确的。但是你需要确保'public Set getLineErrors(){}'存在于action类中。 – lschin

回答

1

您看到此错误的原因是因为您试图在Struts2标记属性内评估标准JSP EL表达式,在这种情况下,“test” 。您需要使用OGNL符号与S2标签,像这样(假设lineErrors解析对值栈):

<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> 
+0

这样做的结果是在服务页面源代码中的行>它没有得到 – dimo414

+0

OGNL表达式不会评估Struts2标签属性以外的内容,请更新您的源代码示例,我将发布一个更完整的示例。现在,您的示例显示“

+0

好吧,Java Drinker的回答建议他们可以,我的问题是我正在尝试使用的JSP – dimo414

0

你拥有它的方式是无效的XHTML。你不能让<tr>标签在你喜欢的地方开始。像

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

这就是我会做类似的Facelets,所以大概在EL工作在支柱相同的方式,我会重新写的东西。我不确定我是否理解%{#...这种情况的发生

+0

好的,谢谢,不知道你可以在jsp中做一个三元运算符。不过,与我的问题无关,因为将条件更改为,例如,“true”工作得很好。我不明白'%{#'疯狂,我只是学习这个:P – dimo414

+1

前缀#如果它不是来自你的行动的变量。 %{expression}将表达式表示为一个OGNL表达式,大多数struts2标签假定这是这种情况,并且不需要将表达式包装在%{}中。 – Quaternion