Il est possible de faire tout ce que vous voulez.
Vous pouvez construire quelque chose proche de ce que vous voulez en utilisant les contrôles existants. Un bon moyen de tirer le meilleur parti de JSF est d'adapter le modèle à la vue. Par exemple, cette vue affiche les options d'édition qui vous permettent d'ajouter des valeurs à une table de données.
<f:view>
<h:form>
<h:dataTable value="#{people.list}" var="row">
<h:column>
<f:facet name="header">
<h:outputText value="#" />
</f:facet>
<h:selectBooleanCheckbox value="#{row.selected}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="First Name" />
</f:facet>
<h:inputText value="#{row.firstname}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Last Name" />
</f:facet>
<h:inputText value="#{row.lastname}" />
</h:column>
<f:facet name="footer">
<h:panelGroup>
<h:commandButton value="Add Row" action="#{people.addPerson}" />
<h:commandButton value="Delete Selected"
action="#{people.deleteSelected}" />
<h:commandButton value="Finish" action="#{people.finish}" />
</h:panelGroup>
</f:facet>
</h:dataTable>
</h:form>
</f:view>
Personnes haricot:
public class People implements Serializable {
private static final long serialVersionUID = 1L;
private List<Person> people = new ArrayList<Person>();
public People() {
// initialise with one entry
people.add(new Person());
}
public List<Person> getList() {
return people;
}
public String addPerson() {
people.add(new Person());
return null;
}
public String deleteSelected() {
Iterator<Person> entries = people.iterator();
while (entries.hasNext()) {
Person person = entries.next();
if (person.isSelected()) {
entries.remove();
}
}
return null;
}
public String finish() {
System.out.println(people);
return "someNavigationRule";
}
}
Personne haricot:
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String firstname;
private String lastname;
private transient boolean selected = false;
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
}
faces-config.xml:
<managed-bean>
<managed-bean-name>people</managed-bean-name>
<managed-bean-class>addmultiple.People</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
Cette approche est tout à fait flexible et avec un peu de CSS, peut avoir l'air assez bien. Avec quelques modifications apportées à la vue et au modèle, vous ne pouvez modifier que la dernière ligne, par exemple. Si l'expérience résultante n'est pas assez riche ou si vous avez besoin de quelque chose que vous pouvez réutiliser, vous pouvez créer un contrôle personnalisé. Il est difficile d'entrer dans les détails sans savoir exactement ce que vous voulez, mais vous auriez probablement besoin:
- Une nouvelle Renderer pour émettre des requêtes HTML et sous forme de décodage.
- (peut-être) un nouveau component, probablement étendu UIData, et un concrete form pour exposer des attributs spécifiques de renderkit (par exemple HTML). Un nouveau JSP tag class permet d'utiliser le contrôle dans les JSP.
- Définitions pour tout ce qui précède dans un faces-config.xml (voir spec).
J'ai atterri ici en cherchant _Datatable avec des champs d'entrée_ et cette réponse est si propre. Merci) –