Java 如何使用JSTL写出列中的对象数组
我有一个JSP,在上面显示项目列表。项目列表将放置在垂直列中。每行应具有(列表长度)/(总行数),如果有余数,则四舍五入。现在我们正在做两列,但我们希望能够自由地更改列数Java 如何使用JSTL写出列中的对象数组,java,jsp,jstl,Java,Jsp,Jstl,我有一个JSP,在上面显示项目列表。项目列表将放置在垂直列中。每行应具有(列表长度)/(总行数),如果有余数,则四舍五入。现在我们正在做两列,但我们希望能够自由地更改列数 我的工作不喜欢Scriptlet,那么使用JSTL将列表分成相等列的最佳方法是什么呢?您可以这样做: <c:forEach items="${elements}" step="5" varStatus="i"> <tr> <c
我的工作不喜欢Scriptlet,那么使用JSTL将列表分成相等列的最佳方法是什么呢?您可以这样做:
<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>
${index
此示例针对一行中的“5”元素。您可以将其更改为任何其他值。您可以执行以下操作:
<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>
${index
此示例针对一行中的“5”元素。您可以将其更改为任何其他值。我将给您一个与Evgeny给出的答案类似的答案,但更准确一点。但我需要做出以下假设:
- 您的每一行都应该有一个舍入值(项目数/列数),而不是(列表长度/项目总数),因为在该语句中,您的列将始终有一个项目
- 您的JSP上下文具有以下属性:
- 值:包含所有元素的集合或数组
- numRows:定义要分发列表的行数的整数值
<%@ 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>
在本例中,我首先对除法的值进行四舍五入,以计算要渲染的行数(请参见答案)。然后,通过项目生成行和列的迭代几乎完全像Evgeny那样开始。主要区别在于,在访问列表之前,您需要执行索引检查,如果您的索引超出范围,只需呈现一个“非中断空间”,这样您的表将是“HTML正确的”。我将给您一个与Evgeny的答案类似的答案,但更准确一点。但我需要做出以下假设:
- 您的每一行都应该有一个舍入值(项目数/列数),而不是(列表长度/项目总数),因为在该语句中,您的列将始终有一个项目
- 您的JSP上下文具有以下属性:
- 值:包含所有元素的集合或数组
- numRows:定义要分发列表的行数的整数值
<%@ 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>
在本例中,我首先对除法的值进行四舍五入,以计算要渲染的行数(请参见答案)。然后,通过项目生成行和列的迭代几乎完全像Evgeny那样开始。主要区别在于,在访问列表之前,您需要执行索引检查,如果索引超出范围,只需呈现一个“非中断空间”,这样您的表将是“HTML正确的”。在c中:如果标记将4的值更改为任意数字(您需要多少列)
${item}
在c:if标记中,将4的值更改为任意数字(您需要多少列)
${item}
我不确定我是否理解您的问题,您能否详细说明,也许可以用一些示例数据,以及您大致希望如何安排?很难理解/想象您实际想要实现的目标。我认为最好是显示生成的HTML应该是什么样子。然后更容易提出JSP/JSTL代码应该如何生成HTML。因此,如果列表中的项目数为7,我想:第1项第2项第3项第4项第5项第6项第7项我的答案不能解决问题吗?@EvgenyRetyunsky,这是一个很好的贡献,但Alsonso的答案正是我想说的。我不确定我是否理解你的问题,你能详细说明一下吗,也许可以用一些示例数据,以及你大致希望它是如何布置的?很难理解/想象你实际想要实现的目标。我认为最好是显示生成的HTML应该是什么样子。然后更容易提出JSP/JSTL代码应该如何生成HTML。因此,如果列表中的项目数为7,我想:第1项第2项第3项第4项第5项第6项第7项我的答案不能解决问题吗?@EvgenyRetyunsky,这是一个很好的贡献,但是阿尔松索的答案就是我想说的。如果你知道外环应该有5个。但是您需要计算内部循环中的项数吗?我在这方面遇到了麻烦,因为我在jstl的除法和取整方面遇到了麻烦。还有,最后一个我可以吗