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