0

私は複合コンポーネントを持っています:

<cc:interface>
    <cc:attribute name="value" required="true">
</cc:interface>
<cc:implementation>
    <h:outputText value="#{cc.attrs.value}"/>
    <h:commandButton action="#{internalBean.someAction}"/>
</cc:implementation>

そして、#{internalBean.someAction} で #{cc.attrs.value} を変更したいと思います。つまり、複合コンポーネントのメソッドでユーザー定義 (外部) Bean の (文字列) 値を変更します。どうすればそれができますか?

ありがとう。

4

3 に答える 3

3

アップデート

私が考えることができる1つの方法は、を使用すること<f:setPropertyActionListener>です。

<cc:interface>
    <cc:attribute name="value" required="true"/>
</cc:interface>
<cc:implementation>
    <h:outputText value="#{cc.attrs.value}"/>
    <h:commandButton action="#{internalBean.someAction}">
        <f:setPropertyActionListener value="#{cc.attrs.value}" target="#{internalBean.stringValueFromExternalBean}"/>
    </h:commandButton>
</cc:implementation>
于 2013-07-15T20:55:27.153 に答える
2

ただし、StringBuilder を使用する必要はありません。

 <composite:interface>
        <composite:attribute name="value" required="true"/>
    </composite:interface>
 <cc:implementation>
 ...
 <f:setPropertyActionListener target="#{cc.attrs.value}" value="#{internalBean.value}"/>
...
</cc:implementation>

値は通常の文字列です。それはうまくいきます!

于 2013-07-17T07:30:11.627 に答える
0

私はついにこれまでで最高の解決策を見つけました。通常のコンポーネントとしてすぐに機能します - すべての変更は外部 Bean プロパティを更新します。

public void setValue(String value) {
    this.value = value;
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ELContext elContext = facesContext.getELContext();
    ValueExpression valueExpression = facesContext.getApplication().getExpressionFactory()
            .createValueExpression(elContext, "#{cc.attrs.value}", String.class);
    valueExpression.setValue(elContext, value);
}
于 2013-08-04T18:41:21.957 に答える