Adobe Experience Manager (AEM)的强大功能之一是使用核心组件的内容创作功能创建UI内容。在创建内容时,它们作为资源存储在Jackrabbit Oak存储库中,然后获取并呈现为HTML内容。当开箱即用的内容创作组件不能满足业务需求时,AEM提供了使用html框架和Sling模型创建自定义UI组件的特性。
什么是资源?
在AEM中,所有内容都以结构化内容的形式存储在Jackrabbit Oak Repository中。Jackrabbit Oak内容信息以节点的形式存储,节点中包含的值作为属性。Jackrabbit Oak API将这些节点称为Resource。资源将值存储在属性中。在UI组件中,开发人员使用Resource及其值在web页面上呈现UI。
对于开发人员访问资源,AEM提供了多种API。为什么多个API的?访问Resource会影响UI组件的性能,影响非缓存页面的页面加载时间。在这篇博文中,我们将重点介绍何时使用QueryBuilder、ResourceResolver和ResourceUtil API。
查询构建器
查询生成器构建在JCR API之上。在AEM中,信息以结构格式存储为资源、属性和值。Query Builder API类似于SQL Query,执行查询来获取结构化数据。Query Builder由一个语句组成,该语句包含谓词、表达式和类似于SQL语句的子句。
查询生成器用例
查询生成器在你:
- 获取大数据集以在UI中显示为List
- 根据给定的条件(如属性值)获取大型数据集
- 获取基于文本的数据,如文本搜索
查询生成器API支持XPath、SQL2和SQL格式语句。SQL已被弃用,因此在本博客中,我们将讨论XPath和SQL2。
XPath查询
简单的XPath查询被描述为读取与谓词中给定模式匹配的特定节点的语法。在这里,节点是资源路径和模式,它们的值将与属性值匹配。
路径= /内容/ we-retail /美国/ en = cq型:第1页_property = jcr:内容/ cq:模板1 _property.value = / conf / / hero-page we-retail /设置/ wcm模板
在上面的示例中,path表示资源路径,1_property表示属性,1_property表示属性。Value是属性值。
Java代码示例:
MappredicateMap = new HashMap<>();predicateMap。把(“路径”,“我们/内容/ we-retail / / en ");predicateMap。把(“类型”、“cq:页面”);predicateMap.put(“1 _property”、“jcr:内容/ cq:模板”);predicateMap.put _property(“1。”、“价值/ conf / we-retail /设置/ wcm /模板/ hero-page”);Session Session = resourceResolver.adaptTo(Session.class);QueryBuilder QueryBuilder = resourceResolver.adaptTo(QueryBuilder.class); Query query = queryBuilder.createQuery(PredicateGroup.create(predicateMap), session); query.setStart(0); SearchResult result = query.getResult();
注意:XPath已弃用,Apache Jackrabbit Oak仍然支持XPath的使用。
SQL2查询
SQL2查询类似于RDMS查询。编写查询是为了获取与特定路径的给定条件匹配的列值。
SELECT * FROM [nt:base] AS s WHERE ISDESCENDANTNODE([/content/we-retail]) AND s.[cq:template] = '/conf/we-retail/settings/wcm/templates/hero-page'
在上面的例子中,*表示条件cq:template等于we-retail内容路径下的hero-page模板的所有列。
Java代码示例:
示例1:
String queryString = "SELECT * FROM [nt:base] WHERE ISDESCENDANTNODE('/content/we-retail/us/en') AND [cq:template] = '/conf/we-retail/settings/wcm/templates/hero-page'";迭代器<资源> resourceIterator = resourceResolver。findResources(字串,Query.JCR_SQL2);
示例2:
String queryString = "SELECT * FROM [nt:base] WHERE ISDESCENDANTNODE('/content/we-retail/us/en') AND [cq:template] = '/conf/we-retail/settings/wcm/templates/hero-page'";QueryManager QueryManager = session.getWorkspace().getQueryManager();查询查询= queryManager。createQuery(字串,Query.JCR_SQL2);QueryResult result = query.execute();
知道的东西:
- 与RDBMS查询一样,Query Builder查询使用索引来获取数据集。
- AEM为Query Explain工具提供了检查自定义查询性能的工具。http://localhost:4502/libs/granite/operations/content/diagnosistools/queryPerformance.html
- 分析和优化索引对于优化服务器的性能非常重要。如果没有正确创建索引,将影响查询遍历,并影响服务器性能。欲了解更多信息,请阅读Oak查询和索引.
- AEM对获取的行数有限制。Apache Jackrabbit查询引擎设置服务限制提取到内存中的节点数量。如果业务需求要求获取大型数据集,那么我们可以调整“内存读限制”。但是,您需要谨慎对待硬件大小,因为这将影响服务器的性能。
- 如果您使用的是文本搜索,它将不会返回预期的结果。索引需要进行优化,更多相关信息,请阅读增加期望的搜索结果与橡树索引分析仪.
欲了解更多信息,请访问查询生成器API | Adobe体验管理器.
ResourceResolver
另一个重要的API是Apache Sling提供的ResourceResolver API。这个API提供了创建资源、获取特定资源及其子资源和查找资源的方法。这个API的唯一性是使用Sling HTTP Servlet Request或资源解析器工厂创建的。这非常有用,因为在执行创建、更新或删除操作时,将隐式应用当前用户会话或服务用户特定的权限。
资源解析器用例
- 在提供路径时获取资源
- 获取给定资源的子资源
- 工作流或批处理中的CRUD操作
Java代码示例:
Resource Resource = resourceResolver.getResource(" /content/we-retail/us/en/men ");
在上面的例子中,resourceResolver对象从路径/content/we-retail/us/en/men中获取名为men的特定资源,并创建一个对象。欲了解更多信息,请访问ResourceResolver (Apache Sling 11 API).
ResourceUtil
ResourceUtil是Apache Sling API提供的一个静态类。当我们不需要编写额外的代码来创建JCR节点时,这个类非常有用。这个类提供了一些方法,用于使用已创建的资源解析器和路径创建资源,并将属性和值作为映射提供。这也有助于开发人员轻松快速地访问属性值。
Java代码示例:
ValueMap属性= ResourceUtil.getValueMap(资源);
在上面的例子中,resource util类以ValueMap对象的形式返回属性值。欲了解更多信息,请阅读ResourceUtil (Apache Sling 11 API).
Value Map可以通过多种方式获取。如果我们已经有了资源对象,那么使用adaptTo()方法可以得到如下所示的ValueMap:
ValueMap属性= resource.adaptTo(ValueMap.class);
如果我们正在使用SlingModel,我们可以使用@ValueMapValue注释来获得当前对象的属性值,如下所示:
@ValueMapValue(name = "jcr:title") private String title;
在快速阅读完这篇文章之后,我希望您对AEM中的参考资料以及它们如何满足存储内容的需求有一个大致的了解。我们还介绍了获取这些资源的不同API,以及在选择获取资源的API时应该考虑的用例。
请随时分享你的观点,并在下面的评论部分添加你的问题。