AEM / Sling:如何实现动态吊带选择器?

时间:2018-05-08 05:28:26

标签: aem sling

TLDR :我想设置一个AEM页面,使用SEO友好的URL接受firstname和lastname作为参数。

访问www.host.com/mycontent.richard.williams.html将显示与Richard Williams相关的信息。

如果我访问www.host.com/mycontent.john.smith.html,该页面将显示与John Smith相关的信息。

SEO友好示例:www.host.com/mycontent.richard.williams.html

不是SEO友好的例子:www.host.com/mycontent.html?firstname=richard&lastname=williams

所以我一直在关注本指南(不确定这是否是帮助我的最佳示例/指南):http://www.aemcq5tutorials.com/tutorials/sling-servlet-in-aem/

虽然它适用于我的例子

@SlingServlet(resourceTypes="geometrixx/components/hompepage", selectors={"firstname","lastname"}, extensions="html",methods="GET", metatype=true)

我试图让它变得动态。

目前,我只能通过以下方式访问servlet:http://localhost:4502/content/geometrixx/en.firstname.lastname.html

我想创建名字和姓氏动态参数/选择器。就像我想要传递值“richard.williams”一样,我可以使用:http://localhost:4502/content/geometrixx/en.richard.williams.html

如果我现在尝试使用http://localhost:4502/content/geometrixx/en.richard.williams.html,我会得到一个空白页。

所以基本上我想使用选择器将参数值传递给我的页面。

任何想法如何做到这一点?

PS。目前,我只在我当地的AEM实例中进行测试/试验。

3 个答案:

答案 0 :(得分:4)

吊索中的选择器不提供在URL路径中放置变量的功能。即你不能像在Spring中那样将{pathParam}添加到吊索servlet URL中。

通常,建议不要将选择器用作函数的输入。它们更像文件扩展名。 例如。对/mycontent.html的请求将返回与/mycontent.mobile.html相同的资源。唯一的区别是,后者要求提供适合移动设备的版本。

另一方面,请求参数用于为servlet提供输入。

我想不出任何直接的方法将servlet附加到吊索中的动态路径。您可以尝试使用suffix,它们可以在调度程序中缓存,但我无法对使用suffix的SEO友好性发表评论。

考虑此URI - /mycontent/user.json/john/smith

使用路径/mycontent/user注册servlet,您可以使用 String[] names = request.getRequestPathInfo().getSuffix().split(suffix, '/') 检索后缀内容。

查看此question中的答案。吊索ResourceProvider并与jax-rs整合是您实现此目标的其他方式。

答案 1 :(得分:1)

从技术上讲,这可以通过OptingServlet使用(见https://sling.apache.org/documentation/the-sling-engine/servlets.html#optingservlet-interface

您的accepts方法可以轻松识别预期的resourceType并做出适当的反应。

正如文档中提到的那样,不鼓励使用这种方法,Subhash提出的使用后缀的解决方案似乎更优雅。

答案 2 :(得分:0)

您可以创建一个从请求中读取选择器的组件,并将该组件添加到en.html