2012-07-13 114 views
0

我在包含元素{a,b,c,d,e,g,h,y,t}的struts2类中有一个列表。 我想显示该列表以表的格式是这样的:如何以表格格式在jsp页面上显示列表

A B C

d例如

ħý吨

这意味着每行3个元件。 我使用“s:iterator”和“s:property”标签。

+0

是这个功课吗?提供代码 – 2012-07-13 09:01:12

+0

如果在JSP中很难做到这一点,那么可以在您的操作中使用Java来完成此操作,并将此新的'List '(每行包含1到3个值)传递给JSP。 – 2012-07-13 09:27:36

+0

感谢alli得到了我的逻辑 – ankit 2012-07-13 09:27:40

回答

0

看起来很容易。

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

UPDATE

如果你不想使用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> 
+0

你喜欢子集...但是这可以通过检查迭代器索引并进行单个数字比较来处理。这大大减少了代码重复。你的例子也省略了最后的行和单元格。 – 2012-07-13 12:35:14

+0

@DaveNewton haha​​ha ...是的,你说得对,但你不觉得'subset'更快吗? – Jaiwo99 2012-07-13 12:52:16

+0

我怀疑三个子集会比单个数字比较快,但也许。更令人困惑的是,还有3倍的来源。 – 2012-07-13 12:58:04

0

我的方法是在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-layer-only方法的问题在于,如果您希望能够从视图层设置列计数(合理的愿望),则需要将列计数设置为Java。 OGNL可以让我们调用任意方法,所以最终我可能会实现一个小工具,创建嵌套列表:

<s:iterator value="@[email protected](items, 3)"> 
    ... 

但是我换了一个自定义标签,因为(a)它的丑陋,和(b)它干扰主线JSP。与Rails中的partials类似,应该重构显示对象列表,其中包含:

<app:showItems items="..." columns="..." />