我在 struts2 类中有一个列表,其中包含元素 {a,b,c,d,e,g,h,y,t}。我想以表格格式显示此列表,如下所示:
美国广播公司
度
海特
这意味着每行三个元素。我正在使用“s:iterator”和“s:property”标签。
我的方法是在 JB 的“在 Java 端做”和 Jaiwo 的“在视图中做”的中间。
我更喜欢使用列数的自定义标签,拆分列表,如果它不是列数的偶数倍,则添加空元素,并将所有逻辑包装在一个漂亮的小包中。
对于仅视图层的方法,我将使用 Jaiwo 代码的变体。对于子集的想法,我会将它们分解成一个有凝聚力的块,但仍然进行双重迭代——IMO 这更清楚:
<s:set var="items" value="{1,2,3,4,5,6,7,8,9}" />
<s:subset var="list1" source="#items" start="0" count="3" />
<s:subset var="list2" source="#items" start="3" count="3" />
<s:subset var="list3" source="#items" start="6" count="3" />
<s:set var="nested" value="{#attr.list1, #attr.list2, #attr.list3}" />
<table>
<s:iterator value="#nested">
<tr>
<s:iterator>
<td><s:property /></td>
</s:iterator>
</tr>
</s:iterator>
</table>
当列表不是列数的偶数倍时,这就会崩溃。您不能(轻松)将项目附加到子集(它不是列表,它是迭代器),并且在 JSP 中将项目添加到原始列表很笨拙。
仅 Java 层方法的问题在于,如果您希望能够从视图层设置列数(合理的愿望),则需要将列数设置为 Java。OGNL 允许我们调用任意方法,所以最终我可能会实现一个创建嵌套列表的小实用程序:
<s:iterator value="@utils@slice(items, 3)">
...
但我会将它包装在一个自定义标记中,因为 (a) 它很丑,并且 (b) 它会使主线 JSP 混乱。与 Rails 中的 partials 类似,对象列表的显示应该被重构出来,留下:
<app:showItems items="..." columns="..." />
似乎很容易。
<table>
<tr>
<s:subset source="{1,2,3,4,5,6,7,8,9}" count="3" start="0">
<s:iterator>
<td><s:property /></td>
</s:iterator>
</s:subset>
</tr>
<tr>
<s:subset source="{1,2,3,4,5,6,7,8,9}" count="3" start="3">
<s:iterator>
<td><s:property /></td>
</s:iterator>
</s:subset>
</tr>
<tr>
<s:subset source="{1,2,3,4,5,6,7,8,9}" count="3" start="6">
<s:iterator>
<td><s:property /></td>
</s:iterator>
</s:subset>
</tr>
</table>
更新
如果你不想使用subset
,这里是替代方案。
<table>
<s:iterator value="{1,2,3,4,5,6,7,8,9}" status="status">
<s:if test="%{#status.index == 0}"><tr><td><s:property /></td></s:if>
<s:elseif test="%{#status.index%3 == 0}">
</tr><tr><td><s:property /></td>
</s:elseif>
<s:else>
<td><s:property /></td>
</s:else>
</s:iterator>
</tr>
</table>