web-dev-qa-db-ja.com

複合コンポーネントのアクション属性に引数を渡す

タイトルは本当にそれをすべて言います。私はエラーで失敗した試みをしました:

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>

これを行う正しい方法は何ですか?

13
Ben

これは確かに機能しません。後でそのように「余分な」パラメータを渡すことはできません。宣言したmethod-signatureは、複合コンポーネントが使用されている側で実行する必要があります。例えば。

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

複合コンポーネントの実装は次のようになります

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

これが必要なものではなく、複合コンポーネント側から本当に渡したい場合は、追加の引数を渡す2つの方法を考えることができます。アクションリスナーで <f:attribute> を使用するそれを属性コンポーネント属性として渡すか、 <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属性を完全に省略することもできます。

34
BalusC