h:form внутри ui:repeat не работает должным образом

Для огромного проекта мне нужно создать несколько форм на веб-странице. Не могу вдаваться в подробности, но предположим, что у вас есть запрошенная структура списка форм; используя мохарра jsf 2.2.5

данный управляемый компонент:

@ManagedBean
@SessionScoped
public class Debug {
  private final List<DebugBean> list;

  public Debug() {
    super();
    this.list = new ArrayList<DebugBean>();
    this.list.add(new DebugBean("label 1", "value 1"));
    this.list.add(new DebugBean("label 2", "value 2"));
  }

  public String submit() {
    LOGGER.info("list = " + this.list.toString());
    return "";
  }

  public List<DebugBean> getList() {
    return this.list;
  }
}

Бин DebugBean прост, содержит две переменные: метку и значение, обе String, а также ее сеттер и геттер.

Теперь страница xhtml:

<h:body style="height: 100%">
  <ui:repeat value="#{debug.list}" var="x">
    <h:form>
      <h:panelGrid columns="2">
        <h:outputText value="#{x.label}" />
        <h:inputTextarea value="#{x.value}" />
      </h:panelGrid>
      <h:commandButton action="#{debug.submit}" value="ok" />
    </h:form>
  </ui:repeat>
</h:body>

Проблема заключается в изменении первого значения. Когда я изменяю второй, регистратор дает мне новое значение, как и ожидалось. Но меняя первый, логгер выдает мне старый список, как будто бы я перезагрузил полную форму без каких-либо изменений. В чем здесь проблема и, что более важно: что я могу сделать, чтобы это заработало?


person Jörg Henke    schedule 30.01.2014    source источник


Ответы (1)


Решение простое, но хуже. Я не знаю почему, но ui:repeat ведет себя не так, как h:dataTable. Таким образом, замена ui:repeat на h:dataTable решает проблему, но требует переделки макета страницы (что является более серьезной проблемой, но я могу сделать ее).

person Jörg Henke    schedule 31.01.2014