タイトルは本当にそれをすべて言います。私はエラーで失敗した試みをしました:
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>
これを行う正しい方法は何ですか?
これは確かに機能しません。後でそのように「余分な」パラメータを渡すことはできません。宣言した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
属性を完全に省略することもできます。