<tr>
<th width="8%">
序号
</th>
<th width="20%">
会场名称
</th>
<th width="26%">
开始时间
</th>
<th width="26%">
结束时间
</th>
<th width="20%">
申请状态
</th>
</tr>
<%int index = 1;%>
<s:iterator var="s" value="#request.usageList">
<tr>
<td style="text-align:center">
<%=index++ %>
</td>
<s:if test="#strid!=#s.room_id">
<s:set id="strid" value="%{#s.room_id}"/>
<td rowspan="<s:property value="TOTAL_ROWS"/>" id="<s:property value="ROOM_ID"/>" style="text-align:center">
<a href="javascript:window.location.href='<%=path%>/conference_room_view.action?room_id=<s:property value="ROOM_ID"/>&opType=2';">
<s:property value="ROOM_NAME"/>
</a>
</td>
</s:if>
<td style="text-align:center">
<s:date name="START_DATE" format="yyyy-MM-dd HH:mm:ss"/>
</td>
<td>
<s:date name="END_DATE" format="yyyy-MM-dd HH:mm:ss"/>
</td>
<td style="text-align:center">
<%=CommonMethod.getConferenceStatus((String)request.getAttribute("STATUS")) %>
</td>
</tr>
</s:iterator>
解释一下吧,省的将来自己看的时候都想不起来了。
关键是红色部分,该列表时展示各个会议室的全部申请,因此,会议室和申请记录时一对多的关系。
每次循环都判断一次,看看当前记录中的ROOM_ID是不是和上一次的一样,如果一样则会议室名称的TD不构造。如果不一样,说明是新会议室,则声称TD。
rowspan="<s:property value="TOTAL_ROWS"/>"
这个是灵魂。
在第一次生成TD的时候就设置TD的占得行数,这样就能实现一对多的展示了。但是这个TOTAL_ROWS怎么来,就要靠SQL的分析函数了:
COUNT(ROWID) OVER (PARTITION BY ROOM_ID) TOTAL_ROWS
在查询项中添加上面这一项,就OK了。具体什么意思,自己去看看SQL的解释吧(ORACLE)。
美中不足的是,如果是分页显示的话效果不太理想。

本文介绍了如何利用Struts2的`s:iterator`标签在JSP页面上以表格形式展示会议室和其多个申请记录的一对多关系。关键在于通过比较当前记录的ROOM_ID与上一条的差异,结合SQL的分析函数来确定`rowspan`,从而实现数据的正确布局。在分页显示时,这种方法可能面临挑战。
1203

被折叠的 条评论
为什么被折叠?



