How does a composite component set a property in it's client's backing bean?

两盒软妹~` 提交于 2019-12-20 10:48:27

问题


I have a composite component with an interface that contains this:

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

So I can access the Location object in the markup with #{cc.attrs.model.location}.

I also access that object from the backing bean of the composite component like this:

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

So now my composite component has done its work -- how do I call the setter method on the model from the backing bean? (i.e. model.setLocation(someValue) ?


回答1:


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

The Application#evaluateExpressionGet() by the way calls ValueExpression#getValue() under the covers, exactly as described by its javadoc (if you have ever read it...)


Unrelated to the concrete problem, are you aware about the possibility to create backing UIComponent class for the composite component? I bet that this is much easier than fiddling with ValueExpressions this way. You could then just use the inherited getAttributes() method to get the model.

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

You can find an example in our composite component wiki page.




回答2:


what about the attribute "default" ? It seam that it is not implemented when using the backing component implementation.

xhtml :

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

Java backing implementation :

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

if the test attribute is set in the main xhtml no problem : both xhtml and java backing have the same value. But when not set the default value is only on xhtml : The html contains

TEST : false 

But testValue is null in backing



来源:https://stackoverflow.com/questions/7161875/how-does-a-composite-component-set-a-property-in-its-clients-backing-bean

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!