将actionListener方法传递给组件中的commandButton

时间:2012-04-27 09:27:46

标签: jsf jsf-2 composite-component

首先,请原谅我的无知和无能,所以请使用搜索引擎(我发誓我已经搜索了很长时间但经常找不到任何令人满意的答案)。

我有一个bean实现了一个与动作监听器兼容的方法:

@ManagedBean(name = "myBean")
@ViewScoped
class Bean{
    public String myAction(ActionEvent event){
        ... = event.getComponent().getAttributes().get("something");
    }
}

然后,我有一个像这样的jsf组件:

<composite:interface>
    <composite:attribute name="actionBean" required="true"/>
    <composite:attribute name="actionMethod" method-signature="void myAction(javax.faces.event.ActionEvent)" />
</composite:interface>
<composite:implementation>
        <h:form>
            <p:commandButton actionListener="#{cc.attrs.actionBean[cc.attrs.actionMethod]}">
                <f:attribute name="something" value="somevalue" />
            </p:commandButton>
        </h:form>
</composite:implementation>

它被称为这样的东西:

<namespace:myComponent actionBean="#{myBean}" actionMethod="myAction" />

我知道这个电话不起作用,我想知道该怎么做!

我的主要目的是我希望有一个相对通用的jsf组件(以后可以重用它会很好),它包含一个按钮。单击此按钮我想传递一个对象(没有简单的字符串!如果是字符串,我只使用action="..."并通过f:param传递)。使用actionListener方法,我通过event.getComponent().getAttributes().get("something")获取对象。

我认为签名void myAction(javax.faces.event.ActionEvent)是将相关方法传递给组件的问题,不是吗?通常可以将带有任何参数的方法传递给jsf组件(如果是,如何)?

所以,我希望有一个可能的解决方案来解决改变上述策略的一般问题,或者可能使用一些好的和不同的东西(通常我不喜欢使用任何黑客或解决方法,但是喜欢使用的是框架)。

谢谢,如果有人愿意给我指路!如果这个问题已经存在,那么很高兴找到相关的帖子并将其删除。

1 个答案:

答案 0 :(得分:3)

请尝试以下操作:

<namespace:myComponent myAction="#{myBean.myAction}"/>

复合组件:

<composite:interface>
    <composite:attribute name="myAction" 
                         required="true" 
                         method-signature="void myAction(javax.faces.event.ActionEvent)"
                         targetAttributeName="actionListener"/>
</composite:interface>
<composite:implementation>
    <h:form>
        <p:commandButton id="myAction">
            <f:attribute name="something" value="somevalue" />
        </p:commandButton>
    </h:form>
</composite:implementation>

查看composite:attribute文档。它有几个选项可以将侦听器传递给复合组件。我使用了targetAttributeName