0

我正在寻找一个关于如何将方法表达式传递给自定义组件的最小示例。我尝试了以下操作,但从未调用过我组件的负责设置器。

豆我的看法:

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


我的观点:

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


我的组件的 Bean:

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);
}


在我的组件渲染器中,我调用component.getFoo()并获得了一个 NPE。

4

1 回答 1

2

您需要实现ActionSource2接口:

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

或者,更容易从UICommand类(也被<h:commandXxx>组件使用)扩展,该类已经以正确的方式实现了所有这些ActionSource2方法,这样您就不需要重复这项工作:

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

无论哪种方式,您都可以在其上使用action="#{some method expression}"甚至附加动作侦听器。请注意,您不能重命名属性 name action。它真的必须是action

这种自定义组件的一个开源示例是OmniFaces<o:commandScript>。源代码可在此处获得。

于 2013-09-05T12:20:12.907 回答