我有页面的路径(例如,/ content / my-site / en / cars),并且需要此页面上以Java代码呈现的所有“ parsys”和“ iparsys”组件的列表。有什么办法吗?谢谢你的帮助。

最佳答案

我假设您正在尝试使用Sling modelWCMUsePOJO来读取页面的内部节点。这里的技巧:


如果您不知道存在多少个parsys节点:这不是理想的情况,因为页面渲染脚本规定了所有包含的parsys和iparsys。但以防万一,您将对sling:resourceType运行查询,如下所示:


Iterator<Resource> parsysResources = resourceResolver.findResources("/jcr:root/content/my-site/en/cars//*[sling:resourceType='foundation/components/parsys']", Query.XPATH);
Iterator<Resource> iparsysResources = resourceResolver.findResources("/jcr:root/content/my-site/en/cars//*[sling:resourceType='foundation/components/iparsys']", Query.XPATH);



与查询类似的查询,但带有查询生成器(推荐):建议使用查询生成器API,以提高可读性和将来的可扩展性。


List<Resource> parsysIpaysysResources = new ArrayList<>();
Map<String, String> predicateMap = new HashMap<>();
predicateMap.put("path", "/content/my-site/en/cars");
predicateMap.put("1_property", "sling:resourceType");
predicateMap.put("1_property.value", "foundation/components/parsys");
predicateMap.put("2_property", "sling:resourceType");
predicateMap.put("2_property.value", "foundation/components/iparsys");
predicateMap.put("p.limit", "-1");

QueryBuilder queryBuilder = resourceResolver.adaptTo(QueryBuilder.class);
Session session = resourceResolver.adaptTo(Session.class);
com.day.cq.search.Query query = queryBuilder.createQuery(PredicateGroup.create(predicateMap), session);
SearchResult result = query.getResult();
Iterator<Resource> resources = result.getResources();
while (resources.hasNext()) {
    parsysIpaysysResources.add(resources.next());
}



如果已知parsys节点是页面内容的直接子代,则listChildren比查询便宜。


Page pageContent = pageManager.getContainingPage("/content/my-site/en/cars");
        Iterator<Resource> children = pageContent.getContentResource().listChildren();
        while(children != null && children.hasNext()) {
            Resource child = children.next();
            if(child.isResourceType("foundation/components/parsys") || child.isResourceType("foundation/components/iparsys")) {
                // do something
            }
        }



如果知道内部parsys的节点名称,则可以利用JCR API


Page pageContent = pageManager.getContainingPage("/content/my-site/en/cars");
    Node pageContentNode  = pageContent.adaptTo(Node.class);
    try {
        NodeIterator nodeIter = pageContentNode.getNodes("parsys*");
        // iterate nodes
    } catch (RepositoryException e) {
        e.printStackTrace();
    }

10-06 04:54
查看更多