2

我有以下代码:

<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。问题是我无法进入循环。根据sling taglibs docs,这forEach应该能够处理迭代器对象。有什么我想念的吗?该findResources函数还返回 aResourceIteratorDecorator当它应该是一个普通的java.util.Iterator

我确实找到了ResourceIteratorDecorator 类并且它 extends Iterator<Resource>,所以这个类本身应该不是问题。c:forEach已知迭代器对象有问题吗?

4

1 回答 1

4

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

为了让长度函数计算出迭代器中包含多少项,它必须在迭代器上调用 next() 直到它到达末尾。没有办法倒带迭代器,所以当你到达你的 forEach 时,已经没有任何项目了。

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

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

您使用的 Sling 版本比我新,但如果我将 ResourceResolver.listChildren 的结果输入 ac:forEach而不使用${fn:length(children)}

于 2013-09-13T12:48:32.037 回答