根据 documentation 有两种注册 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
注释中使用,所以再次强调 - 您将立即从使用它中受益!
我还建议您阅读我的 collegue 的精彩演示。他描述了一些 AEM 开发最佳实践(包括您的 @SlingServlet
案例)。可以找到here
关于servlets - 注册 Sling Servlet 的方法 - Adobe AEM/CQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31609051/