使用JSTL forEach时,数组打印String.toString()而不是实际的字符串值

时间:2011-12-19 16:11:54

标签: java jsp jstl

我有以下代码:

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 个答案:

答案 0 :(得分:14)

您错误地引用了items值。 Taglibs / EL和 scriptlet 不共享相同的变量范围。您基本上在columnHeaders.toString()属性中打印items并告诉c:forEach迭代它。相反,您需要将它放在请求范围内(最好是通过servlet)并以正常方式使用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变量,引用了请求标题映射(请参阅implicit objects in EL),您需要将其重命名为其他内容,例如上面的${columnHeader}示例

另见:


对具体问题

无关,表格标题需要由<th>以HTML格式表示,而不是<td>

答案 1 :(得分:2)

这个帖子很老了但是认为它会很有用。

如果您没有义务使用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>