JSF/Data Table

La mise en oeuvre d'un formulaire multiligne avec une data table est très simple. Il suffit de lier le composant data table avec une liste, comme pour un affichage, d'utiliser des composants de saisie dans la définition des colonnes et d'inclure la data table dans un h:form. Les valeurs saisies seront alors injectées par JSF directement dans les objets de la liste.

Code JSP:

<h:form>
  <h:dataTable value="#{testBean.myDataList}"  var="item">
    <h:column>
      <f:facet name="header">
      <h:outputText value="Valeur 1" />
      </f:facet>
      <h:inputText value="#{item.value1}" />
    </h:column>
    <h:column>
      <f:facet name="header">
      <h:outputText value="Valeur 2" />
      </f:facet>
      <h:inputText value="#{item.value2}" />
    </h:column>
  </h:dataTable>
  <h:commandButton actionListener="#{testBean.process}" value="Go !"/>
</h:form>


Backing bean:

public class TestBean {
  private List myDataList = new ArrayList<Data>();
  public TestBean() {
    myDataList.add(new Data("id 1", "val 1"));
    myDataList.add(new Data("id 2", "val 2"));
  }
  public List<Data> getMyDataList() {
    return myDataList;
  }
  public void setMyDataList(List<Data> myDataList) {
    this.myDataList = myDataList;
  }
  public void process(ActionEvent event) {
    for (Data data : myDataList) {
      System.out.println("value1=" + data.getValue1() + ", value2=" + data.getValue2());
    }
  }
}

Objet dans la liste:

public class Data {
  private String value1;
  private String value2;
  public Data(String value1, String value2) {
    this.value1 = value1;
    this.value2 = value2;
  }
  public String getValue1() {
    return value1;
  }
  public void setValue1(String value1) {
    this.value1 = value1;
  }
  public String getValue2() {
    return value2;
  }
  public void setValue2(String value2) {
    this.value2 = value2;
  }
}