2014-06-05 102 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}" /> 
相關問題