我正在预处理用户上传的一些数据,我想告诉他们数据的任何行是否无效。我认为检查每一行是有意义的,如果有错误将该行号添加到错误行的哈希集中,那么在输出时检查当前索引是否在哈希集中,并突出显示该行。
这是相关的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 :(得分:1)
您看到此错误的原因是您尝试评估Struts2标记属性中的标准JSP EL表达式,在本例中为“test”。你需要使用带有S2标签的OGNL表示法,如下所示(假设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属性标签嵌套在class属性中,但这样的可读性较差:
<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>
答案 1 :(得分:0)
你拥有它的方式不是有效的XHTML。您无法在任何地方开始<tr>
标记。我会把它重写为像
<tr class="${lineErrors.contains(%{#stat.index}) ? 'highlight' : ''}">
<!--whatever-->
</tr>
这就是我在Facelets中所做的事情,所以EL可能在struts中以相同的方式工作。我不确定我理解发生的%{#...
疯狂