如何在JSP页面</c:foreach>中停止重复JSTL的内部<c:foreach>标记中的行

时间:2015-02-24 04:46:33

标签: java jsp foreach jstl

内部foreach标记下的我的行正在重复外部forEach标记的所有值。 我的代码是

<c:forEach var="row" items="${ref.refarray_vac1(param.datepicker)}">
<c:forEach var="r" items="${ref.refernece(param.ref_logtime)}"> 


<tr bgcolor="darkgray ">
<td><c:out value="${r.logtime}"></c:out></td>

<td>
<c:choose><c:when test="${(r.beam_current) ne 0}"> 
<fmt:formatNumber value="${r.beam_current}" maxFractionDigits="2"    minIntegerDigits="2" pattern="##.##" var="mm"></fmt:formatNumber>
${(mm)}
</c:when>
<c:otherwise>
${r.beam_current}</c:otherwise></c:choose></td>


<td>
<c:choose><c:when test="${(r.beam_energy) ne 0}"> 
<fmt:formatNumber value="${r.beam_energy}" maxFractionDigits="2" minIntegerDigits="2" pattern="##.##" var="mm"></fmt:formatNumber>
${(mm)}
</c:when>
<c:otherwise>
${r.beam_energy}</c:otherwise></c:choose></td>


<td>
<c:choose><c:when test="${(r.st2_vs2_bag1_rb) > 0.0}">
<fmt:formatNumber value="${r.st2_vs2_bag1_rb}" maxFractionDigits="2" minIntegerDigits="2" pattern="##.##E0" var="mm"></fmt:formatNumber>
${(mm)}
</c:when>
<c:otherwise>
<c:out value="OFF"></c:out> </c:otherwise></c:choose></td>

<tr bgcolor="cornsilk">

<td><c:out value="${row.logtime}"></c:out></td>

<td>
<c:choose><c:when test="${(row.beam_current) > 0.0}"> 
<fmt:formatNumber value="${row.beam_current}" maxFractionDigits="2" minIntegerDigits="2" pattern="##.##" var="mm"></fmt:formatNumber>
 ${(mm)}
 </c:when>
 <c:otherwise>
 ${row.beam_current}</c:otherwise></c:choose></td>


<td>
<c:choose><c:when test="${(row.beam_energy) > 0.0}"> 
<fmt:formatNumber value="${row.beam_energy}" maxFractionDigits="2" minIntegerDigits="2" pattern="##.##" var="mm"></fmt:formatNumber>
${(mm)}
</c:when>
<c:otherwise>
${row.beam_energy}</c:otherwise></c:choose></td>


<td>
<c:choose><c:when test="${(row.st2_vs2_bag1_rb) > 0.0}"> 
<fmt:formatNumber value="${row.st2_vs2_bag1_rb}" maxFractionDigits="2" minIntegerDigits="2" pattern="##.##E0" var="mm"></fmt:formatNumber>
 ${(mm)}
</c:when>
<c:otherwise>
<c:out value="OFF"></c:out></c:otherwise></c:choose></td>

</c:forEach>
</c:forEach>

我希望只有一个外部forEach循环的值只显示一个内部forEach循环的值。不应该重复内部forEach循环行。

修改-1 我显示的输出是以下形式 - enter image description here

浅色显示的值(beam_current 10.01)为灰色的每个值重复。假设外部ForEach标记有22行,那么内部循环的每个值将重复22次。 / p>

我希望当beam_current为灰色10时,10.01应该只显示一次,然后应该显示内部forEach循环的另一个值,对应于灰色的beam_current 20.02,依此类推。 < / p>

2 个答案:

答案 0 :(得分:1)

对于内循环,请使用end="0"

c:forEach属性

它将迭代循环,仅针对内部forEach的第一项。

<c:set var="count" value="0" scope="page" />
<c:forEach var="row" items="${ref.refarray_vac1(param.datepicker)}">
    <c:forEach var="r" items="${ref.refernece(param.ref_logtime)}" begin="${count}" end="${count}"> 
        ...
        ...

        <c:set var="count" value="${count + 1}" scope="page" />
    </c:forEach>
</c:forEach>

答案 1 :(得分:0)

听起来你想要使用相同的索引遍历每个集合,就像在这个伪代码中一样:

listA = [x, y, z]
listB = [a, b, c]
for (int i = 0; i < 3; i++):
  print listA[i]
  print listB[i]

为此,您需要删除其中一个forEach循环,并使用剩余循环的索引来访问其他集合。例如:

<c:forEach var="listAValue" items="${listA}" varStatus="i">
  <c:out value="${listA[i.count]}" />
  <c:out value="${listB[i.count]}" />

我希望这会有所帮助,但如果不这样做,我建议你澄清一下你的问题。