使用c:forEach over sling:listChildren

时间:2013-09-09 21:05:07

标签: jsp taglib cq5 sling aem

我有以下代码:

<c:set var="res" value="${sling:getResource(resourceResolver, currentPage.path)}" />
<sling:listChildren resource="${res}" var="children" />
${children} length ${fn:length(children)}
<c:forEach var="child" items="${children}">
     <li>here${child.path}</li>
</c:forEach>

我的目标是吐出当前页面的三个孩子。当我打印出${children}时,我得到一个迭代器(org.apache.sling.resourceresolver.impl.helper.ResourceIteratorDecorator@3b93b521)的对象引用,长度返回三。问题是我无法进入循环。根据{{​​3}},这个forEach应该能够处理迭代器对象。有什么我想念的吗?如果findResources函数应为普通ResourceIteratorDecorator,则java.util.Iterator函数也会返回Iterator<Resource>

我确实找到sling taglibs docs并且它扩展了c:forEach,所以这个类本身应该不是问题。知道{{1}}是否存在迭代器对象问题?

1 个答案:

答案 0 :(得分:4)

尝试取出长度检查并允许forEach运行。

对于length函数来计算迭代器中包含多少项,它必须在迭代器上调用next()直到它结束。没有办法倒回迭代器,所以当你到达forEach时,没有剩下的项目。

如果您需要知道长度,可以使用varStatus对象:

<c:forEach var="child" items="${children}" varStatus="status">
     <li>${status.index} here${child.path}</li>
</c:forEach>

您使用的是比我更新版的Sling,但如果我将ResourceResolver.listChildren的结果反馈到c:forEach 而不使用 ${fn:length(children)}

,这对我有用