0

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

我有一个实现动作侦听器兼容方法的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 组件(如果可以,如何)?

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

谢谢,如果有人能找到时间给我指路!如果这个问题已经存在,最好能找到相关的帖子并将其删除。

4

1 回答 1

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>

检查复合:属性文档。它有几个选项可以将侦听器传递给复合组件。我用targetAttributeName这个。

于 2012-04-27T10:57:50.680 回答