6

我有一个复合组件,其接口包含以下内容:

<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)

4

2 回答 2

8

使用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为复合组件创建支持类的可能性?我敢打赌,这比以这种方式摆弄ValueExpressions 容易得多。然后,您可以只使用继承的getAttributes()方法来获取model.

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

您可以在我们的复合组件 wiki 页面中找到一个示例。

于 2011-08-23T15:18:13.043 回答
1

那么“默认”属性呢?它接缝在使用支持组件实现时未实现。

html:

<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 在支持中为空

于 2013-08-01T12:51:39.173 回答