2017-03-17 51 views
6

Sling中的选择器有什么用途?AEM中的选择器

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

我在网上阅读文档关于选择的用法:

  1. 一些文件说,这是从不能当完成一个页面用于缓存响应使用查询参数。

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

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

在此先感谢您的任何指导。

回答

7

选择器是URL的特殊形式的参数。就像查询字符串一样,它可以根据参数改变HTTP请求/响应的行为。

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

好简单的例子将是tree.json的

tree.1.json(1为深度选择) 是说tree.json的只是另一种方式?深度= 1

类似的树。 2.json是一种tree.json?深度= 2

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

在以上光,这里是你的问题(后编辑)直接回应:

一些文件说,它是用于从页面缓存响应使用查询参数时无法做到的。

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

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

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

page.last-page.html

其中last-page是你用来区分响应的选择。这是做这件事的一种方法,只要页面可以被缓存,这个选择器变体也可以被缓存而没有任何问题。这很好地利用了URL语义并避免了缓存问题。如果这是为实现:

page.html?last-page=true

它可能没有缓存友好。

Sling有各种方式将脚本或servlet绑定(解析)为URL。该解决方案基于扩展,选择器和/或路径完成。您可以通过创建新的基于选择器的servlet向现有的选择器或扩展添加新功能,而无需修改现有的servlet。考虑一个为路径返回JSON数据的示例servlet(我们知道这在AEM中存在OOTB,但只是一个示例)。该节点的

content/mypage.json

返回JSON表示。

现在,假设您想要一个更整洁的新JSON格式。使用传统的查询字符串,你会做这样的事情

content/mypage.json?tidy=true

这是不可能的,如果你不能够访问原始的servlet的源代码。因此,解决方法是:

content/mypage.tidy.json

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

+0

因此,这意味着选择器与查询参数具有相同的确切功能(即将参数传递给函数)。但唯一的区别是它们在缓存方面的用法? –

+1

简而言之,是的。但是,它们不是查询字符串参数的替代品。在存在选择器的情况下,您的URL仍然可以使用查询字符串参数。它增强了缓存并为URL提供了更好的语义结构(恕我直言)。 –

+0

我的问题中的第2点如何?这不是选择器的主要用法吗? –