选择器是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
选择和覆盖功能。这使得选择器在脚本解析和代码扩展方面非常强大。是的,你也可以使用查询参数来完成它,但除非你拥有所有的代码,否则会有限制。
因此,这意味着选择器与查询参数具有相同的确切功能(即将参数传递给函数)。但唯一的区别是它们在缓存方面的用法? –
简而言之,是的。但是,它们不是查询字符串参数的替代品。在存在选择器的情况下,您的URL仍然可以使用查询字符串参数。它增强了缓存并为URL提供了更好的语义结构(恕我直言)。 –
我的问题中的第2点如何?这不是选择器的主要用法吗? –