开发者

In JSF2, how to know if composite component has children?

开发者 https://www.devze.com 2023-02-10 17:56 出处:网络
I\'m writing a composite com开发者_开发问答ponent, you have a special tag named: <composite:insertChildren />

I'm writing a composite com开发者_开发问答ponent, you have a special tag named:

<composite:insertChildren />

Which inserts all the component's children there. Is there any way to know whether the component has children? Like a boolean value that could go on a "rendered" attribute.


The basic expression you're after is the following:

#{cc.childCount} or more elaborately:

#{component.getCompositeComponentParent(component).childCount}

E.g. the following composite component:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"  
    xmlns:cc="http://java.sun.com/jsf/composite"
>
    <cc:interface/>

    <cc:implementation>             
        <h:outputText value="Children: #{cc.childCount}" />
    </cc:implementation>    
</html>

used on the following Facelet:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"    
    xmlns:test="http://java.sun.com/jsf/composite/test"    
>

    <h:body>

        <test:myCom>
            <h:outputText value="first child" />
            <h:outputText value="second child" />
        </test:myCom>

    </h:body>
</html>

will print Children: 2.

Thus #{cc.childCount != 0} will tell you whether a composite component has children or not.


I've encountered the same problem and managed to find children of a composite component within it's facet 'javax.faces.component.COMPOSITE_FACET_NAME'.

In Java it's like this:

// we are within some method of UIComponent
UIComponent childrenHolderFacet = getFacets().get("javax.faces.component.COMPOSITE_FACET_NAME");
Iterator<UIComponent> childrenIt = childrenHolderFacet.getChildren().iterator();
...

In JSF it's something like:

#{component.getFacets().get("javax.faces.component.COMPOSITE_FACET_NAME").children}

Hope it helps.


At least on Mojarra this does not work. A composite component's children get inserted just fine but accessing #{cc.parent} or #{cc.children} does not work on 2.0.2, and #{cc.childCount} always returns 0 on 2.0.4, regardless of the number of children.

0

精彩评论

暂无评论...
验证码 换一张
取 消