After my last blog post on composite components, Ed Burns, the spec lead, pointed out a better way to do things, by using a controller for the component. Let's go over a simple example of how that would work. The example won't actually do anything (unlike most of my examples, which at least pretend to perform a function) - I just want to sketch out a single, simple concept, and show it in code. 

We'll create a component that takes a single argument - but that argument will actually consist of two different values, bundled into a single bean. Here's the meat of the bean's code:

@ManagedBean(name="multinumber")
@SessionScoped
public class MultiNumberHolder {

    private Integer i1 = 1;
    private Integer i2 = 2;

    public void setNumber1(Integer i) {
        this.i1 = i;
    }

    public Integer getNumber1() {
        return i1;
    }

    public void setNumber2(Integer i) {
        this.i2 = i;
    }

    public Integer getNumber2() {
        return i2;
    }

As you can see, just two int values.

And to see how you'd use this in a page, here's the code:

<ez:double controller="#{multinumber}"/>

Where, of course, you've defined ez as a composite component library, and double is a component in that library. So, let's look at the double.xhtml library's interface and implementation sections:

<cc:interface name="double"
                     displayName="Very Basic Output Component"
                     shortDescription="A basic example of the composite component feature">
   <cc:attribute name="controller" required="true">
        <cc:attribute name="number1" required="true"/>
        <cc:attribute name="number2" required="true"/>
   </cc:attribute>
</cc:interface>

<cc:implementation>
    <h:inputText value="#{cc.attrs.controller.number1}"/>
    <br/>
    <h:inputText value="#{cc.attrs.controller.number2}"/>
    <br/>
</cc:implementation>

I'm pretty sure that this doesn't need much explanation, but just in case - I've declared that the component takes one attribute - controller, and that that controller has two fields, number1 and number2. Then, in the implementation section, I can reference those fields with a simple dot notation.

As always, this code is available in Mojarra's jsf-demo directory, in this case, under the basic-ezcomp directory.