AEM/Sling: 如何实现动态吊索选择器?
AEM/Sling: How do I implement dynamic sling selector?
TLDR:我想设置一个 AEM 页面,使用 SEO 友好的方式接受名字和姓氏作为参数 URL。
前往 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
所以我一直在遵循这个指南(不确定这是否是最好的 example/guide 来帮助我):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
我想让名字和姓氏动态化parameters/selectors。例如,如果我想传递值 "richard.williams",那么我可以使用:http://localhost:4502/content/geometrixx/en.richard.williams.html
如果我现在尝试使用 http://localhost:4502/content/geometrixx/en.richard.williams.html,我会得到一个空白页。
所以基本上我想使用选择器将参数值传递到我的页面。
知道如何做到这一点吗?
ps。目前,我的本地 AEM 实例中只有 testing/experimenting。
sling 中的选择器不提供将变量放置在 URL 路径中的功能。也就是说,您不能像 Spring 那样将 {pathParam} 添加到 sling servlet URL.
一般情况下,不建议将选择器用作函数的输入。它们更像是文件扩展名。
例如。请求 /mycontent.html returns 与 /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 中的答案。吊索 ResourceProvider
并与 jax-rs
集成是您可以实现此目标的其他方式。
从技术上讲,使用 OptingServlet
是可行的(参见 https://sling.apache.org/documentation/the-sling-engine/servlets.html#optingservlet-interface)
您的 accepts
方法可以轻松识别预期的 resourceType
并做出适当的反应。
如文档中所述,不鼓励使用这种方法,而 Subhash 提出的使用后缀的解决方案似乎更优雅。
您可以创建一个从请求中读取选择器的组件,并将该组件添加到 en.html
TLDR:我想设置一个 AEM 页面,使用 SEO 友好的方式接受名字和姓氏作为参数 URL。
前往 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
所以我一直在遵循这个指南(不确定这是否是最好的 example/guide 来帮助我):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
我想让名字和姓氏动态化parameters/selectors。例如,如果我想传递值 "richard.williams",那么我可以使用:http://localhost:4502/content/geometrixx/en.richard.williams.html
如果我现在尝试使用 http://localhost:4502/content/geometrixx/en.richard.williams.html,我会得到一个空白页。
所以基本上我想使用选择器将参数值传递到我的页面。
知道如何做到这一点吗?
ps。目前,我的本地 AEM 实例中只有 testing/experimenting。
sling 中的选择器不提供将变量放置在 URL 路径中的功能。也就是说,您不能像 Spring 那样将 {pathParam} 添加到 sling servlet URL.
一般情况下,不建议将选择器用作函数的输入。它们更像是文件扩展名。 例如。请求 /mycontent.html returns 与 /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 中的答案。吊索 ResourceProvider
并与 jax-rs
集成是您可以实现此目标的其他方式。
从技术上讲,使用 OptingServlet
是可行的(参见 https://sling.apache.org/documentation/the-sling-engine/servlets.html#optingservlet-interface)
您的 accepts
方法可以轻松识别预期的 resourceType
并做出适当的反应。
如文档中所述,不鼓励使用这种方法,而 Subhash 提出的使用后缀的解决方案似乎更优雅。
您可以创建一个从请求中读取选择器的组件,并将该组件添加到 en.html