首先是@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上本地运行)。使用特定方法有区别或优势吗?
答案 0 :(得分:6)
@SlingServlet
减少了创建servlet所需的样板。您列出的某些属性(如methods = "GET"
)已默认设置,因此您无需重新配置。总之,它使注释更加简洁。
在内部,就像所有SCR注释一样,注释被转换为XML文件,因此您只能通过查看部署代码的实例来区分servlet的实现方式。
如果要指定供应商或服务描述,则无需添加额外的@Property
定义。请注意,后者实际上可以在@SlingServlet
注释中再次使用 - 您可以直接使用它获得好处!
我还建议您阅读我的collegue的精彩演示文稿,其中介绍了一些AEM开发最佳实践(包括您的@SlingServlet
案例)。你可以找到它here