Я использую Mojarra 2.1. Чтение this ответ о том, когда использовать пользовательские теги и составные компоненты, я столкнулся с вопросом о внутренних компонентах компонентов.Как создается экземпляр составного компонента и как его получить
Итак, самые важное различие между пользовательскими тегами и составными компонентами является то, что каждый составным компонент имеет один UIComponent
экземпляр, представляющий его в дереве компонентов после просмотра времени сборки «s Finshed. Пользовательский тег, в свою очередь, не имеет одного экземпляра UIComponent
, представляющего его в дереве.
Итак, что это за класс, представляющий составной компонент в дереве? Как это создается? Это какой-то анонимный класс? Давайте рассмотрим пример из wiki -page:
<ui:component
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:cc="http://java.sun.com/jsf/composite"
>
<cc:interface>
<!-- Define component attributes here -->
</cc:interface>
<cc:implementation>
<!-- Define component body here -->
</cc:implementation>
</ui:component>
Как я могу получить экземпляр UIComponent
, представляющий, что составной компонент?
копания в исходный код UIComponent
я нашел следующий метод:
public static boolean isCompositeComponent(UIComponent component) {
if (component == null) {
throw new NullPointerException();
}
boolean result = false;
if (null != component.isCompositeComponent) {
result = component.isCompositeComponent.booleanValue();
} else {
result = component.isCompositeComponent =
(component.getAttributes().containsKey(
Resource.COMPONENT_RESOURCE_KEY));
}
return result;
}
я подозреваю, что это детали реализации, как создается композиционно-компонент класса. Фактически, я хотел бы найти, где реализация Mojarra генерирует экземпляр составного компонента.
UPD: определение составного составного компонента заменено на то, которое явно не определяет атрибут componentType
.
Понял, спасибо. В Mojarra 2.1 источники почти одинаковы. Но еще один вопрос: facetComponent - это локальная переменная, поэтому я предполагаю, что компонент выполняется с помощью 'ctx.includeFacelet (facetComponent, ccResource.getURL());' invocation. Но javadocs для этого метода не совсем понятны: _ Включите еще одну Facelet, определенную на каком-то пути, абсолютную для этого ClassLoader/OS_. Не могли бы вы прояснить, что это означает простыми словами? –
' ' внутренний компонент, представленный 'facetComponent'. –
BalusC