Я дам вам ответ, аналогичный ответу Евгения, но более точный.Но мне нужно сделать следующие предположения:
- Каждая из ваших строк должна иметь округленное значение ( количество элементов / количество столбцов ) вместо ( длинасписка / общее количество элементов ), поскольку в этом выражении ваши столбцы всегда будут иметь 1 элемент.
- Ваш контекст JSP имеет следующие атрибуты:
- значения :коллекция или массив, содержащий все элементы
- numRows : целочисленное значение, определяющее количество строк для распространения вашего списка
Firstиз-за того, что вы не можете использовать никакой скриптлет, вам понадобятся следующие объявления 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>
В этом примере я сначала округляю значение деления, чтобы вычислить количество отображаемых строк (см. Ответ Как округлить число в JSTL? ).Затем итерация по элементам для генерации строк и столбцов начинается почти так же, как это делал Евгений.Основное отличие состоит в том, что вам нужно будет выполнить проверку индекса перед доступом к вашему списку, и в случае, если ваш индекс выходит за границы, просто визуализируйте « неразрывный пробел », чтобы ваша таблица была «правильной HTML».».