Java 使用JSTL forEach时,数组将打印String.toString()而不是实际的字符串值
我有以下代码:Java 使用JSTL forEach时,数组将打印String.toString()而不是实际的字符串值,java,jsp,jstl,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
String[] columnHeaders = {"Banana", "Apple", "Carrot", "Orange", "Lychee", "Permisson"};
<c:forEach var="header" items="<%= columnHeaders%>">
<td>
<c:out value="${header}" />
</td>
</c:forEach>
在我看来,打印的是内存值,而不是每个字符串中包含的值。
我在这里遗漏了什么?您错误地引用了
项
值。Taglibs/EL和Scriptlet不共享相同的变量范围。基本上是在items
属性中打印columnHeaders.toString()
,并告诉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变量(请参阅),在上面的示例中,您需要将其重命名为其他变量,例如${columnHeader}
另见:
与具体问题无关,表头需要用HTML表示为
,而不是
这个线程非常古老,但认为它仍然有用
如果您没有义务使用字符串[]
,则可以使用集合
或列表
如果这样做,就不必在请求范围中放入变量
例如,类似于以下内容的操作应该有效:
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>
List columnheader=Arrays.asList(“香蕉”、“苹果”、“胡萝卜”、“橘子”、“荔枝”、“Permisson”);
不要使用标题
作为变量name@Qwerky看起来快速的答案是不使用标题
作为var名称,一旦我更改了它,并且仍然保留了我的旧代码,它就可以工作了。谢谢谢谢你的及时回复。我尝试了你所说的,但仍然得到org.apache.commons.el.ImplicitObjects的columnHeaders.toString()
值$7@75b875b8
至于在
上使用
,我知道,但这是我继承的旧代码,我不愿意升级,因为到处都会有很多更新。;)您的眼光很敏锐。请查看更新的答案,您需要重命名var=“header”
。感谢您的回答,但我注意到它仍然没有按照您的建议工作,并且@Qwerky提供的评论起了作用。有没有办法让他相信这一点?这是一个错误,你的另一个错误是你试图用scriptlet而不是EL引用变量。
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>