This specialized MethodExpression
enables the evaluation of composite component expressions. Instances of this expression will be created when {@link com.sun.faces.facelets.tag.TagAttributeImpl#getValueExpression(javax.faces.view.facelets.FaceletContext,Class)}is invoked and the expression represents a composite component expression (i.e. #{cc.[properties]}).
It's important to note that these MethodExpression
s are context sensitive in that they leverage the location in which they were referenced in order to push the proper composite component to the evaluation context prior to evaluating the expression itself.
Here's an example:
Using Page test.xhtml --------------------------------- <ez:comp1 do="#{bean.action}" /> comp1.xhtml --------------------------------- <composite:interface> <composite:attribute name="do" method-signature="String f()" required="true" /> </composite:interface> <composite:implementation> <ez:nesting> <h:commandButton value="Click Me!" action="#{cc.attrs.do} /> </ez:nesting> </composite:implementation> nesting.xhtml --------------------------------- <composite:interface /> <composite:implementation> <composite:insertChildren> </composite:implementation>
When
commandButton
is clicked, the
ContextualCompositeMethodExpression
first is looked up by {@link com.sun.faces.facelets.tag.TagAttributeImpl.AttributeLookupMethodExpression}which results an instance of
ContextualCompositeMethodExpression
. When this
ContextualCompositeMethodExpression is invoked, the {@link javax.faces.view.Location}object necessary to find the proper composite component will be derived from source ValueExpression
provided at construction time. Using the derived {@link javax.faces.view.Location}, we can find the composite component that matches 'owns' the template in which the expression was defined in by comparing the path of the Location with the name and library of the {@link javax.faces.application.Resource}instance associated with each composite component. If a matching composite component is found, it will be made available to the EL by calling {@link CompositeComponentStackManager#push(javax.faces.component.UIComponent)}.