2013-09-05 3 views
0

메서드 표현식을 사용자 지정 구성 요소에 전달하는 방법에 대한 최소한의 예제를 찾고 있습니다. 나는 다음을 시도했지만, 책임이있는 구성 요소의 설정자는 결코 호출되지 않는다.메서드 표현식을 사용자 지정 구성 요소에 전달

public String bar(){ 
    //do stuff 
    return ""; 
} 


내보기 : 내 구성 요소에 대한

<my:comp foo="#{bean.bar}" /> 


콩 :

private static final String FOO = "foo"; 
public void setFoo(MethodExpression me){ 
    //never called 
    getStateHelper().put(FOO, me); 
} 

public MethodExpression getFoo(){ 
    //actually gets called 
    return (MethodExpression) getStateHelper().get(FOO); 
} 


인 내보기에 대한

콩을 ide 구성 요소 렌더러에서 component.getFoo()으로 전화하여 NPE를 얻습니다. 아직 올바른 방법을 구현하는 ActionSource2 모든 방법이있는 (또한 <h:commandXxx> 구성 요소에서 사용되는) UICommand 클래스에서 확장,

@FacesComponent(MyComponent.COMPONENT_TYPE) 
public class Mycomponent extends UIComponentBase implements ActionSource2 { 
    // ... 
} 

또는 쉽게 :

답변

1

당신은 ActionSource2 인터페이스를 구현해야 당신이 작업을 반복 할 필요가 없습니다 :

@FacesComponent(MyComponent.COMPONENT_TYPE) 
public class Mycomponent extends UICommand { 
    // ... 
} 

어느 쪽이든을, 당신은 action="#{some method expression}"을 사용하고 심지어에 ActionListener를 첨부 할 수 있습니다. 속성 이름 action의 이름을 바꿀 수 없습니다. 실제로는 action이어야합니다.

이러한 사용자 지정 구성 요소의 오픈 소스 예제는 OmniFaces <o:commandScript>입니다. 소스 코드는 here입니다.

+0

조언 해 주셔서 감사합니다. 주제에 대한 몇 가지 사실을 읽고'Action' 매개 변수를 처리하는 'ComponentHandler'가 필요하다는 것을 알게되었습니다. [link] (http://jdevelopment.nl/passing-action-methods-facelets-tags/)를 참조하십시오. 하지만 난 jQuery와 onClick 어떤 종류의 처리기를 사용하여 모든 문제를 피하기 위해 노력할 것 같아요. – FeinesFabi

+0

핸들러가 필요하지 않습니다. 올바른 인터페이스를 구현하거나 올바른 컴포넌트에서 확장하는 경우 이미 JSF가 처리하고있다. 어떤 방식 으로든 명령 스크립트 예제의 소스 코드를 보았습니까? 하나의 컴포넌트 클래스는 (물론 taglib.xml에있는 명백한 항목을 제외하고) * 모두 * 필요합니다. 그래서 나는 당신이 "전체 이슈"와 정확히 무슨 뜻인지 전혀 모른다. "문제"가 단지 무지가 아닌가? – BalusC

관련 문제