2012-01-27 4 views
4

여기에는 매우 간단한 시나리오가 있습니다. 그러나 복합 컴포넌트와 f : attribute 태그에 어떻게 든 달라 붙었습니다. 가능한 한 간단하게 코드를 유지하려고 노력할 것입니다.복합 컴포넌트 내에서 f : attribute 사용

복합 구성 요소 :

<cc:interface name="button"> 
    ... 
    <cc:attribute 
     name="actionListener" 
     required="true" 
     method-signature="void f(javax.faces.event.ActionEvent)" 
     target="button" 
     shortDescription="The action listener for this button." /> 
    ... 
</cc:interface> 

<cc:implementation> 
    <ice:commandButton 
     ... 
     actionListener="#{cc.attrs.actionListener}" 
     ...> 

     <cc:insertChildren /> 
    </ice:commandButton> 
</cc:implementation> 

은 ... 지금 우리는 다음과 같이 구성 요소를 사용

<ctrl:button 
    ... 
    actionListener="#{bean.method}" 
    ...> 
    <f:attribute name="objectId" value="#{someObject.id}" /> 
</ctrl:button> 

이제 우리는 액션 청취자 방법 내부의 "OBJECTID"속성에 액세스해야합니다. 우리는 이미 다음과 같이 어떤 것을 시도했다.

public void method(ActionEvent event) 
{ 
    ... 
    event.getComponent().getAttributes().get("objectId"); 
    ... 
} 

그러나 속성 맵에는 objectId가 포함되어 있지 않다. 이 접근법에 문제가 있습니까? 이 문제를 해결하기 위해 권장되는 방법은 무엇입니까?

누군가가 우리를 도울 수 있다면 좋을 것입니다.

감사합니다. SlimShady

답변

5

<f:attribute> 해킹은 명령 단추/링크에 추가 인수로 개체를 전달할 수없는 경우 JSF 1.0/1.1에서 남은 것입니다. JSF 1.2부터 <f:setPropertyActionListener>을 사용해야합니다.

<ctrl:button action="#{bean.method}"> 
    <f:setPropertyActionListener target="#{bean.objectId}" value="#{someObject.id}" /> 
</ctrl:button> 

이후 (서블릿 3.0의 표준 부분이지만 JBoss EL의 도움으로 구현 가능한 서블릿 2.5입니다) 대신도 단지 방법의 인수로 전체 개체를 전달할 수 EL 2.2 :

<ctrl:button action="#{bean.method(someObject.id)}" /> 
+0

안녕하세요 @BalusC :) 현재 JSF 2로 마이그레이션 중이며 비슷한 문제가 있습니다.나는 두 가지 질문을 가지고있다 :'f : setPropertyActionListener'는 타겟을 필요로하고 스펙 TLD는 태그의'name' 속성을 나열하지 않으므로'target'을 의미할까요? – truemmer

+0

@truemmer : Copypaste 실수, 예 :) 해결했습니다. – BalusC

+0

두 번째 질문을 편집하기에는 너무 느리다 .-) 다음 질문은 두 번째 해결 방법에 관한 것입니다. 복합 컴포넌트 인터페이스에서 "target"도 제공하는 "action"이라는 속성이 있어야합니다. 맞습니까? JSF 2 스펙에서 조치 메소드에 매개 변수가 필요하지 않은 이유는 무엇입니까? 이 모든 것을 여기에 보내 주셔서 고마워요. – truemmer

3

다음 설정에서 cc로 전달 된 속성을 읽을 수있었습니다.

public void actionListener(ActionEvent event) { 
    event.getComponent().getNamingContainer().getAttributes().get("fAttribute") 
    // > myAttributeValue 
    event.getComponent().getAttributes().get("innerAttribute") 
    // > innerAttributeValue 
} 

트릭



<cc:implementation> 
    <h:commandButton value="button" actionListener="#{testBean.actionListener}" > 
     <f:attribute name="innerAttribute" value="innerAttributeValue" /> 
      <cc:insertChildren /> <!-- not necessary, I hoped it would pass the outer attribute ---> 
    </h:commandButton> 
</cc:implementation> 
<test:inner> 
    <f:attribute name="fAttribute" value="myAttributeValue" /> 
</test:inner> 

버튼의 명명 컨테이너 내에서 검색하는 것이 었습니다. 따라서 참조는 항상 네이밍 컨테이너이므로 내부 구성 요소로 끝나는 지 확인할 수 있습니다.

그것이 의도하는 방식인지는 확실하지 않지만 이름 지정 컨테이너가 자녀를 위해 그러한 속성을 수집하는 한 알아 냈습니다.

Q : 버튼에 속성을 전달하지 않으면 누구도 Mojarra/JSF의 버그로 간주됩니까?

+0

나 ' 이것이 해킹으로 간주되어야하는지 확신 할 수 없지만 JSF 2 로의 마이그레이션 중 임시 단계로 솔루션을 좋아합니다. IMHO 당신은 BalusC 솔루션의 두 번째 접근법을 장기간 준수해야합니다. – truemmer

+0

@BalusC 솔루션에서 2 con을 볼 수 있다고 생각합니다 :'action = # {myBean.myMethod (myParameter)} '를'actionListener' 매개 변수와 함께 사용할 수 없으며 때로는 유용하기 때문에'f : setPropertyActionListener 'solution in 'ui : repeat'와 같은 루프 내부의 유일한 bean 속성으로 값을 바인딩해야합니다. –

관련 문제