请教:用struts2的标签如何控制td的rowspan?

时间:2021-01-31 20:22:07
我的数据是如下结构:userList里面有N个userinfo,每个userinfo里面包含username及itemList,itemList里面包含N个item,每个item包含itemname及num。

希望画面的样子是:输出userList的信息列表,一行的对应项目为:username,itemname,num。但是username相同的情况下,要合并为1个。

我现在的情况是:可以输出我需要的内容,但是username用td的rowspan时不知该如何控制了。目前状态是写死了,但是实际情况不可能是固定值。

以下是我的程序,使用的struts2的标签库,请指教:
<table width="400" align="center">
<!-- 输出表头 -->
<tr>
<td>姓名</td>
<td>年龄</td>
<td>道具名称</td>
<td>个数</td>
</tr>
<!-- 循环userList -->
<s:iterator value="userList" id="userinfo" status="idx">
<tr>
<!-- 输出username,这里的rowspan不知道该如何控制,目前用固定值 -->
<td rowspan="2"><s:property value="#userinfo.name"></s:property></td>
<td rowspan="2"><s:property value="#userinfo.age"></s:property></td>
<!-- 循环输出item信息 -->
<s:iterator value="#userinfo.items" id="item" status="idx1">
<s:if test="#idx1.index==0">
<!-- 如果是该user的第一件道具,则不换行显示 -->
<td><s:property value="#item.itemName"></s:property></td>
<td><s:property value="#item.num"></s:property></td>
</s:if>
<s:else>
<!-- 第一件以外的道具,换行显示 -->
<tr>
<td><s:property value="#userinfo.items.size"></s:property></td>
<td><s:property value="#item.num"></s:property></td>
</tr>
</s:else>
</s:iterator>
</tr>
</s:iterator>
</table>

5 个解决方案

#1


我觉得可以在后台得到所有的去重后的username放到集合中,然后用双重循环来做
大概意思为:
<s:iterator value="nameList" id="name" status="idx">
<tr>
 <td>${name}</td>

 <td>
 <s:iterator value="userList" id="userinfo" status="idx">

 <s:if test="#name==#userinfo.name">
  <s:property value="#userinfo.name"></s:property>
    ......
 </s:if>

 </s:iterator>
</td>
</tr>
</s:iterator> 


也不知道能不能帮上你

#2


建议不要用标签来做,不好控制,你可以采用JQuery或者js实现,相当于前台显示的那个table你可以通过js先拼装好,然后在展现,这样子js你可以针对任意的td合并获取其他操作,你觉得?

#3


大体思路:
1、先弄个div
2、通过js实现table
3、把table赋值给div
或者
1、先弄个table带id的
2、js实现他的tr、td
3、最后赋值给ttable

#4


你算出每个itemList的长度 然后赋值给rowspan不就行了

#5


谢谢大家的帮忙,问题我已经解决了。其实也很简单,后来发现s:property标签返回的是不附带任何标签的值,所以只需要嵌入进去就可以了,以下是代码:
<td rowspan="<s:property value='#userinfo.items.size'></s:property>">
本来也想用jquery解决,但是为id编号的会有同样的问题,而且不太喜欢jquery,感觉不利于维护。总之谢谢大家了。

#1


我觉得可以在后台得到所有的去重后的username放到集合中,然后用双重循环来做
大概意思为:
<s:iterator value="nameList" id="name" status="idx">
<tr>
 <td>${name}</td>

 <td>
 <s:iterator value="userList" id="userinfo" status="idx">

 <s:if test="#name==#userinfo.name">
  <s:property value="#userinfo.name"></s:property>
    ......
 </s:if>

 </s:iterator>
</td>
</tr>
</s:iterator> 


也不知道能不能帮上你

#2


建议不要用标签来做,不好控制,你可以采用JQuery或者js实现,相当于前台显示的那个table你可以通过js先拼装好,然后在展现,这样子js你可以针对任意的td合并获取其他操作,你觉得?

#3


大体思路:
1、先弄个div
2、通过js实现table
3、把table赋值给div
或者
1、先弄个table带id的
2、js实现他的tr、td
3、最后赋值给ttable

#4


你算出每个itemList的长度 然后赋值给rowspan不就行了

#5


谢谢大家的帮忙,问题我已经解决了。其实也很简单,后来发现s:property标签返回的是不附带任何标签的值,所以只需要嵌入进去就可以了,以下是代码:
<td rowspan="<s:property value='#userinfo.items.size'></s:property>">
本来也想用jquery解决,但是为id编号的会有同样的问题,而且不太喜欢jquery,感觉不利于维护。总之谢谢大家了。