有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    您可以实现OptingSevlet interface并定义accepts方法,该方法可以使用某种机制(例如,通过请求参数)决定是否应使用当前servlet为请求提供服务,否则请求将转到下一个候选servlet

    我还想指出,这是一个相当奇怪的用例,通常您希望在不同的项目中使用非干扰路径模式来挂载servlet。还要避免使用不必要的宽资源类型,如NT_PAGEcq:Page,这会使servlet成为系统中所有页面的候选对象,并可能对性能产生不利影响