Вы можете использовать ограниченное количество шаблонов, используя (например) jsp: include и f: subview .
Кроме того, вы можете расширить UIComponent , переопределяя выбранные методы, а затем предоставить его через существующий тег и управляемый компонент с помощью атрибута binding
. Это все еще требует достаточно подробного понимания разработки компонентов (и последствий этого выбора), но может значительно сократить количество файлов / объем кода.
Этот подход немного хакерский, но он может подойти для краткосрочных вещей. Вы не будете делать это для библиотек компонентов, которые вы хотите распространять, или для компонентов, требующих длительного обслуживания.
Новый компонент:
public class QuickComponent extends HtmlOutputText {
@Override public void encodeAll(FacesContext context) throws IOException {
ResponseWriter writer = context.getResponseWriter();
writer.writeText("I'm not really a HtmlOutputText", null);
for (UIComponent kid : getChildren()) {
if (kid instanceof UIParameter) {
UIParameter param = (UIParameter) kid;
writer.startElement("br", this);
writer.endElement("br");
writer.writeText(param.getName() + "=" + param.getValue(), null);
}
}
}
}
Бин, предоставляющий экземпляр:
/**Request-scope managed bean defined in faces-config.xml*/
public class QuickComponentProviderBean {
private QuickComponent quick;
public void setQuick(QuickComponent quick) {
this.quick = quick;
}
public QuickComponent getQuick() {
if (quick == null) {
quick = new QuickComponent();
}
return quick;
}
}
Примечание: не используйте повторно одно свойство bean-компонента для нескольких тегов в ваших представлениях, иначе они будут ссылаться на один и тот же экземпляр объекта.
Добавление нового компонента в представление:
<h:outputText binding="#{quickComponentProviderBean.quick}">
<f:param name="Hello" value="World" />
</h:outputText>
Примечание: атрибуты, которые можно определить, не изменились. Они исправлены TLD.