我有一个JSP,我正在显示项目列表。项目列表将放入垂直列。每行应具有(列表长度)/(总行数),如果有余数则向上舍入。现在我们正在做两列,但我们希望自由改变列数。
我的工作不喜欢scriptlet,那么使用JSTL将列表分成相等列的最佳方法是什么?
答案 0 :(得分:2)
您可以这样做:
<c:forEach items="${elements}" step="5" varStatus="i">
<tr>
<c:forEach begin="0" end="4" varStatus="j">
<c:set var="index" value="${i.index * 5 + j.index}"/>
<td>
${index < fn:length(elements) ? elements[index] : ""}
</td>
</c:forEach>
</tr>
</c:forEach>
此示例适用于连续的“5”元素。您可以将其更改为任何其他值。
答案 1 :(得分:1)
我会给你一个与Evgeny相似的答案,但更准确一点。但我需要做出以下假设:
首先,由于您无法使用任何scriptlet,因此需要以下taglib声明:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
现在,要构建项目网格,您将编写与此类似的内容:
<table>
<c:forEach begin="0" end="${numRows - 1}" varStatus="i">
<c:set var="rowStart" value="${i.index * numColumns}" />
<tr>
<fmt:formatNumber var="numColumns" value="${fn:length(values) / numRows}"
maxFractionDigits="0" />
<c:forEach begin="0" end="${numColumns - 1}" varStatus="j">
<c:set var="index" value="${rowStart + j.index}"/>
<td>
<c:choose>
<c:when test="${index lt fn:length(values)}">
<%-- Replace following code with the one needed to display your item --%>
<c:out value="${values[index]}" />
</c:when>
<c:otherwise> </c:otherwise>
</c:choose>
</td>
</c:forEach>
</tr>
</c:forEach>
</table>
在这个例子中,我首先舍入除法的值来计算要渲染的行数(参见答案How do I round a number in JSTL?)。然后迭代通过项目生成行和列几乎完全像Evgeny那样。主要区别在于您需要在访问列表之前执行索引检查,如果您的索引超出范围,只需渲染一个&#34; 非破坏空间&#34;所以你的表格将是&#34; HTML正确&#34;。
答案 2 :(得分:0)
在c:if标记中,将4的值更改为任意数字(所需的列数)
<tr>
<c:forEach items="${list}" var="item" varStatus="mycount">
<td>${item}</td>
<c:if test="${mycount.count % 4 eq 0}">
<c:out value="</tr><tr>" escapeXml="false"></c:out>
</c:if>
</c:forEach>
</tr>