在CQ 5.6中的bean中获取slingRequest

时间:2014-09-18 21:52:50

标签: cq5 jcr aem sling

libs/foundation/global.jsp包含在我的jsp顶部,调用<cq:defineObjects />,最终实例化我可以在我的scriptlet中使用的slingRequest或currentNode变量。但是,我正在创建bean并将它们包括在内

<jsp:useBean id="myBean" class="com.foo.bar.MyBean" />
<jsp:setProperty name="myBean" property="request" value="<%= slingRequest %>" />

在我的bean中我有一个getter / setter

public SlingHttpServletRequest getRequest() {
    return resource;
}

public void setRequest(SlingHttpServletRequest request) {
    this.resource = resource;
}

这里我实例化bean并传入对当前请求的引用。

我的问题是,我怎样才能避免传递这个参数?有没有办法通过某种静态上下文获取对当前请求的引用,以便我可以在构造函数中设置bean属性?

2 个答案:

答案 0 :(得分:1)

无法将请求静态传递给新创建的bean(并且由于可能同时存在多个请求,因此我们无法拥有共享的静态变量存储它)。您可以创建一个scriptlet:

<% pageContext.setAttribute("myBean", new MyBean(slingRequest)); %>

MyBean property: ${myBean.property}

或摆脱bean并使用Thomas提到的其中一个框架:

答案 1 :(得分:0)

您永远不应将请求对象传递给Bean类。我同意Thomas和Tomek的回答。

但是,在项目中间突然开始使用框架来解决这个问题是一种过度的做法。

这里的基本思想是不应传递请求对象。相反,您应该从请求中获取资源URI并将其传递给Bean类。

此外,您可以传递ResourceResolver对象以获取Bean类中的任何资源。

我的示例代码如下所示:

    <jsp:useBean id="myBean" class="com.foo.bar.MyBean" />
    <jsp:setProperty name="myBean" property="resourcePath" value="<%= slingRequest.getResourceURI() %>" />
    <jsp:setProperty name="myBean" property="resourceResolver" value="<%= slingRequest.getResourceResolver() %>" />

我的Bean类方法是这样的:

public SlingHttpServletRequest getResourcePath() {
    return resourcePath;
}

public void setResourceResolver(String resourcePath) {
    this.resourcePath = resourcePath;
}

public SlingHttpServletRequest getResourceResolver() {
    return resolver;
}

public void setResourceResolver(ResourceResolver resovler) {
    this.resolver = resolver;
}

现在在您的bean类中,您可以使用resourcePath和ResourceResolver构建资源对象,如下所示:

Resource resource = resourceResolver.resolve(resourcePath);