Перенос составного компонента в пользовательский компонент

Я должен перенести составной компонент в пользовательский компонент. Этот пример довольно упрощен, но демонстрирует проблему: дочерние элементы моего компонента (my:test) должны быть представлены в другом компоненте. Композит my:testCв качестве примера, который я не хочу использовать, будет выглядеть так

<composite:implementation>
  <p:panel>
    <composite:insertChildren/>
  </p:panel>
</composite:implementation>

Очевидно (по крайней мере, я надеюсь, что я правильно с этим предположением) я не могу просто сделать p:panel в encodeBegin,

@FacesComponent("test")
public class Test extends UIPanel
{   
  @Override
  public void encodeBegin(FacesContext context) throws IOException
  {
    // ??
  }

  @Override
  public void encodeEnd(FacesContext context) throws IOException
  {
   // ??
  }
}

Я хочу использовать my:test таким образом:

<my:test>
  <h:outputText value="some Text"/>
</my:test>

Вывод должен быть таким же, как при использовании my:testC: некоторый текст отображается на панели PrimeFaces. Как я могу кодировать использование p:panel в моем классе Java?

1 ответ

Вы правильно это заметили. Вы не можете просто отобразить "p: панель" или любую другую разметку jsf в пользовательском компоненте.

Что вы можете сделать, однако:

  • Создайте подкомпоненты с помощью экземпляра приложения, добавьте его в качестве аспекта или дочернего элемента в свой пользовательский компонент, а затем вызовите кодирование для него в своем собственном рендерере.

  • Прямой рендеринг HTML

  • Используйте API Facelet, который должен быть доступен в текущем JSF (я никогда не работал с этим)

  • Используйте любую другую обработку шаблона, такую ​​как скорость или freemarker, для рендеринга HTML.

Другие вопросы по тегам