复合组件如何在其客户端的辅助bean中设置属性?

时间:2011-08-23 13:38:38

标签: jsf-2 composite-component

我有一个复合组件,其接口包含:

<cc:attribute name="model"
                  shortDescription="Bean that contains Location" >
        <cc:attribute name="location" type="pkg.Location"
                      required="true" />
    </cc:attribute>
</cc:interface>

所以我可以使用#{cc.attrs.model.location} 访问标记中的 Location 对象。

我也从复合组件的支持bean访问该对象,如下所示:

    FacesContext fc = FacesContext.getCurrentInstance();
    Object obj = fc.getApplication().evaluateExpressionGet(fc, 
            "#{cc.attrs.model.location}", Location.class);

所以现在我的复合组件完成了它的工作 - 如何从辅助bean调用模型上的setter方法? (即 model.setLocation(someValue)

2 个答案:

答案 0 :(得分:7)

使用ValueExpression#setValue()

FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ValueExpression valueExpression = facesContext.getApplication().getExpressionFactory()
    .createValueExpression(elContext, "#{cc.attrs.model.location}", Location.class);

valueExpression.setValue(elContext, newLocation);

Application#evaluateExpressionGet()顺便打电话给ValueExpression#getValue(),完全按照javadoc的描述(如果您曾阅读过它......)


对具体问题

无关,您是否了解为复合组件创建支持UIComponent类的可能性?我敢打赌,这比以这种方式摆弄ValueExpression容易得多。然后,您可以使用继承的getAttributes()方法获取model

Model model = (Model) getAttributes().get("model);
// ...

您可以在我们的composite component wiki page中找到一个示例。

答案 1 :(得分:1)

属性“默认”怎么样?在使用支持组件实现时,它没有实现。

xhtml:

<composite:interface>
    <composite:attribute name="test" 
                         type="java.lang.Boolean" 
                         default="#{false}"/>
</composite:interface>
<composite:implementation >
    TEST : #{cc.attrs.test}
</composite:implementation >

Java支持实现:

 testValue = (Boolean) getAttributes().get("test");

如果在主xhtml中设置test属性没问题:xhtml和java支持都具有相同的值。但是当没有设置时,默认值仅在xhtml上: html包含

TEST : false 

但是支持

时testValue为null