AEM 中的选择器

Selectors in AEM

Sling 中的选择器有什么用?

http://www.resourcePath.选择器.扩展名

我看过网上关于选择器用法的文档:

  1. 一些文档说它用于缓存来自页面的响应,这在使用查询参数时无法完成。

  2. 虽然有人建议选择器用于使用相同资源响应不同条件。例如,我们有一个实现,如果页面(cq:page)是层次结构中的最后一页,它应该显示一个 html 块,而如果它不是最后一页(即如果它有子页面) ), 它不应显示所述块。这里我们在组件中使用了一个脚本,根据是否是最后一页的条件,在URL中添加了这个脚本名称作为选择器。

但我不确定哪一个是真的。

在此先感谢您的指导。

选择器是 URL 的一种特殊形式的参数。就像查询字符串一样,它可以根据参数更改 HTTP request/response 的行为。

这些主要取决于实现,但一般惯例是根据位置来解释它们。

好的简单示例将是 tree.json

tree.1.json(1是深度选择器) 只是 tree.json?depth=1

的另一种说法

类似树。2.json 是一种 tree.json?depth=2

从语义上讲,这允许没有查询字符串的绝对路径,并且可以由调度程序或 CDN 缓存(因为它们没有 ? 或 # 修饰符)。大多数代理不缓存参数化页面(?在 URL 中)但选择器绕过规则。此外,这允许 servlet 预定义选择器值(如果需要)并忽略不必要的参数。

鉴于以上,这里直接回答你的问题(post编辑):

Some of the documents say that it is used for caching response from a page which cannot be done when using query parameters.

是的,这是真的,特别是如果您将它放在像 Dispatcher 这样的反向代理的上下文中(推荐用于典型 AEM 部署中的发布者)。默认情况下,查询字符串绕过并刷新调度程序上的缓存。通过使用选择器,您可以在调度程序上缓存响应,因为它不会启动缓存刷新。如果可以缓存基本版本的数据并且选择器依赖于相同的状态,那么使用选择器通常是一个好习惯。

While some suggest that Selectors are used to respond to different conditions using the same resource. For example we had an implementation where if the page(cq:page) is the last page in the hierarchy, it should display lets say a html-block while if its not the last page (i.e. if it has child pages), it should not display the said block. Here we used a script in the component and added this script name in the URL as selector based on the condition whether it is the last page or not.

不看代码,我假设这是这样的:

page.last-page.html

其中 last-page 是您用来区分响应的选择器。这是一种实现方法,只要页面可以缓存,这个选择器变体也可以毫无问题地缓存。这是对 URL 语义的一个很好的使用,避免了缓存问题。如果实现为:

page.html?last-page=true

它可能不是缓存友好的。

Sling 有多种方法可以将脚本或 servlet 绑定(解析)到 URL。此解决方案是根据扩展、选择器 and/or 路径完成的。您可以通过创建新的基于选择器的 servlet 而无需修改现有的 servlet 来向现有的选择器或扩展添加新功能。考虑一个示例 servlet,其中 returns JSON 路径数据(我们知道这在 AEM 中存在 OOTB,但这只是一个示例)。

content/mypage.json

returns JSON 节点表示。

现在,假设您想要一种更整洁的新 JSON 格式。使用传统查询字符串,您将执行类似

content/mypage.json?tidy=true

如果您无法访问原始 servlet 的源代码,这可能无法实现。所以解决方法是:

content/mypage.tidy.json

这可能是一个新的 servlet,它接受 tidy 选择器并覆盖该函数。这使得选择器在脚本解析和代码扩展方面非常强大。是的,您也可以使用查询参数来完成,但除非您拥有所有代码,否则会有限制。