java - AEM 6.1:获取页面的所有“parsys”和“iparsys”组件
问题描述
我有一个页面路径(例如/content/my-site/en/cars),并且我需要在此页面上以 java 代码显示的所有“parsys”和“iparsys”组件的列表。有没有办法做到这一点?谢谢你的帮助。
解决方案
我假设您正在尝试使用Sling 模型或WCMUsePOJO来读取页面的内部节点。这里的技巧:
- 如果您不知道存在多少 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();
}
推荐阅读
- mysql - MySQL GROUP BY 没有聚合而不是 LIMIT
- join - ArangoDB 中的智能连接
- angular - SyntaxError:JSON.parse 错误:位置意外输入:281
- .net-core - 在自定义身份验证下运行的 Ocelot 网关 dotnet 核心尝试使用应用程序池身份发出下游请求
- javascript - make function run when click
- ios - 使用 ZStack 将动画视图与另一个视图组合
- javascript - 通过引用集合的 id 查找文档
- c# - 如何在不使用 ChartArea ASP.NET MVC 的情况下在图表上显示所有 X 值
- google-cloud-spanner - 一张桌子如何与两张桌子交错?
- apache-spark - 我们可以在 AWS Glue 中设置 spark.sql.shuffle.partitions 吗?