2015-08-25 4 views
0

Я использую 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.

ответ

1

Это обычный экземпляр UIPanel, который вы можете просто получить через UIComponent#findComponent() обычным способом, передавая идентификатор клиента составного компонента. В случае Mojarra, вы можете найти код, отвечающий за создание его в com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler, который имеет в Mojarra 2.2.11 ниже логики:

360  if (ComponentHandler.isNew(c)) { 
361   facetComponent = (UIPanel) 
362   facesContext.getApplication().createComponent("javax.faces.Panel"); 
363   facetComponent.setRendererType("javax.faces.Group"); 
364   c.getFacets().put(UIComponent.COMPOSITE_FACET_NAME, facetComponent); 
365  }                     
366  else { 
367   facetComponent = (UIPanel) 
368     c.getFacets().get(UIComponent.COMPOSITE_FACET_NAME); 
369  } 
+0

Понял, спасибо. В Mojarra 2.1 источники почти одинаковы. Но еще один вопрос: facetComponent - это локальная переменная, поэтому я предполагаю, что компонент выполняется с помощью 'ctx.includeFacelet (facetComponent, ccResource.getURL());' invocation. Но javadocs для этого метода не совсем понятны: _ Включите еще одну Facelet, определенную на каком-то пути, абсолютную для этого ClassLoader/OS_. Не могли бы вы прояснить, что это означает простыми словами? –

+0

'' внутренний компонент, представленный 'facetComponent'. – BalusC

Смежные вопросы