注册Sling Servlet的方法 - Adob​​e AEM/CQ

San*_*mar 3 adobe servlets sling aem

根据文档,有两种方法可以注册Sling Servlet

首先是 @SlingServlet

@SlingServlet(
    resourceTypes = "sling/servlet/default",
    selectors = "hello",
    extensions = "html",
    methods = "GET")
    public class MyServlet extends SlingSafeMethodsServlet {

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

第二次使用 @Properties

@Component(metatype = true)
@Service(Servlet.class)
@Properties({
    @Property(name = "sling.servlet.resourceTypes", value = "sling/servlet/default"),
    @Property(name = "sling.servlet.selectors", value = "hello"),
    @Property(name = "sling.servlet.extensions", value = "html"),
    @Property(name = "sling.servlet.methods", value = "GET")
})
public class MyServlet extends SlingSafeMethodsServlet {

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

文档没有列出特定方法相对于其他方法的任何优点.我的一位团队成员询问了这一点.我能想到的一件事是@Properties允许我们提供可配置的属性,可以从OSGi控制台(http:// localhost:4502/system/console/components,更改假设CQ在端口4502上本地运行)进行更改.使用特定方法有区别或优势吗?

Mat*_*ski 6

@SlingServlet减少了创建servlet所需的样板.methods = "GET"默认情况下,您已列出的某些属性已设置,因此您无需重新配置它.总之,它使注释更加简洁.

在内部,就像所有SCR注释一样,注释被转换为XML文件,因此您无法通过查看部署代码的实例来区分servlet的实现方式.

@Property如果要指定供应商或服务描述,则无需添加其他定义.记住,后者实际上可以在@SlingServlet注释中再次使用 - 您可以直接使用它获益!

我还建议你阅读我的同事的精彩演示,他介绍了一些AEM开发最佳实践(包括你的案例@SlingServlet).你可以在这里找到它