我有以下代码:
<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
函数还返回 ResourceIteratorDecorator
当它应该是一个普通的java.util.Iterator
时.
我确实找到了ResourceIteratorDecorator class它延伸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( child )}
关于jsp - 使用c :forEach over sling:listChildren,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18707024/