2014-09-18 3 views
1

libs/foundation/global.jsp을 내 jsp 맨 위에 포함하면 <cq:defineObjects />이 호출되어 스크립틀릿에서 사용할 수있는 slingRequest 또는 currentNode 변수를 인스턴스화합니다. 그러나, 나는 콩을 만드는 등CQ 5.6의 빈에서 slingRequest 가져 오기

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

처럼 내 콩에서 나는 빈을 인스턴스화하고 현재에 대한 참조를 전달하고있어

다음
public SlingHttpServletRequest getRequest() { 
    return resource; 
} 

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

게터/세터에게이를 포함하고있다 의뢰.

내 질문에이 매개 변수를 전달하지 않아도되는 이유는 무엇입니까? 일종의 정적 컨텍스트를 통해 현재 요청에 대한 참조를 가져 와서 생성자에서 bean 속성을 설정할 수있는 방법이 있습니까?

+0

jsp : useBean을 사용하는 경우 Bean 내에서 모든 인스턴스에 액세스 할 수있는 PageContext에 액세스 할 수 있는지 확실하지 않습니다. 요청과 같은 속성을 삽입하는 빈에 대한 사용자 정의 태그가 있습니다. 슬링 모델, 슬라이스, NEBA ... – Thomas

답변

1

새로 생성 된 Bean에 요청을 정적으로 전달할 방법이 없습니다 (동시에 많은 요청이있을 수 있으므로 공유 정적 변수를 저장할 수 없습니다) . 당신은 스크립틀릿 만들 수 있습니다 :

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

MyBean property: ${myBean.property} 

또는 콩을 없애와 토마스에 의해 언급 한 프레임 워크 중 하나를 사용

+0

감사합니다. 이것은 좋은 것입니다. 슬링 모델과 슬라이스를 maven-bundle-plugin에 포함시키려는 초기 시도는 효과가 없지만 계속 노력하겠습니다. –

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() %>" /> 

을 내 콩 클래스 메서드는 다음과 같이 될 것이다 :

내 샘플 코드는 다음과 같이 보일 것이다

여러분의 빈 클래스에서 지금
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; 
} 

, 당신은 자원 객체를 형성 할 수있다 resourcePath와 ResourceResolver를 다음과 같이 사용하십시오 :

Resource resource = resourceResolver.resolve(resourcePath);