Наследование составных компонентов невозможно. Чтобы избежать дублирования кода, мы украсили реализацию составного компонента JSF2.
Материал, общий для всех полей ввода нашего приложения, представлен в шаблоне декоратора следующим образом:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:cc="http://java.sun.com/jsf/composite"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:cu="http://mytags.de/jsftags">
<!-- provides a common set of layout information for inputfields -->
<ui:param name ="fieldStyle" value="#{propertiesController.get('FIELD_STYLE', cc.attrs.name)}" />
<h:panelGroup id="basicInputField" styleClass="basicInputField" layout="block" style="width: #{cc.attrs.width}; height: #{cc.attrs.height};">
<ui:insert name="component">
no component given...
</ui:insert>
</h:panelGroup>
</ui:composition>
И составной компонент использует шаблон, чтобы украсить себя:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:cc="http://java.sun.com/jsf/composite"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:cu="http://mytags.de/jsftags">
<cc:interface>
<cc:attribute name="name" required="true" />
<cc:attribute name="width" required="false" default="auto" />
<cc:attribute name="height" required="false" default="auto" />
<cc:attribute name="inset" required="false" default="0px" />
</cc:interface>
<cc:implementation>
<ui:decorate template="basicInputField.xhtml">
<ui:define name="component">
<h:inputText id="inputText" style="#{fieldStyle} width: 100%;" value="#{levelContent.test}" />
</ui:define>
</ui:decorate>
</cc:implementation>
</html>
Таким образом, нам нужно только изменить шаблон декоратора, когда меняется способ извлечения свойств поля (то есть только для чтения, требуется, стиль, ...)