You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Sling Servlet中不依赖全局对象获取页面storeCode等属性

在Sling Servlet中通过Request获取当前页面属性(无需全局对象)

完全可以通过Sling Servlet的Request对象实现,核心思路是从Request中拿到当前页面对应的Resource,再通过Resource的ValueMap提取属性,无需依赖全局对象或Sling Model的注解变量。

核心实现步骤

  1. 绑定Servlet到页面资源类型:确保Servlet关联到你的自定义页面组件类型,这样请求页面相关路径时,Request会直接携带页面的Resource对象。
  2. 从Request获取页面Resource:通过request.getResource()拿到当前页面的Resource实例。
  3. 提取页面属性:将Resource转换为ValueMap,直接读取目标属性(如storeCode、jcr:title等)。

代码示例

@Component(service = Servlet.class,
           property = {
               ServletPaths.PROPERTY + "/bin/my/page/handler",
               SlingConstants.SLING_SERVLET_METHODS + "=GET",
               SlingConstants.SLING_SERVLET_RESOURCE_TYPES + "=my-project/components/pages/custom-page" // 替换为你的页面组件类型
           })
public class PagePropertyServlet extends SlingSafeMethodsServlet {

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        // 获取当前页面的Resource
        Resource pageResource = request.getResource();
        if (pageResource == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND, "Page resource not found");
            return;
        }

        // 读取页面的jcr:content子资源(通常属性存在这里)
        Resource contentResource = pageResource.getChild("jcr:content");
        if (contentResource == null) {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Page content not found");
            return;
        }

        // 转换为ValueMap读取属性
        ValueMap pageProps = contentResource.getValueMap();
        String storeCode = pageProps.get("storeCode", String.class);
        String jcrTitle = pageProps.get("jcr:title", String.class);
        String siteName = pageProps.get("siteName", String.class);
        String canonicalUrl = pageProps.get("canonicalUrl", String.class);

        // 后续处理多语言数据逻辑
        response.getWriter().printf("Store Code: %s\nPage Title: %s", storeCode, jcrTitle);
    }
}

非绑定资源类型场景的处理

如果Servlet未绑定到页面资源类型,也可以通过Request的路径信息手动获取页面路径,再用ResourceResolver解析:

String pagePath = request.getRequestPathInfo().getResourcePath();
ResourceResolver resolver = request.getResourceResolver();
Resource pageResource = resolver.getResource(pagePath);
// 后续属性读取逻辑同上

注意事项

  • 务必处理Resource为null的情况,避免空指针异常。
  • 多数AEM/Sling页面的属性会存储在jcr:content子节点下,需先获取该子Resource再读取属性。

内容的提问来源于stack exchange,提问作者Deekshith M R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:50:17