При использовании JSTL forEach массив печатает String.toString (), а не фактическое строковое значение - PullRequest
7 голосов
/ 19 декабря 2011

У меня есть следующий код:

String[] columnHeaders = {"Banana", "Apple", "Carrot", "Orange", "Lychee", "Permisson"};

<c:forEach var="header" items="<%= columnHeaders%>">
    <td>
        <c:out value="${header}" />
    </td>
</c:forEach>

Когда выполняется JSP, печатаются следующие значения:

org.apache.commons.el.ImplicitObjects$7@6ac86ac8 
org.apache.commons.el.ImplicitObjects$7@6ac86ac8 
...

Мне кажется, что значение памяти печатаетсяа не значение, содержащееся в каждой строке.Что мне здесь не хватает?

Ответы [ 2 ]

14 голосов
/ 19 декабря 2011

Вы неверно ссылаетесь на значение items. Taglibs / EL и скриптлеты не используют одну и ту же область видимости переменных. По сути, вы печатаете columnHeaders.toString() в атрибуте items и говорите c:forEach, чтобы перебрать его. Вместо этого вам нужно поместить его в область запроса (предпочтительно с помощью сервлета) и использовать EL ${} обычным способом:

<%
    String[] columnHeaders = {"Banana", "Apple", "Carrot", "Orange", "Lychee", "Permisson"};
    request.setAttribute("columnHeaders", columnHeaders);
%>

<c:forEach var="columnHeader" items="${columnHeaders}">
    <td>
        <c:out value="${columnHeader}" />
    </td>
</c:forEach>

Кроме того, ${header} - это зарезервированная переменная EL, относящаяся к карте заголовка запроса (см. неявные объекты в EL ), вам нужно переименовать ее во что-то еще, например ${columnHeader} в пример выше.

Смотри также:


Не связанный с конкретной проблемой, заголовки таблицы должны быть представлены в HTML как <th>, а не <td>.

2 голосов
/ 15 августа 2014

Эта ветка довольно старая, но, тем не менее, она будет полезна.

Если вы не обязаны использовать String[], вы можете использовать Collection<String> или List<String>.

Если вы сделаете это, вам не нужно помещать переменную в область запроса.

Например, должно работать что-то вроде следующего:

List<String> columnHeaders = Arrays.asList("Banana", "Apple", "Carrot", "Orange", "Lychee", "Permisson");

<c:forEach var="columnHeader" items="${columnHeaders}">
    <td>
        <c:out value="${columnHeader}" />
    </td>
</c:forEach>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...