2014-06-05 100 views
0

的Tomcat 7 JDK7的forEach返回一个字符串不是一个对象

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上,但是孩子始终是一个串。我在网上发现的唯一提到的是在forEach中缺少$ {},但我拥有这些。任何其他原因JSTL不会返回实际的对象?

+3

你是什么意思“小孩总是一个字符串”? 'c:out'输出任何对象所在的'toString()'。 –

+0

内部列表也是产品类别的列表 – user18896654353

+0

所有的非集合值,如id,这是什么id给我 - > javax.el.PropertyNotFoundException:在类型java.lang.String上找不到属性'id' – user18896654353

回答

2

除了items =“$ {product.childProducts}”>中的空格之外,您所拥有的是正确的。不应该有任何的间隔之后}之前

尝试这样的:

<c:forEach var="product" items="${sessionScope.products}">       
     <c:forEach var="child" items="${product.childProducts}">               
       <c:out value="${child.id}" /> 
     </c:forEach> 
    </c:forEach> 
+1

不,至少在我尝试过的示例代码中没有。它抱怨类“java.lang.String”没有属性.... – Prasad

+0

@Sotirios Delimanolis只要尝试一个间距,你会看到这个问题。 – Prasad

+1

@Prasad当'#{}}之后有任何空格或任何字符时,你是绝对正确的,那么首先调用对象的'toString()'并在其中添加空格,将它转换为字符串。这是正确的答案。 – Braj

0

不要混淆JSP Standard Tag Library (JSTL)Expression Language (EL)前者是一组标记在JSP中使用。和Facelets,而后者是一个表达式,它将查找存储在页面,请求,会话或应用程序范围中的对象作为属性,并对视图中的元素使用立即或延迟评估。并且可以理解,调用${child}意味着检索从${product.childProducts}检索到的页面上下文变量child的值。它会直接在您的视图中返回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}" /> 
相关问题