将Argument传递给复合组件操作属性

Ben*_*Ben 13 facelets composite-component jsf-2

标题真的说明了一切.我已经尝试了失败的错误:

Illegal attempt to pass arguments to a composite component lookup expression (i.e. cc.attrs.[identifier]).

我的尝试看起来像这样:

<composite:interface>
  <composite:attribute name="removeFieldAction" method-signature="void action(java.lang.String)" />
</composite:interface>
<composite:implementation>
  <h:commandButton value="Remove" action="#{cc.attrs.removeFieldAction('SomeString')}"/>
</composite:implementation>
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

Bal*_*usC 32

这确实无法奏效.之后你不能传递"额外"参数.在method-signature你已经声明在其中被使用的复合材料部件的一侧被满足.例如

<my:button action="#{bean.remove('Somestring')}" />
Run Code Online (Sandbox Code Playgroud)

复合组件实现应该如下所示

<h:commandButton value="Remove" action="#{cc.attrs.removeFieldAction}" />
Run Code Online (Sandbox Code Playgroud)

如果这不是您想要的,并且您真的想要从复合组件侧传递它,那么我可以想到两种传递额外参数的方法:使用<f:attribute>动作侦听器将其作为attidional组件属性传递,或者<f:setPropertyActionListner>让JSF在调用操作之前将其设置为属性.但是两者都没有在复合组件中没有变化.您至少需要请求整个bean作为复合组件的属性.

这是一个例子<f:setPropertyActionListener>.这会在调用操作之前设置属性.

<composite:interface>
    <composite:attribute name="bean" type="java.lang.Object" />
    <composite:attribute name="action" type="java.lang.String" />
    <composite:attribute name="property" type="java.lang.String" />
</composite:interface>
<composite:implementation>
    <h:commandButton value="Remove" action="#{cc.attrs.bean[cc.attrs.action]}">
        <f:setPropertyActionListener target="#{cc.attrs.bean[cc.attrs.property]}" value="Somestring" />
    </h:commandButton>
</composite:implementation>
Run Code Online (Sandbox Code Playgroud)

哪个用作

<my:button bean="#{bean}" action="removeFieldAction" property="someString" />
Run Code Online (Sandbox Code Playgroud)

使用上面的示例,bean应该看起来像

public class Bean {

    private String someString;

    public void removeFieldAction() {
        System.out.println(someString); // Somestring
        // ...
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果您遵守特定约定,您甚至可以property完全省略该属性.

  • 这仍然相关吗?它很麻烦,应该有更好的方法从复合组件返回值@BalusC (2认同)