我有以下代码:
<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}}是否存在迭代器对象问题?
答案 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)}