15

标题真的说明了一切。我进行了一次尝试,但因错误而失败:

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>

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

4

1 回答 1

36

这确实行不通。之后你不能像那样传递“额外”参数。正如您所声明的method-signature,必须在使用复合组件的一侧实现。例如

<my:button action="#{bean.remove('Somestring')}" />

复合组件实现应该看起来像这样

<h:commandButton value="Remove" action="#{cc.attrs.removeFieldAction}" />

如果这不是您想要的并且您真的想从复合组件端传递它,那么我可以考虑两种传递额外参数的方法:使用<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>

这将用作

<my:button bean="#{bean}" action="removeFieldAction" property="someString" />

对于上面的例子,bean 应该看起来像

public class Bean {

    private String someString;

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

    // ...
}

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

于 2011-06-15T11:18:03.453 回答