java通过Sling通过AEM中的路径管理两个相同的servlet
我在同一个AEM实例中有两个项目,在这两个项目中我需要相同的servlet(我不想更改选择器),但它必须处理不同的模板
通过部署这两个项目,使用servlet调用它们各自的资源,一个回答,另一个不回答。这是因为在每种情况下都会调用相同的servlet(因此不会管理项目的模板)
因此,我想了解是否可以通过在基本路径数组上添加控件来管理这两个servlet。通过这种方式,每个项目进入正确的servlet,所有模板都得到管理
例如:
Current version servlet project A
@Component(
service = {Servlet.class},
property = {
Constants.SERVICE_DESCRIPTION + "=Menu Servlet",
SLING_SERVLET_METHODS + "=" + HttpConstants.METHOD_GET,
SLING_SERVLET_RESOURCE_TYPES + "=" + NameConstants.NT_PAGE,
SLING_SERVLET_SELECTORS + "=" + "contents",
SLING_SERVLET_EXTENSIONS + "=json"
}
)
Current version servlet project B
@Component(
service = {Servlet.class},
property = {
Constants.SERVICE_DESCRIPTION + "=Servlet",
SLING_SERVLET_METHODS + "=" + HttpConstants.METHOD_GET,
SLING_SERVLET_RESOURCE_TYPES + "=" + NameConstants.NT_PAGE,
SLING_SERVLET_SELECTORS + "=" + "contents",
SLING_SERVLET_EXTENSIONS + "=json"
}
)
New version servlet project A
@Component(
service = {Servlet.class},
property = {
Constants.SERVICE_DESCRIPTION + "=Servlet",
SLING_SERVLET_METHODS + "=" + HttpConstants.METHOD_GET,
SLING_SERVLET_RESOURCE_TYPES + "=" + NameConstants.NT_PAGE,
SLING_SERVLET_SELECTORS + "=" + "contents",
SLING_SERVLET_EXTENSIONS + "=json",
--> NEW_SELECTOR + "=[/content/progA, /content/experience-fragments/progA]"
}
New version servlet project B
@Component(
service = {Servlet.class},
property = {
Constants.SERVICE_DESCRIPTION + "=Servlet",
SLING_SERVLET_METHODS + "=" + HttpConstants.METHOD_GET,
SLING_SERVLET_RESOURCE_TYPES + "=" + NameConstants.NT_PAGE,
SLING_SERVLET_SELECTORS + "=" + "contents",
SLING_SERVLET_EXTENSIONS + "=json",
--> NEW_SELECTOR + "=[/content/progB,/content/experience-fragments/progB]"
}
# 1 楼答案
您可以实现OptingSevlet interface并定义
accepts
方法,该方法可以使用某种机制(例如,通过请求参数)决定是否应使用当前servlet为请求提供服务,否则请求将转到下一个候选servlet我还想指出,这是一个相当奇怪的用例,通常您希望在不同的项目中使用非干扰路径模式来挂载servlet。还要避免使用不必要的宽资源类型,如
NT_PAGE
或cq:Page
,这会使servlet成为系统中所有页面的候选对象,并可能对性能产生不利影响