Как выписать массив объектов в столбцах, используя JSTL - PullRequest
0 голосов
/ 24 марта 2012

У меня есть JSP, на котором я отображаю список элементов.Список предметов будет размещен в вертикальных столбцах.Каждая строка должна иметь (длина списка) / (общее количество строк), округляя вверх, если есть остаток.Прямо сейчас мы делаем два столбца, но нам нужна свобода изменять количество столбцов.

Моя работа не любит скриплетов, так как лучше разделить список на равные столбцы с помощью JSTL?

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

Вы можете сделать что-то вроде этого:

        <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 голос
/ 25 марта 2012

Я дам вам ответ, аналогичный ответу Евгения, но более точный.Но мне нужно сделать следующие предположения:

  • Каждая из ваших строк должна иметь округленное значение ( количество элементов / количество столбцов ) вместо ( длинасписка / общее количество элементов ), поскольку в этом выражении ваши столбцы всегда будут иметь 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>&nbsp;</c:otherwise>
                </c:choose>
             </td>
         </c:forEach>
      </tr>
   </c:forEach>
</table>

В этом примере я сначала округляю значение деления, чтобы вычислить количество отображаемых строк (см. Ответ Как округлить число в JSTL? ).Затем итерация по элементам для генерации строк и столбцов начинается почти так же, как это делал Евгений.Основное отличие состоит в том, что вам нужно будет выполнить проверку индекса перед доступом к вашему списку, и в случае, если ваш индекс выходит за границы, просто визуализируйте « неразрывный пробел », чтобы ваша таблица была «правильной HTML».».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...