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

Rue*_*pen 7 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>
Run Code Online (Sandbox Code Playgroud)

执行JSP时,将打印以下值:

org.apache.commons.el.ImplicitObjects$7@6ac86ac8 
org.apache.commons.el.ImplicitObjects$7@6ac86ac8 
...
Run Code Online (Sandbox Code Playgroud)

在我看来,正在打印内存值,而不是每个字符串中包含的值.我在这里错过了什么?

Bal*_*usC 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>
Run Code Online (Sandbox Code Playgroud)

另外,${header}是一个引用请求标头映射的保留EL变量(请参阅EL中的隐式对象),您需要将其重命名为其他内容,例如${columnHeader}上例中的内容.

也可以看看:


具体问题无关,表标题需要用HTML表示<th>,而不是<td>.