复合组件 - 更改外部bean值

时间:2013-07-15 11:00:46

标签: jsf composite-component

我有一个复合组件:

<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的(String)值。我怎么能这样做?

感谢。

3 个答案:

答案 0 :(得分:3)

<强>更新

我能想到的一种方法是使用<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>

答案 1 :(得分: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>

其中值是普通字符串。它工作正常!

答案 2 :(得分: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);
}