JSF2.0: список переменных пользовательского компонента

Есть ли способ использовать JSF2.0 в связи с переменными списками компонентов? Например, скажем, у меня есть список людей, которых я хотел бы отредактировать. Они представлены на странице в виде списка компонентов PersonEditor, позволяющих изменять данные о человеке. Каждый редактор связан с одним элементом Person. Чтобы это сработало, мне нужно выполнить следующие шаги:

При первоначальном запросе:

  1. Получить список людей
  2. Для каждого человека создайте PersonEditor и свяжите его с объектом Person.
  3. Заполните данные редактора.

По действию пользователя:

  1. Когда пользователь изменяет значения и нажимает кнопку «Сохранить», данные обрабатываются компонентом поддержки.

Я могу либо заполнить редактор данными из списка людей, либо привязать его к вспомогательному компоненту, но не одновременно, поэтому я застрял.

Я пробовал
people.xhtml

<ui:render value="#{bean.people}" var="person">
  <example:personEditor person="#{person}"/>
</ui:render>

где personEditor.xhtml:
а) правильная ассоциация с объектом person, но без связи с компонентом поддержки

<h:form>
  <h:outputText value="#{cc.attr.person.name}"/>
  <h:commandButton name="Save" actionListener="editorBean.save">
    <f:ajax execute="@form" render="@form"/>
  </h:commandButton>
</h:form>

б) нет связи с объектом person, но есть связь с bean-компонентом поддержки - нет способа передать этого человека в bean-компонент поддержки

<h:form>
  <h:outputText value="#{editorBean.name}"/>
  <h:commandButton name="Save" actionListener="editorBean.save">
    <f:ajax execute="@form" render="@form"/>
  </h:commandButton>
</h:form>

Если бы у меня был каждый редактор на отдельной странице, я мог бы передать идентификатор человека в качестве параметра URL-адреса (используя либо f:param, либо f:attribute) и соответствующим образом инициализировать его. Есть ли решение этой проблемы?


person rattaman    schedule 03.06.2010    source источник


Ответы (1)


Хм, интересно, почему никто не ответил на это до сих пор... Проверьте это:

http://balusc.blogspot.com/2006/06/communication-in-jsf.html

Таким образом, ваш код будет выглядеть примерно так:

<h:form>
  <h:outputText value="#{cc.attr.person.name}"/>
  <h:commandButton name="Save" actionListener="#{editorBean.save}">
    <f:ajax execute="@form" render="@form"/>
    <f:setPropertyActionListener target="#{editorBean.editedPersonId}" value="#{cc.attr.person.id}" />
  </h:commandButton>
</h:form>

и при вызове editorBean.save атрибут будет содержать идентификатор редактируемого человека (или вы можете передать сам объект человека).

person egbokul    schedule 31.07.2010