【问题标题】:AEM/Sling: How do I implement dynamic sling selector?AEM/Sling:如何实现动态吊索选择器?
【发布时间】:2018-10-17 23:32:50
【问题描述】:

TLDR:我想设置一个使用 SEO 友好 URL 接受名字和姓氏作为参数的 AEM 页面。

访问 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


    【解决方案1】:

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

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

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


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

    考虑这个 URI - /mycontent/user.json/john/smith

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

    查看question 中的答案。 Sling ResourceProvider 和与 jax-rs 集成是您可以实现此目的的其他方式。

    【讨论】:

    • 从 SEO 的角度来看,后缀是可以的,至少 google 没有任何问题。不过不确定其他引擎。
    【解决方案2】:

    从技术上讲,使用OptingServlet 是可行的(参见https://sling.apache.org/documentation/the-sling-engine/servlets.html#optingservlet-interface

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2022-10-13
        • 1970-01-01
        • 2017-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多