Jörg Henke
Jörg Henke

Reputation: 123

h:form inside ui:repeat doesn't work as expected

For a huge project, I need to build multiple forms on a web page. Can't go into details, but assume to have the requested structure of a list of forms; using mojarra jsf 2.2.5

given Managed Bean:

@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;
  }
}

The bean DebugBean is simple, just contains two variables label and value, both String, and its setter and getter.

Now the xhtml page:

<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>

The problem is in changing the first value. When I change the second one, the logger gives me the new value as expected. But changing the first one, the logger gives me the old list, as if I would have reloaded the complete form without any changes. What's the problem here, and more important: what can I do to make it work?

Upvotes: 1

Views: 790

Answers (1)

J&#246;rg Henke
J&#246;rg Henke

Reputation: 123

The solution is simple, but worse. I don't know why, but ui:repeat does not behave as h:dataTable does. So replacing ui:repeat by h:dataTable solves the problem, but means page layout rework (which is a bigger problem, but can be done by me).

Upvotes: 1

Related Questions