使用JDK7的Tomcat 7
class Product
private java.util.List<OrderedProduct> childProducts; // with getter and setter
JSTL
<c:forEach var="product" items="${sessionScope.products}">
<c:forEach var="child" items="${product.childProducts} ">
<c:out value="${child}" />
</c:forEach>
</c:forEach>
inital forEach返回我可以调用$ {product.id}的对象,但是child始终是一个字符串。我在网上唯一提到的是在forEach中缺少$ {},但我有这些。 JSTL不会返回实际对象的任何其他原因吗?
答案 0 :(得分:2)
除了项目=&#34; $ {product.childProducts}&#34;&gt; 中的间距外,您所拥有的内容是正确的。 } 之后和&#34; 之前不应有任何间距。
试试这样:
<c:forEach var="product" items="${sessionScope.products}">
<c:forEach var="child" items="${product.childProducts}">
<c:out value="${child.id}" />
</c:forEach>
</c:forEach>
答案 1 :(得分:0)
请勿将JSP Standard Tag Library (JSTL)与Expression Language (EL)混淆。前者是一组要在JSP和Facelets中使用的标记,而后者是一个表达式,它将寻找对象作为存储在页面,请求,会话或应用程序范围内的属性,并对其中的元素使用立即或延迟评估。观点。
理解了这一点后,您可以理解调用${child}
意味着检索从child
检索的页面上下文变量${product.childProducts}
的值。它将直接在您的视图中返回OrderedProduct child
。
JSTL <c:out value="${whatever}">
调用toString
对象引用的whatever
方法,并将转义字符串。在您的情况下,<c:out value="${child}" />
将调用child#toString()
,如果OrderedProduct
未覆盖toString
方法,则会使用Object#toString
。
任何其他原因JSTL不会返回实际对象吗?
从上面的解释来看,问题是完全错误的。你得到了实际的对象,你不应该不小心使用<c:out value="${whatever} />
。相反,只需打印出对象的必要字段即可。例如:
<c:out value="${child.name}" />