如何使用JSTL在列中写出对象数组

时间:2012-03-23 21:40:09

标签: java jsp jstl

我有一个JSP,我正在显示项目列表。项目列表将放入垂直列。每行应具有(列表长度)/(总行数),如果有余数则向上舍入。现在我们正在做两列,但我们希望自由改变列数。

我的工作不喜欢scriptlet,那么使用JSTL将列表分成相等列的最佳方法是什么?

3 个答案:

答案 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相似的答案,但更准确一点。但我需要做出以下假设:

  • 每个行的舍入值应为(项目数/列数),而不是(列表长度/项目总数),因为该声明您的列将始终包含1个项目。
  • 您的JSP上下文具有以下属性:
    • :包含所有元素的集合或数组
    • numRows :定义分发列表的行数的整数值

首先,由于您无法使用任何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>&nbsp;</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>