Java AEM:已更改servlet的url

Java AEM:已更改servlet的url,java,servlets,aem,Java,Servlets,Aem,例如: 我有一个程序组件。对于获取信息,我使用servlet的下一个url /bin/dem/services/programs.json?programId=012345 我将这个url(/bin/dem/services/programs.json)添加到apacheslingservlet/Script解析器和错误处理程序中 现在必须将我更改为Sling选择器,以便调度器可以缓存页面。现在将按以下方式调用servlet: /bin/dem/services/programId=01234

例如:

我有一个程序组件。对于获取信息,我使用servlet的下一个url

/bin/dem/services/programs.json?programId=012345
我将这个url(
/bin/dem/services/programs.json
)添加到
apacheslingservlet/Script解析器和错误处理程序中

现在必须将我更改为Sling选择器,以便调度器可以缓存页面。现在将按以下方式调用servlet:

/bin/dem/services/programId=012345.programs.json
我是否应该更改Apache Sling Servlet/Script解析器和错误处理程序中的某些内容? 或添加以下内容的更改:

@Properties(value = {
        @org.apache.felix.scr.annotations.Property(name = "sling.servlet.methods", value = {"GET"}),
        @org.apache.felix.scr.annotations.Property(name = "sling.servlet.paths", value = {"/bin/dem/services/programs.json"})
})

选择器不能那样使用。选择器对于预定义的值非常有用。e、 g.以下各项:-

/bin/dem/services/programs.012345.json

此外,无法使用查询字符串缓存请求。

选择器可用于任意值,您只需小心

您可以定义一个约定,url可以包括两个选择器,第一个是固定的,用于选择正确的servlet,第二个是您的变量

比如说

“选择器”是一个固定值(在servlet中配置),而“123”是一个动态值

如果路径固定为/bin,则更简单


您需要注意的是缓存,adobe dispatcher将使用不同的url缓存每个请求,这意味着如果您不小心,可能会积累大量文档

移交必要信息的另一种方法是使用url后缀。在你的情况下是这样的

/bin/dem/services/programs.json/012345
在servlet内部,通过
request.getRequestPathInfo().getSuffix()

另一种方法是使用RESTful URL。在您的例子中,RESTful URL看起来像
/content/path/to/current/page.program.json/012345

如前所述,使用
@SlingServlet
注释。有关如何使用它以及可以查找哪些属性的信息

在您的例子中,注释如下所示

@SlingServlet(
    resourceTypes = { "sling/servlet/default" }, 
    methods = { "GET" }, 
    selectors = { "program" }, 
    extensions = { "json" }
)
如果您只有读取请求(例如GET、HEAD、OPTION)或请求更改或添加数据(例如POST、PUT、DELETE)的
SlingAllMethodsServlet
,则从
SlingSafeMethodsServlet
扩展servlet


对于CQ5和AEM6,我通常建议使用RESTful servlet,因为CQ5/AEM6使用Sling,这是一个纯粹的RESTful框架。在Sling中,还可以按资源类型注册servlet。您可以查看吊索的工作原理。

谢谢您的回答,所以…它不适合动态信息?如果我想使用它,我应该为每个id添加url?是的。您可以为每个id添加url,它们可以缓存。不过我不推荐。您可能希望让应用服务器处理每个请求(而不是缓存响应),除非应用服务器返回响应需要大量资源或时间。谢谢,如果我有2个变量选项?我可以使用/bin/dem/services/programs.programId.012345.secondOption.543210.json吗?是的,您可以为订单或选择器定义一个约定并坚持使用它。如果您正在处理它们,您只能通过订单来识别它们。请允许我再问一个问题。然后,如何在ApacheSlingServlet/Script解析器和错误处理程序以及@Properties(value={@org.Apache.felix.scr.annotations.Property(name=“Sling.Servlet.methods”,value={“GET”})、@org.Apache.felix.scr.annotations.Property(name=“Sling.Servlet.path”,value={/bin/dem/services/programs.json})中声明url首先,我建议您使用@SlingServlet注释,这使事情变得更简单。现在,如果您正在使用/bin,只需从路径(“/bin/dem/services/programs”)中删除扩展名,@santiagozky Hi我从未在slingservlet中看到动态选择器值。你能详细说明一下它的工作原理吗?sling引擎如何知道哪个部分是动态的,也许您可以让我参考git或其他地方的代码示例。谢谢