Найдите один или несколько компонентов внутри f: facet - работает ли он как задумано? - PullRequest
2 голосов
/ 01 апреля 2011

У меня на странице есть пользовательский компонент с фасетом внутри

<jtcomp:blockUI ...>
   <f:facet name="events">
      <f:param name="filtering" value="true"/>
      <f:param name="sorting" value="true"/>
      <f:param name="paging" value="true"/>
   </f:facet>
   ...
</jtcomp:blockUI>

В классе рендерера я собираюсь собрать все параметры UIP (f: param). Сначала я получаю аспект следующим образом

UIComponent facet = blockUI.getFacet("events");

Хорошо. Теперь я подумал, что могу вызвать facet.getChildren () и выполнить итерацию для всех потомков. Но я отладил и понял, что могу это сделать, только если f: facet содержит более одного компонента f: param. Если у него есть только один f: param, как это

<jtcomp:blockUI ...>
   <f:facet name="events">
      <f:param name="filtering" value="true"/>
   </f:facet>
   ...
</jtcomp:blockUI>

вызов выше доставляет уже этот компонент. Я имею в виду, фасет является параметром UIP. Поэтому вся логика выглядит как

// collect all f:param
List<UIParameter> uiParams = new ArrayList<UIParameter>();
if (facet instanceof UIParameter) {
  // f:facet has one child and that's f:param
  uiParams.add((UIParameter) facet);
} else if (facet != null && facet.getChildren() != null) {
  // f:facet has no or more than one child
  for (UIComponent kid : facet.getChildren()) {
     if (kid instanceof UIParameter) {
        uiParams.add((UIParameter) kid);
     }
  }
}

Это ожидаемое поведение JSF или просто ошибка Mojarra (я использую Mojarra 2.1.0-b02)? Я знаю, что до JSF2 только одному компоненту разрешалось находиться внутри f: facet. Возможно, они все еще проверяют это и не создают экземпляр FacetsMap, если доступен только один дочерний компонент. Вместо FacetsMap, содержащего все дочерние компоненты, дочерний компонент самостоятельно связывается как фасет с родительским компонентом.

Что ты думаешь? Я ничего не мог найти в спецификации JSF. Заранее спасибо за ваши ответы!

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011

Хорошо, нашел ответ в методе addComponent из ComponentSupport.java

/**
* Add the child component to the parent. If the parent is a facet,
* check to see whether the facet is already defined. If it is, wrap the existing component
* in a panel group, if it's not already, then add the child to the panel group.
* If the facet does not yet exist, make the child the facet.
*/
public static void addComponent(FaceletContext ctx, UIComponent parent, UIComponent child)

Все дочерние элементы автоматически включаются в UIPanel, так что мой код работает нормально.

1 голос
/ 01 апреля 2011

Я не знаю, где это указано, но я нашел комментарий в официальном руководстве по Java EE.

Из руководства по Java EE 6 (включая JavaServer Faces 2.0):

Фасеты могут иметь только одного дочернего элемента, поэтому тег h: panelGroup необходим, если вы хотите сгруппировать более одного компонента в пределах f: facet

Возможно, обернуть ваши параметрывнутри h:panelGroup поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...