forEach返回一个字符串而不是一个对象

时间:2014-06-05 15:37:13

标签: java jsp jstl

使用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不会返回实际对象的任何其他原因吗?

2 个答案:

答案 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}" />