我有以下代码:
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
...
在我看来,正在打印内存值,而不是每个字符串中包含的值。 我在这里缺少什么?
答案 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>