blob: 32f722f5cf3ab5108be47a28db74a5be24152fe3 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
Copyright 2009 Sun Microsystems, Inc. All rights reserved.
The contents of this file are subject to the terms of either the GNU
General Public License Version 2 only ("GPL") or the Common Development
and Distribution License("CDDL") (collectively, the "License"). You
may not use this file except in compliance with the License. You can obtain
a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
language governing permissions and limitations under the License.
When distributing the software, include this License Header Notice in each
file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
Sun designates this particular file as subject to the "Classpath" exception
as provided by Sun in the GPL Version 2 section of the License file that
accompanied this code. If applicable, add the following below the License
Header, with the fields enclosed by brackets [] replaced by your own
identifying information: "Portions Copyrighted [year]
[name of copyright owner]"
Contributor(s):
If you wish your version of this file to be governed by only the CDDL or
only the GPL Version 2, indicate your decision by adding "[Contributor]
elects to include this software in this distribution under the [CDDL or GPL
Version 2] license." If you don't indicate a single choice of license, a
recipient has the option to distribute your version of this file under
either the CDDL, the GPL Version 2 or to extend the choice of license to
its licensees as provided above. However, if you add GPL Version 2 code
and therefore, elected the GPL Version 2 license, then the option applies
only if the new code is made subject to such option by the copyright
holder.
-->
<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<description>
&lt;/pre&gt;
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Describes the Facelets2 tag library used for declaring and
defining
the usage contract for composite UI Components. When authoring a
composite component, use of this tag library is largely optional,
though always recommended. Declaring and defining a composite
component with this taglib provides valuable information about the
component that can be used by tools and users of the composite
component. In most cases, a composite component can be authored
without declaring and defining its usage contract with this taglib.
PENDING: the limit of what one can do without declaring and defining a
usage contract must be cleary specified and documented. PENDING: The
implementation team must help discover these limits.
&lt;/p&gt;
&lt;h2&gt;Creating a Composite Component&lt;/h2&gt;
&lt;p&gt;The default implementation must support authoring A composite
component is declared by creating a Facelets2 file inside of a resource
library. (See section JSF.2.6 of the specification prose document for
more information about resource libraries.) A composite component
must reside within a resource library. It is not possible to create a
composite component without putting it inside of a resource
library.&lt;/p&gt;
&lt;p&gt;The default XML namespace URI of the taglib that contains the
composite component, for use in &lt;em&gt;the using page&lt;/em&gt;, is
&lt;code&gt;http://java.sun.com/jsf/composite/&amp;lt;composite-library-name&amp;gt;&lt;/code&gt;,
where &lt;code&gt;&amp;lt;composite-library-name&amp;gt;&lt;/code&gt; is
the name of the
resource library. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
&lt;br /&gt;
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br
/&gt;
&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;
xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;
xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;
xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;
xmlns:ez="&lt;i&gt;http://java.sun.com/jsf/composite/&lt;b&gt;ezcomp&lt;/b&gt;&lt;/i&gt;"&amp;gt;&lt;br
/&gt;
...&lt;br /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This declares that any Facelets2 file in the resource
library called &lt;code&gt;ezcomp&lt;/code&gt; can be used as a regular
JSF UI
component in a page with the above namespace declaration by using the
"&lt;code&gt;ez&lt;/code&gt;" prefix. For example, placing a file called
&lt;code&gt;foo.xhtml&lt;/code&gt; in a resource library called &lt;code&gt;ezcomp&lt;/code&gt;
would make that file accessible like this.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;ez:foo /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The implementation must also support declaring the
namespace of the tag library in a JSF PDL tag library descriptor.
This descriptor file is optional and is useful for component vendors
that do not want to use the default XML namespace. This version of
the proposal currently uses the facelet taglib descriptor syntax. For
example: &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;facelet-taglib&amp;gt;&lt;br /&gt;
&amp;lt;namespace&amp;gt;http://domain.com/path&amp;lt;/namespace&amp;gt;
&lt;br /&gt;
&amp;lt;composite-library-name&amp;gt;compositeTest&amp;lt;/composite-library-name&amp;gt;
&lt;br /&gt;
&amp;lt;/facelet-taglib&amp;gt; &lt;br /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Components from that taglibrary may be used in a using page by
declaring them in the XML namespace for that page:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
&lt;br /&gt;
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br
/&gt;
&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;
xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;
xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;
xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;
xmlns:ez="&lt;i&gt;&lt;b&gt;http://domain.com/path/namespace&lt;/b&gt;&lt;/i&gt;"&amp;gt;&lt;br
/&gt;
...&lt;br /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a name="composite_example"&gt;Below is an example of a
fairly
involved composite component declaration. Such a declaration might
appear in &lt;code&gt;foo.xhtml&lt;/code&gt;.&lt;/a&gt;&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;div class="html4strict"
style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;&lt;a
href="interface.html"&gt;composite:interface&lt;/a&gt; &lt;span
class="kw3"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp;displayName=&lt;span class="st0"&gt;&amp;quot;Very Simple
Login Panel&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp;preferred=&lt;span class="st0"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp;expert=&lt;span class="st0"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp;shortDescription=&lt;span class="st0"&gt;&amp;quot;An
illustration of the composite component feature&amp;quot;&lt;/span&gt;&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;&lt;a href="attribute.html"&gt;composite:attribute&lt;/a&gt;
&lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;
required=&lt;span class="st0"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:attribute &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;loginAction&amp;quot;&lt;/span&gt; required=&lt;span
class="st0"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; method-signature=&lt;span
class="st0"&gt;&amp;quot;java.lang.Object action()&amp;quot;&lt;/span&gt;/
&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:attribute&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:attribute &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;valueChangeListener&amp;quot;&lt;/span&gt;
targets=&lt;span class="st0"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;
/&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:attribute &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;specialMethodExpression&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;method-signature=&lt;span class="st0"&gt;&amp;quot;com.foo.User
validateCurrentUser()&amp;quot;&lt;/span&gt; /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:attribute &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;loginButtonLabel&amp;quot;&lt;/span&gt;
default=&lt;span class="st0"&gt;&amp;quot;Login&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;&lt;a href="editableValueHolder.html"&gt;composite:editableValueHolder&lt;/a&gt;
&lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;
/&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;loginEvent&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;cancelEvent&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;allEvents&amp;quot;&lt;/span&gt; targets=&lt;span
class="st0"&gt;&amp;quot;loginEvent,cancelEvent&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc2"&gt;&amp;lt;&lt;a
href="implementation.html"&gt;composite:implementation&lt;/a&gt; &lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;ui:decorate template=&lt;span class="st0"&gt;&amp;quot;fooTemplate.xhtml&amp;quot;&lt;/span&gt;&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;ui:define &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;header&amp;quot;&lt;/span&gt;&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/span&gt;This
is the login panel header&lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span
class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/ui:define&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;ui:define &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&lt;span class="sc2"&gt;&amp;lt;h:inputText &lt;span
class="kw3"&gt;id&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;
/&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &lt;span class="sc2"&gt;&amp;lt;h:commandButton &lt;span
class="kw3"&gt;id&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;loginEvent&amp;quot;&lt;/span&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="kw3"&gt;value&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;#{cc.attrs.loginButtonLabel}&amp;quot;&lt;/span&gt;&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/h:commandButton&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &lt;span class="sc2"&gt;&amp;lt;h:commandButton &lt;span
class="kw3"&gt;id&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;cancelEvent&amp;quot;&lt;/span&gt;
&lt;span class="kw3"&gt;value&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;Cancel&amp;quot;&lt;/span&gt;
&lt;span class="kw3"&gt;action&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;cancel&amp;quot;&lt;/span&gt;&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/h:commandButton&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &lt;span class="sc2"&gt;&amp;lt;special:validateUserButton
&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; validateUser=&lt;span class="st0"&gt;&amp;quot;#{cc.attrs.specialMethodExpression}&amp;quot;&lt;/span&gt;
/&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span
class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/ui:define&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;ui:define &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;footer&amp;quot;&lt;/span&gt;&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span
class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/span&gt;This
is the login panel footer&lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span
class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/ui:define&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/ui:decorate&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:implementation&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The values for attributes in a composite component PDL file can
be
fully localized by putting them inside a ResourceBundle in the same
directory as the PDL page and accessing them with the per-component
resource bundle syntax. Consider the file &lt;code&gt;foo.xhtml&lt;/code&gt;,
in
the resource library &lt;code&gt;ezcomp&lt;/code&gt;. The
&lt;code&gt;shortDescription&lt;/code&gt; element could be changed to
be:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;composite:interface
shortDescription="#{cc.resourceBundleMap.shortDescription}" &amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case, In the same &lt;code&gt;ezcomp&lt;/code&gt;
directory as
&lt;code&gt;foo.xhtml&lt;/code&gt;, there would be a &lt;code&gt;foo.properties&lt;/code&gt;
file that would contain this entry:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
shortDescription=A really nifty login panel.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The normal localization rules for &lt;code&gt;ResourceBundle&lt;/code&gt;
would
apply.&lt;/p&gt;
&lt;/div&gt;
&lt;pre&gt;
</description>
<namespace>http://java.sun.com/jsf/composite</namespace>
<tag>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;This element declares the usage contract for a composite
component. Optionally, and at the component author's
discretion, this contract exposes the features of one or
more inner components to the page author. The page author
can work with the composite component as a single component
whose feature set is the union of the features declared in
the usage contract.&lt;/p&gt;
&lt;p&gt;For example, consider a composite component that
implements the functionality of a "login panel". Such a
component would likely have two text fields and one button.
The user of such a component might like to do one or more of
the following.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Be able to listen for the &lt;code&gt;ActionEvent&lt;/code&gt;
on the button.&lt;/p&gt;
&lt;p&gt;In this case, a
&lt;code&gt;&amp;lt;composite:actionSource&amp;gt;&lt;/code&gt;
element is
included in the usage contract that refers to the inner
button in the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide an "action" to invoke when the button is
pressed.
&lt;/p&gt;
&lt;p&gt;In this case, a
&lt;code&gt;&amp;lt;composite:attribute&amp;gt;&lt;/code&gt; element
is included
in the usage contract that refers to the inner button in the
&lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section and
declares the proper method signature for an "action".&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide parameters to the composite component for
labels and other rendering specific aspects of the composite
component.&lt;/p&gt;
&lt;p&gt;In this case, one or more
&lt;code&gt;&amp;lt;composite:attribute&amp;gt;&lt;/code&gt;
elements are included
in the usage contract and those parameters are referred to in
the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section
using EL expressions like
&lt;code&gt;#{cc.attrs.usernameLabel}&lt;/code&gt;,
assuming &lt;code&gt;usernameLabel&lt;/code&gt; is the &lt;code&gt;name&lt;/code&gt;
of one of the &lt;code&gt;&amp;lt;composite:attribute&amp;gt;&lt;/code&gt;
elements in the usage contract.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add &lt;code&gt;ValueChangeListener&lt;/code&gt;s,
&lt;code&gt;Converter&lt;/code&gt;s, or &lt;code&gt;Validator&lt;/code&gt;s
to either
or both text fields.
&lt;/p&gt;
&lt;p&gt;In this case, a
&lt;code&gt;&amp;lt;composite:editableValueHolder&amp;gt;&lt;/code&gt;
element is
included in the usage contract that refers to the inner text
field in the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section. In the case of wanting to enable only adding a
&lt;code&gt;Converter&lt;/code&gt; (and not a
&lt;code&gt;ValueChangeListener&lt;/code&gt; or &lt;code&gt;Validator&lt;/code&gt;,
a
&lt;code&gt;&amp;lt;composite:valueHolder&amp;gt;&lt;/code&gt;
element would be
used.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add facet children to the login panel.&lt;/p&gt;
&lt;p&gt;In this case, a &lt;code&gt;&amp;lt;composite:facet&amp;gt;&lt;/code&gt;
element is included in the usage contract that refers to the
inner &lt;code&gt;&amp;lt;composite:renderFacet&amp;gt;&lt;/code&gt;
element in
the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section.
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For each of the behaviorial interfaces in Section JSF.3.2
of
the specification, there is a tag in the
&lt;code&gt;composite:&lt;/code&gt; library to nest inside of the
&lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt;
section.
&lt;/p&gt;
&lt;p&gt;If the &lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt;
section
is not present in a &lt;em&gt;PDL page&lt;/em&gt;, the contract will
be
inferred as described in the specification. There must be
zero or one of these elements in a composite component PDL
file. If a &lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt;
element
does appear, there must be an accompanying
&lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
element in the
same PDL file. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nesting of composite components&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The implementation must support nesting of composite
components. Specifically, it must be possible for the
&lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section of a
composite component to act as the &lt;em&gt;using page&lt;/em&gt;
for
another composite component. When a composite component
exposes a behavioral interface to the &lt;em&gt;using page&lt;/em&gt;,
such as a &lt;code&gt;&amp;lt;composite:actionSource&amp;gt;&lt;/code&gt;,
&lt;code&gt;&amp;lt;composite:editableValueHolder&amp;gt;&lt;/code&gt;,
&lt;code&gt;&amp;lt;composite:valueHolder&amp;gt;&lt;/code&gt; or
other
behavioral interface, it must be possible to
&amp;#8220;propogate&amp;#8221; the exposure of such an interface in
the case of a nested composite component. The composite
component author must ensure that the value of the
&lt;code&gt;name&lt;/code&gt; attributes exactly match at all levels
of
the nesting to enable this exposure to work. The
implementation is not required to support
&amp;#8220;re-mapping&amp;#8221; of names in a nested composite
component.&lt;/p&gt;
&lt;p&gt;For example, consider this nested composite component.&lt;/p&gt;
&lt;p&gt;Using page&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;div class="html4strict"
style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;ez:actionSourceOuter&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;f:actionListener &lt;span class="kw3"&gt;for&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;button1&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/ez:actionSourceOuter&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;actionSourceOuter.xhtml: Outer composite component&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;div class="html4strict"
style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;button1&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:implementation&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;ez:actionSourceInner /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:implementation&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;actionSourceInner.xhtml: the composite component used
within a
composite component.&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;div class="html4strict"
style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;button1&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:implementation&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;h:commandButton &lt;span class="kw3"&gt;id&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;button1&amp;quot;&lt;/span&gt; &lt;span
class="kw3"&gt;value&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;the
real button&amp;quot;&lt;/span&gt; /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:implementation&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;id&lt;/code&gt; of the &lt;code&gt;&amp;lt;h:commandButton&amp;gt;&lt;/code&gt;
on
line 6 of actionSourceInner.xhtml must match the &lt;code&gt;name&lt;/code&gt;
on
line 2 of that file (this is a standard requirement for all
composite
components, nested or not). That &lt;code&gt;id&lt;/code&gt; must
also match the
&lt;code&gt;name&lt;/code&gt; on line 2 of actionSourceOuter.xhtml,
and the
&lt;code&gt;for&lt;/code&gt; on line 2 of the using page.&lt;/p&gt;
&lt;p&gt;The implementation must support any level of nesting as
long as the
&lt;code&gt;for&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, and
&lt;code&gt;id&lt;/code&gt; values match
up. Furthermore, the &lt;code&gt;targets&lt;/code&gt; attribute is
also valid for
use in this nested fashion.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Naming containers within composite components&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Composite components are themselves naming containers so
that any
possible id conflicts between inner components and components in the
using page are avoided. However, special care must be taken when
using
naming containers in the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section. In such cases the value of the &amp;#8220;name&amp;#8221;
attribute,
or the values of the &amp;#8220;targets&amp;#8221; attribute must be
used with a
clientId relative to the &lt;em&gt;top level component&lt;/em&gt; to
expose any
attached object targets to the using page. For example:&lt;/p&gt;
&lt;p&gt;Using page&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;div class="html4strict"
style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;ez:loginButton&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;f:actionListener &lt;span class="kw3"&gt;for&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span
class="kw3"&gt;binding&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;#{foo.actionListener}&amp;quot;&lt;/span&gt;
/&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/ez:loginButton&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;loginButton.xhtml&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;div class="html4strict"
style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; targets=&lt;span
class="st0"&gt;&amp;quot;form:button&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:implementation&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;h:form &lt;span class="kw3"&gt;id&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;form&amp;quot;&lt;/span&gt;&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
&lt;span class="sc2"&gt;&amp;lt;h:commandButton &lt;span class="kw3"&gt;id&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span
class="kw3"&gt;value&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;Submit&amp;quot;&lt;/span&gt;
/&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/h:form&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:implementation&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Because the button on line 8 resides within a form, it must
be
referred to using a client id, relative to the &lt;em&gt;top level
component&lt;/em&gt;, in the "targets" attribute on line 2. Using a
relative
clientId is required due to the semantics of
&lt;code&gt;UIComponent.findComponent()&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
</description>
<tag-name>interface</tag-name>
<handler-class>com.sun.faces.facelets.tag.composite.InterfaceHandler</handler-class>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;The name of this composite component.
Advisory only. The real name is taken from the
filename. The value of this attribute will be set as
the value for this property on the &lt;em&gt;composite
component bean descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>name</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;The &lt;code&gt;component-type&lt;/code&gt; of the &lt;code&gt;UIComponent&lt;/code&gt;
that
will serve as the &lt;em&gt;composite component root&lt;/em&gt;
for this composite
component. The declared &lt;code&gt;component-family&lt;/code&gt;
for this
component must be &lt;code&gt;javax.faces.NamingContainer&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>componentType</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;The name to display in a tool palette
containing this component. The value of this attribute will be
set as
the value for this property on the &lt;em&gt;composite
component bean descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>displayName</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Is this a "preferred" component. The value
of this attribute will be set as the value for this
property on the &lt;em&gt;composite component bean
descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>preferred</name>
<required>false</required>
<type>boolean</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Is this component only for expert users?
The value of this attribute will be set as the value for
this property on the &lt;em&gt;composite component bean
descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>expert</name>
<required>false</required>
<type>boolean</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;A short description of the purpose of this
component. The value of this attribute will be set as
the value for this property on the &lt;em&gt;composite
component bean descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>shortDescription</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
</tag>
<tag>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Defines the implementation of the composite
component. There must be zero or one of these in a
composite component markup file. If a
&lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt; element
appears,
there must be a corresponding
&lt;code&gt;&amp;lt;composite-implementation&amp;gt;&lt;/code&gt;
element. If no
&lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt; element
appears,
the &lt;code&gt;&amp;lt;composite-implementation&amp;gt;&lt;/code&gt;
element is
optional. &lt;/p&gt; &lt;/div&gt;
</description>
<tag-name>implementation</tag-name>
<handler-class>com.sun.faces.facelets.tag.composite.ImplementationHandler</handler-class>
</tag>
<tag>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Declares an attribute that may be given to an instance of
the
&lt;em&gt;composite component&lt;/em&gt; tag for this composite
component. There
may be zero or many of these inside of the
&lt;code&gt;&amp;lt;composite:interface&lt;/code&gt;&amp;gt;
section. This element may be
nested within other &lt;code&gt;&amp;lt;composite:attribute&amp;gt;&lt;/code&gt;
elements to
convey a usage contract that includes nested properties.&lt;/p&gt;
&lt;p&gt;Please see &lt;a href="tld-summary.html#composite_example"&gt;summary
page&lt;/a&gt; for a usage example.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;top level component&lt;/em&gt; in which this
element is
ultimately nested must be a &lt;code&gt;NamingContainer&lt;/code&gt;.
There are certain component properties that must not be
exposed using this element. The motivation for this
restriction is that the mapping of markup attributes to
component properties/attributes does not allow for these
attributes to be set. The following properties must not be
exposed using this element.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;binding&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;inView&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;parent&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rendered&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rendererType&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;transient&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</description>
<tag-name>attribute</tag-name>
<handler-class>com.sun.faces.facelets.tag.composite.AttributeHandler</handler-class>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;The name of the attribute as it must appear on the &lt;em&gt;composite
component tag&lt;/em&gt; in the &lt;em&gt;using page&lt;/em&gt;.
If the value of the
&lt;em&gt;name&lt;/em&gt; attribute is equal to (without the
quotes)
&amp;#8220;action&amp;#8221;, &amp;#8221;actionListener&amp;#8221;,
&amp;#8220;validator&amp;#8221;, or &amp;#8220;valueChangeListener&amp;#8221;,
the
action described in &lt;a target="_"
href="../../../javadocs/javax/faces/application/ViewHandler.html#retargetMethodExpressions(javax.faces.context.FacesContext,%20javax.faces.component.UIComponent)"&gt;ViewHandler.retargetMethodExpressions()&lt;/a&gt;
must be taken to handle the attribute. In these cases, the
&lt;code&gt;method-signature&lt;/code&gt; attribute, if present,
must be ignored as
its value is derived as described in
&lt;code&gt;retargetMethodExpressions()&lt;/code&gt;.&lt;/div&gt;
</description>
<name>name</name>
<required>true</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;If this element has a &lt;code&gt;method-signature&lt;/code&gt;
attribute, the
value of the &lt;code&gt;targets&lt;/code&gt; attribute must be
interpreted as a
space (not tab) separated list of client ids (relative to the
&lt;em&gt;top
level component&lt;/em&gt;) of components within the
&lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section. Space is used as
the delimiter for compatibility with the IDREFS and NMTOKENS
data types
from the XML Schema. Each entry in the list must be interpreted
as the
id of an inner component to which the &lt;code&gt;MethodExpression&lt;/code&gt;
from
the &lt;em&gt;composite component tag&lt;/em&gt; in the &lt;em&gt;using
page&lt;/em&gt; must be
applied. If this element has a &lt;code&gt;method-signature&lt;/code&gt;
attribute,
but no &lt;code&gt;targets&lt;/code&gt; attribute, the value of
the
&lt;code&gt;name&lt;/code&gt; attribute is used as the single
entry in the list. If
the value of the &lt;code&gt;name&lt;/code&gt; attribute is &lt;strong&gt;not&lt;/strong&gt;
one
of the special values listed in the description of the &lt;code&gt;name
attribute&lt;/code&gt;, &lt;code&gt;targets&lt;/code&gt; (or its
derived value) need not
correspond to the id of an inner component.&lt;/p&gt;
&lt;/div&gt;
</description>
<name>targets</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;If this attribute is not required, and a
value is not supplied by the page author, use this as
the default value.&lt;/p&gt;&lt;/div&gt;
</description>
<name>default</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;The name to display in a tool palette
containing this component. The value of this attribute will be
set as
the value for this property on the &lt;em&gt;composite
component bean descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>displayName</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;True if the page author must supply a value
for this attribute.&lt;/p&gt;&lt;/div&gt;
</description>
<name>required</name>
<required>false</required>
<type>boolean</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Is this a "preferred" component. The value
of this attribute will be set as the value for this
property on the &lt;em&gt;composite component bean
descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>preferred</name>
<required>false</required>
<type>boolean</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Is this component only for expert users?
The value of this attribute will be set as the value for
this property on the &lt;em&gt;composite component bean
descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>expert</name>
<required>false</required>
<type>boolean</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;A short description of the purpose of this
component. The value of this attribute will be set as
the value for this property on the &lt;em&gt;composite
component bean descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>shortDescription</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Declares that this attribute must be a &lt;code&gt;MethodExpression&lt;/code&gt;
whose method signature is described by the value of this
attribute. The
signature must be described using fully qualified class names
wherever a
type is required. This attribute is mutually exclusive with the
"type"
attribute. If both attributes are present, the
"method-signature"
attribute is ignored.&lt;/p&gt;
&lt;p&gt;PENDING: when this file is generated from the
web-facesuicomponent_2_0.xsd, we will not need to copy the
content here
manually.&lt;/p&gt;
&lt;p&gt;Provides the signature of the Java method. The syntax
of
the method-signature element is as follows (taken from
function-signature in web-jsptaglibrary_2_1.xsd):&lt;/p&gt;
&lt;p&gt;MethodSignature ::= ReturnType S MethodName S?
'(' S? Parameters? S? ')'&lt;/p&gt;
&lt;p&gt;ReturnType ::= Type&lt;/p&gt;
&lt;p&gt;MethodName ::= Identifier&lt;/p&gt;
&lt;p&gt;Parameters ::= Parameter
| ( Parameter S? ',' S? Parameters )&lt;/p&gt;
&lt;p&gt;Parameter ::= Type&lt;/p&gt;
&lt;p&gt;Where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Type is a basic type or a fully qualified
Java class name (including package name),
as per the 'Type' production in the Java
Language Specification, Second Edition,
Chapter 18.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Identifier is a Java identifier, as per
the 'Identifier' production in the Java
Language Specification, Second
Edition, Chapter 18.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;java.lang.String nickName(
java.lang.String, int )&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
</description>
<name>method-signature</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Declares that this attribute must be a &lt;code&gt;ValueExpression&lt;/code&gt;
whose expected type is given by the value of this attribute. If
not
specified, and no "method-signature" attribute is present,
&lt;code&gt;java.lang.Object&lt;/code&gt; is assumed. This
attribute is mutually
exclusive with the "type" attribute. If both attributes are
present, the
"method-signature" attribute is ignored. &lt;/p&gt; &lt;/div&gt;
</description>
<name>type</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
</tag>
<tag>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Declares that this composite component supports a facet
with the
name given by the value of the "name" attribute. &lt;/p&gt;
&lt;p&gt;Please see &lt;code&gt;&amp;lt;&lt;a
href="interface.html"&gt;composite:interface&lt;/a&gt;&amp;gt;&lt;/code&gt;
for a usage
example.&lt;/p&gt;
&lt;/div&gt;
</description>
<tag-name>facet</tag-name>
<handler-class>com.sun.faces.facelets.tag.composite.DeclareFacetHandler</handler-class>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;The name of the attribute as it must appear
on the &lt;em&gt;composite component tag&lt;/em&gt; in the
&lt;em&gt;using page&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>name</name>
<required>true</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;The name to display in a tool palette
containing this component. The value of this attribute will be
set as
the value for this property on the &lt;em&gt;composite
component bean descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>displayName</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;True if the page author must supply a facet with this
name.&lt;/p&gt;&lt;/div&gt;
</description>
<name>required</name>
<required>false</required>
<type>boolean</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Is this a "preferred" facet. The value
of this attribute will be set as the value for this
property on the &lt;em&gt;composite component bean
descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>preferred</name>
<required>false</required>
<type>boolean</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Is this facet only for expert users?
The value of this attribute will be set as the value for
this property on the &lt;em&gt;composite component bean
descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>expert</name>
<required>false</required>
<type>boolean</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;A short description of the purpose of this
facet. The value of this attribute will be set as
the value for this property on the &lt;em&gt;composite
component bean descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>shortDescription</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
</tag>
<tag>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;This element is used in the
&lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section. The facet with
the name equal to the value of the name attribute, given by the page
author in the using page, will be rendered at this point in the
composite component PDL page. &lt;/p&gt;
&lt;p&gt;The implementation of this tag handler must insert a
component with &lt;code&gt;component-type&lt;/code&gt;
&lt;code&gt;javax.faces.Output&lt;/code&gt; and &lt;code&gt;renderer-type&lt;/code&gt;
&lt;code&gt;javax.faces.CompositeFacet&lt;/code&gt; as a
child at this point in the component tree.&lt;/p&gt;
&lt;p&gt;The implementation of this tag handler must store an
attribute into
the created component's attribute map under the key given by the
value
of the symbolic constant &lt;code&gt;UIComponent.FACETS_KEY&lt;/code&gt;.
The value
for this key must be the evaluated value of the "name" attribute.&lt;/p&gt;
&lt;/div&gt;
</description>
<tag-name>renderFacet</tag-name>
<handler-class>com.sun.faces.facelets.tag.composite.RenderFacetHandler</handler-class>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;The value of the name attribute as it must appear on an
&lt;code&gt;&amp;lt;f:facet&amp;gt;&lt;/code&gt; tag nested
within the &lt;em&gt;composite
component tag&lt;/em&gt; in the &lt;em&gt;using page&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
<name>name</name>
<required>true</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;If &lt;code&gt;true&lt;/code&gt;, and there is no such
facet present on the top
level component, a &lt;code&gt;TagException&lt;/code&gt; must be
thrown, containing
the &lt;code&gt;Location&lt;/code&gt;, the facet name, and a
localized descriptive
error message.&lt;/p&gt;
&lt;/div&gt;
</description>
<name>required</name>
<required>false</required>
<type>boolean</type>
</attribute>
</tag>
<tag>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;This element is used in the
&lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section. Any child
components or template text within the composite component tag in
the
using page will be re-parented into the composite component at the
point
indicated by this tag's placement within the
&lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section. The normal
use-case for this element is to have only one occurrence within the
&lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section. Inserting
multiple occurrences may cause duplicate id errors. The results are
undefined if there are multiple occurrences of this element in the
&lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section.&lt;/p&gt;
&lt;/div&gt;
</description>
<tag-name>insertChildren</tag-name>
<handler-class>com.sun.faces.facelets.tag.composite.InsertChildrenHandler</handler-class>
</tag>
<tag>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Declares that the composite component whose
contract is declared by the
&lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt; in
which this
element is nested exposes an implementation of
&lt;code&gt;ValueHolder&lt;/code&gt; suitable for use as the target
of
&lt;em&gt;attached objects&lt;/em&gt; in &lt;em&gt;the using page&lt;/em&gt;.
Any attached objects suitable for implementations of
&lt;code&gt;ValueHolder&lt;/code&gt; may be attached to the
composite
component. Consider this excerpt from &lt;em&gt;the using
page&lt;/em&gt;:
&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;div class="html4strict"
style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;ez:foo&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;f:converter &lt;span class="kw3"&gt;for&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;userid&amp;quot;&lt;/span&gt; binding=&lt;span
class="st0"&gt;&amp;quot;#{bean.converter}&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/ez:foo&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Line 2 refers to the
&lt;code&gt;&amp;lt;composite:valueHolder&amp;gt;&lt;/code&gt;
declaration on
line 2 of &lt;code&gt;foo.xhtml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;div class="html4strict"
style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:valueHolder &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;userid&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:implementation&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;h:inputText &lt;span class="kw3"&gt;id&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;userid&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:implementation&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;It is possible to declare that a single
&lt;code&gt;&amp;lt;composite:valueHolder&amp;gt;&lt;/code&gt;
element should cause multiple
components within the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section to be the targets of an &lt;em&gt;attached object&lt;/em&gt;
in the
using page. Assuming the same &lt;em&gt;using page&lt;/em&gt;
excerpt as
above, the revised &lt;em&gt;PDL page&lt;/em&gt; is:&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;div class="html4strict"
style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:valueHolder targets=&lt;span
class="st0"&gt;&amp;quot;userid,password&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:implementation&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;h:inputText &lt;span class="kw3"&gt;id&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;userid&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;h:inputText &lt;span class="kw3"&gt;id&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;password&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:implementation&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;In this case, the "targets" attribute on the
&lt;code&gt;&amp;lt;composite:valueHolder&amp;gt;&lt;/code&gt;
element, on line 2 above,
replaces the "name" attribute in the previous example. "targets" is
a
list of ids of client ids (relative to the &lt;em&gt;top level
component&lt;/em&gt;)
within the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section. In
this case, "targets" refers to the &lt;code&gt;&amp;lt;h:inputText&amp;gt;&lt;/code&gt;
components on lines 6 and 7 above.&lt;/p&gt;
&lt;p&gt;Please see &lt;code&gt;&amp;lt;&lt;a
href="interface.html"&gt;composite:interface&lt;/a&gt;&amp;gt;&lt;/code&gt;
for a usage
example.&lt;/p&gt;
&lt;/div&gt;
</description>
<tag-name>valueHolder</tag-name>
<handler-class>com.sun.faces.facelets.tag.composite.ValueHolderAttachedObjectTargetHandler</handler-class>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;
The value of this attribute maps back to the "for" attribute on
an attachable object
nested within a composite component. If the "targets" attribute
is not specified,
this value also represents the component ID of the target
component within the
that the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
ActionListener should be mapped to.
&lt;/p&gt;
&lt;/div&gt;
</description>
<name>name</name>
<required>true</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;If present, this must be a space (not tab) separated
list of client
ids (relative to the &lt;em&gt;top level component&lt;/em&gt;)
of components within
the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section. Space is
used as the delimiter for compatibility with the IDREFS and
NMTOKENS
data types from the XML Schema. &lt;/p&gt;&lt;/div&gt;
</description>
<name>targets</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
</tag>
<tag>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Declares that the composite component whose
contract is declared by the
&lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt; in
which this
element is nested exposes an implementation of
&lt;code&gt;EditableValueHolder&lt;/code&gt; suitable for use as the
target of &lt;em&gt;attached objects&lt;/em&gt; in &lt;em&gt;the
using
page&lt;/em&gt;. Any attached objects suitable for
implementations of &lt;code&gt;EditableValueHolder&lt;/code&gt; may
be
attached to the composite component.The example from &lt;a
href="valueHolder.html"&gt;&lt;code&gt;&amp;lt;composite:valueHolder&amp;gt;&lt;/code&gt;&lt;/a&gt;
still applies.
&lt;/p&gt;
&lt;p&gt;Please see &lt;code&gt;&amp;lt;&lt;a
href="interface.html"&gt;composite:interface&lt;/a&gt;&amp;gt;&lt;/code&gt;
for a usage
example.&lt;/p&gt;
&lt;/div&gt;
</description>
<tag-name>editableValueHolder</tag-name>
<handler-class>com.sun.faces.facelets.tag.composite.EditableValueHolderAttachedObjectTargetHandler</handler-class>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;
The value of this attribute maps back to the "for" attribute on
an attachable object
nested within a composite component. If the "targets" attribute
is not specified,
this value also represents the component ID of the target
component within the
that the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
ActionListener should be mapped to.
&lt;/p&gt;
&lt;/div&gt;
</description>
<name>name</name>
<required>true</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;If present, this must be a space (not tab) separated
list of client
ids (relative to the &lt;em&gt;top level component&lt;/em&gt;)
of components within
the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section. Space is
used as the delimiter for compatibility with the IDREFS and
NMTOKENS
data types from the XML Schema.&lt;/p&gt;&lt;/div&gt;
</description>
<name>targets</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
</tag>
<tag>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Declares that the composite component whose
contract is declared by the
&lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt; in
which this
element is nested exposes an implementation of
&lt;code&gt;ActionSource2&lt;/code&gt; suitable for use as the
target of
&lt;em&gt;attached objects&lt;/em&gt; in &lt;em&gt;the using page&lt;/em&gt;.
Any attached objects suitable for implementations of
&lt;code&gt;ActionSource2&lt;/code&gt; may be attached to the
composite
component. Consider this excerpt from &lt;em&gt;the using
page&lt;/em&gt;:
&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;div class="html4strict"
style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;ez:loginPanel &lt;span
class="kw3"&gt;id&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;loginPanel&amp;quot;&lt;/span&gt;
model=&lt;span class="st0"&gt;&amp;quot;#{bean}&amp;quot;&lt;/span&gt;&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;f:valueChangeListener &lt;span class="kw3"&gt;for&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; binding=&lt;span class="st0"&gt;&amp;quot;#{bean.useridValueChangeListener}&amp;quot;&lt;/span&gt;
/&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;f:actionListener &lt;span class="kw3"&gt;for&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;loginEvent&amp;quot;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; binding=&lt;span class="st0"&gt;&amp;quot;#{bean.loginEventListener}&amp;quot;&lt;/span&gt;
/&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;f:actionListener &lt;span class="kw3"&gt;for&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;cancelEvent&amp;quot;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; binding=&lt;span class="st0"&gt;&amp;quot;#{bean.cancelEventListener}&amp;quot;&lt;/span&gt;
/&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;f:actionListener &lt;span class="kw3"&gt;for&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;allEvents&amp;quot;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; binding=&lt;span class="st0"&gt;&amp;quot;#{bean.allEventsListener}&amp;quot;&lt;/span&gt;
/&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/ez:loginPanel&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;&amp;lt;f:actionListener&amp;gt;&lt;/code&gt;
elements on lines 4, 7, and 10
refer to the &lt;em&gt;attached objects&lt;/em&gt; declared on lines
2, 3 and 4 below.&lt;/p&gt;
&lt;div class="syntax"&gt;&lt;div class="html4strict"
style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:interface
&lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;loginPanel&amp;quot;&lt;/span&gt;&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;loginEvent&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;cancelEvent&amp;quot;&lt;/span&gt; /&lt;span
class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
class="st0"&gt;&amp;quot;allEvents&amp;quot;&lt;/span&gt; targets=&lt;span
class="st0"&gt;&amp;quot;loginEvent,cancelEvent&amp;quot;&lt;/span&gt;
/&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:interface&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Most of the concepts from example content from &lt;a
href="valueHolder.html"&gt;&lt;code&gt;&amp;lt;composite:valueHolder&amp;gt;&lt;/code&gt;&lt;/a&gt;
also applies in the case of
&lt;code&gt;&amp;lt;composite:actionSource&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Please see &lt;code&gt;&amp;lt;&lt;a
href="interface.html"&gt;composite:interface&lt;/a&gt;&amp;gt;&lt;/code&gt;
for a usage
example.&lt;/p&gt;
&lt;/div&gt;
</description>
<tag-name>actionSource</tag-name>
<handler-class>com.sun.faces.facelets.tag.composite.ActionSource2AttachedObjectTargetHandler</handler-class>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;
The value of this attribute maps back to the "for" attribute on
an attachable object
nested within a composite component. If the "targets" attribute
is not specified,
this value also represents the component ID of the target
component within the
that the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
ActionListener should be mapped to.
&lt;/p&gt;
&lt;/div&gt;
</description>
<name>name</name>
<required>true</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;If present, this must be a space (not tab) separated
list of client
ids (relative to the &lt;em&gt;top level component&lt;/em&gt;)
of components within
the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section. Space is
used as the delimiter for compatibility with the IDREFS and
NMTOKENS
data types from the XML Schema.&lt;/p&gt;&lt;/div&gt;
</description>
<name>targets</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
</tag>
<tag>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;Used within a &lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt;
section,
within any sub-element of that section, to include XML content not
defined by this specification. This element can be used to
incorporate
&lt;a target="_" href="http://jcp.org/en/jsr/detail?id=276"&gt;JSR-276&lt;/a&gt;
metadata into a composite component.&lt;/p&gt;
&lt;/div&gt;
</description>
<tag-name>extension</tag-name>
<handler-class>com.sun.faces.facelets.tag.composite.ExtensionHandler</handler-class>
</tag>
<tag>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;The presence of this tag in a
&lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
section must cause the
named facet to be taken from the facet map of the &lt;em&gt;top
level
component&lt;/em&gt; and inserted as a facet child of the component
in which
this element is nested.&lt;/p&gt;
&lt;/div&gt;
</description>
<tag-name>insertFacet</tag-name>
<handler-class>com.sun.faces.facelets.tag.composite.InsertFacetHandler</handler-class>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;The name of the facet child on the &lt;em&gt;top level
component&lt;/em&gt; which
must be inserted as a facet child of the component in which this
element
is nested.&lt;/p&gt;
&lt;/div&gt;
</description>
<name>name</name>
<required>true</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>
&lt;div class="changed_added_2_0"&gt;
&lt;p&gt;If &lt;code&gt;true&lt;/code&gt;, and there is no such
facet present on the top
level component, a &lt;code&gt;TagException&lt;/code&gt; must be
thrown, containing
the &lt;code&gt;Location&lt;/code&gt;, the facet name, and a
localized descriptive
error message.&lt;/p&gt;
&lt;/div&gt;
</description>
<name>required</name>
<required>false</required>
<type>boolean</type>
</attribute>
</tag>
</facelet-taglib>