注册Sling Servlet的方法- Adobe AEM/CQ



根据文档

有两种注册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 {
        ...
    }
}

第二次使用@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 {
        ...
    }
}

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

@SlingServlet减少了创建servlet所需的样板文件。您列出的一些属性(如methods = "GET")在默认情况下已经设置,因此您不需要重新配置它。总之,它使注释更加简洁。

在内部,就像所有SCR注释一样,注释被翻译成XML文件,因此您将无法仅通过查看部署了代码的实例来区分servlet是如何实现的。

如果您想指定供应商或服务描述,则没有限制您添加额外的@Property定义。记住,后者实际上在@SlingServlet注释中是可用的,所以再次强调—使用它会直接受益!

我还建议您阅读我的同事的一篇很棒的演讲,他描述了一些AEM开发最佳实践(包括您的@SlingServlet案例)。可以在这里找到

最新更新