Using c:forEach over sling:listChildren



我有以下代码:

<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)的对象引用,长度返回三。问题是我无法进入循环。根据 sling taglibs 文档,这个forEach应该能够处理迭代器对象。我错过了什么吗?findResources函数还返回一个ResourceIteratorDecorator,当它应该是普通java.util.Iterator时。

我确实找到了资源迭代器装饰器类,它扩展了Iterator<Resource>,所以类本身应该不是问题。已知c:forEach迭代器对象有问题吗?

尝试取出长度检查并允许 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)}

最新更新