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

问题描述 投票:0回答:3

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实例中进行测试/实验。

aem sling
3个回答
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
投票

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

你的accepts方法可以很容易地识别预期的resourceType并做出适当的反应。

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.