> Besides defining these in XML, you can do this sort of thing mixing in HTML > templating. > > Common XML Config: > > <component jsfid="widgetsLabel" extends="baseLabel"> > <attributes> > <set name="value" value="@label" /> > <set name="for" value="@property" /> > </attributes> > </component> > <component jsfid="widgetsText" extends="inputText" id="@property"> > <attributes> > <set name="value" value="[EMAIL PROTECTED]@property}"/> > <set name="size" value="@size" /> > <set name="maxlength" value="@maxlength" /> > <set name="required" value="@required" /> > <set name="immediate" value="@immediate"/> > </attributes> > </component> > <component jsfid="widgetsMessage" extends="baseMessage" > > <attributes> > <set name="for" value="@property" /> > </attributes> > </component> > > HTML template "/widgets.html": > <tr> > <td><label jsfid="widgetsLabel">Mock Label:</label></td> > <td><input jsfid="widgetsText" type="text"/></td> > <td><span jsfid="widgetsMessage">Mock Message</span><td> > </tr> > > Outer HTML template include: > <table> > <tr> > <td colspan="3"> > <p>This example show how a pattern of components, label, input > text and message can be abstracted into a common template. </p> > </td> > </tr> > <tr jsfid="clay" clayJsfid="/widgets.html" label="First Name:" > property="firstName" size="20" maxlength="30" > required="true" immediate="false"/> > <tr jsfid="clay" clayJsfid="/widgets.html" label="Middle Name:" > property="middleName" size="20" maxlength="30" > required="false" immediate="false"/> > <tr jsfid="clay" clayJsfid="/widgets.html" label="Last Name:" > property="lastName" size="30" maxlength="40" > required="true" immediate="false"/> > <tr jsfid="clay" clayJsfid="/widgets.html" label="Business Name:" > property="lastName" size="40" maxlength="50" > required="true" immediate="false"/> > > </table> >
That's really cool, Gary. How would I package widgets.html in a jar so that it can be referenced in the application like you did in your example?