2013-03-31 6 views
0

Мне нужно создавать экраны для отображения множества объектов JPA в представлении. Было бы здорово создать один манекен и передать ему набор полей, например. List<Object>.Как программно генерировать компоненты JSF во время выполнения?

Лицо/пользовательский компонент должен будет преобразовать каждый элемент списка в соответствующий тег для отображения, например. поле перечисления в h: selectOneMenu, поле String в h: inputText и т. д. Это нужно сделать во время выполнения.

Что это самый простой способ сделать это?

ответ

0

Работала над проектом, который динамически создавал целые страницы из сохраненной конфигурации. Вам нужны две основные вещи:

  • A BackingBean. Вы будете использовать это, чтобы получить доступ к UIComponent на лице, который будет выступать в роли родителя для сгенерированных UIComponents. Что-то вроде panelGroup. Но вам нужно привязать UIComponent к бэк-файлу, чтобы иметь родителя, против которого вы добавите динамически создаваемые UIComponents.
  • Доступ к компоненту приложения. Обычно FacesContext.getApplication() (я работал над этим в JavaEE 5, поэтому он может немного отличаться при вводе). Когда у вас есть компонент Application, вы вызываете метод createComponent, передавая тип компонента, который вы хотите создать.

Затем он становится активным процессом создания компонентов динамически, настраивая их в коде и добавляя их в родительский UIComponent, определенный с помощью связующего компонента. Это может быть сложно, но это можно сделать.

+0

Ничего себе! Круто! В моем проекте на стороне сервера я использовал org.primefaces.component.toolbar.Toolbar и добавил к нему детей UIComponent. В facelet я сделал '' и voila, который сгенерировал всю панель инструментов во время выполнения. В этом случае панель инструментов была создана уникально для каждого пользователя, что было действительно сладким. В facelet один тег, панель p: toolbar, сделал это. В сценарии, который вы описываете, как бы он выглядел в лице, например. к какому тегу я должен привязать корневой UIComponent? –

+0

Было бы очень похоже на то, что вы описываете, я думаю. Вероятно, вы используете h: panelGroup в самом лице, или что-то вроде того, что будет родительским контейнером UIComponent. Вы связываете его точно так же, как описано в примере на панели инструментов, используя атрибут привязки. Структура создаст UIComponent, и у вас будет ссылка на нее в backingBean. После этого вы можете добавить к нему дочерние UIComponents, которые создаются программно. – EdH

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