使用URL在Java类中创建页面对象

时间:2013-08-29 05:58:39

标签: cq5 aem

在我的OSGi包中的Java类中,我有一个页面的URI -

String pageUri = "/content/site/page.html" ;

如何使用此URL创建Page对象?我基本上也需要稍后从对象中获取页面属性...

我在课堂上尝试了这段代码:

PageManager pm = new PageManager();
Page page = pm.getPage(pageUri);

但是这给了我编译错误:

Cannot instantiate the type PageManager

3 个答案:

答案 0 :(得分:6)

您应该能够将ResourceResolverFactory实例注入到组件/服务中,并从那里解析资源/页面,如Getting Resources and Properties in Sling中所述。

例如:

@Component(immediate = true)
@Service(GetMeAPage.class)
public class GetMeAPage {

    @Reference
    private ResourceResolverFactory resourceResolverFactory;

    private static final String pageUri = "/content/site/page.html";

    /**
     * This method is executed at component startup rather than in the context of a request.
     */
    @Activate
    public void getSpecificPage() {
        ResourceResolver resourceResolver = null;
        try {
            resourceResolver = resourceResolverFactory.getAdministrativeResourceResolver(null);
            Page page = getSpecificPage(resourceResolver);
            System.out.println(page.getTitle());
        } catch (LoginException e) {
            e.printStackTrace();
        } finally {
            if (resourceResolver != null) {
                resourceResolver.close();
            }
        }
    }

    public Page getSpecificPage(ResourceResolver resourceResolver) {
        Resource resource = resourceResolver.resolve(pageUri);
        return resource.adaptTo(Page.class);

    }
}

Full code in this gist

这使用管理登录,即not ideal。我建议使用请求中的ResourceResolver。最简单的方法是将它作为方法参数传递给组件/ servlet中的getSpecificPage(resourceResolver)(上面)。

<强>更新 在更新版本的Sling(大约2014年,AEM6 +)中执行此操作的正确方法是使用Sling Service Authentication。现在不推荐使用getAdministrativeResourceResolver方法。

答案 1 :(得分:2)

如果通过“OSGi包中的类”,您正在扩展 SlingAllMethodsServlet ,您将可以访问该请求,您可以从中获取解析程序/页面管理器。

class Foo extends SlingAllMethodsServlet {
    @Override
    protected void doGet(SlingHttpServletRequest request, 
                         SlingHttpServletResponse response) 
        throws javax.servlet.ServletException, java.io.IOException {

           ResourceResolver resourceResolver = request.getResourceResolver();
           PageManager pageManager = resourceResolver.adaptTo(PageManager.class);

           String pageUri = "/content/site/page.html" ;
           Page page = pageManager.getPage(pageUri);
    }
}

这取决于您在此捆绑中的设置。

答案 2 :(得分:1)

无法实例化PageManager。要获取实例,您可以调整资源解析器: resourceResolver.adaptTo(PageManager.class)。

通常可以从资源获取resourceResolver: resource.getResourceResolver(),您也可以直接从吊索请求中获取它