Ich habe einige Probleme mit JSF und Datatables konfrontiert. In meiner Bean habe ich eine Liste von Objekten, die in der Ansicht angezeigt werden, indem ich auf eine Datentabelle angewiesen bin. Das Objekt ist sehr einfach, jeder von ihnen besteht aus einer ganzen Zahl (die ID) und einem String (der Kommentar).JSF Datatable: Mehrere Zeilen reichen über eine einzige Befehlsschaltfläche
Ziel ist es, dem Benutzer die vollständige Liste der Objekte zu drucken, die gleichzeitig eine oder mehrere Zeilen (über ein h: inputtext-Feld) bearbeiten und dann seine Änderungen über eine Schaltfläche übermitteln. Und das ist das Problem. Ich habe bereits "erfolgreich" Datatables verwendet, indem ich pro Zeile eine Zeile bearbeitet habe, indem ich auf die Schaltfläche Bearbeiten/Speichern in jeder Zeile angewiesen habe. In diesem Fall ist dies jedoch nicht möglich, da der Endbenutzer mit mehr als 500 Zeilen insgesamt konfrontiert wird. Hier
ist der Code, den ich verwendet (vereinfacht und extrahiert)
Bean:
@ManagedBean
@RequestedScope
public class VlanBean {
private DataModel<VlanWrapper> model;
private List<VlanWrapper> vlans = new ArrayList<VlanWrapper>();
public VlanBean() {
vlans.add(new VlanWrapper(1, ""));
vlans.add(new VlanWrapper(2, "Prova2-2"));
vlans.add(new VlanWrapper(3, ""));
vlans.add(new VlanWrapper(4, ""));
vlans.add(new VlanWrapper(5, ""));
vlans.add(new VlanWrapper(6, "Prova3"));
vlans.add(new VlanWrapper(7, ""));
vlans.add(new VlanWrapper(8, ""));
}
public void commitChanges()
{
System.out.println("Before Model ");
for (VlanWrapper vw : model)
{
System.out.println("ModelOF " + vw.getId() + " - " + vw.getProject() + " - changed: " + vw.changed + ";");
}
}
public DataModel<VlanWrapper> getModel() {
if (model == null)
model = new ListDataModel<VlanWrapper>(vlans);
return model;
}
public void setModel(DataModel<VlanWrapper> model) {
this.model = model;
}
public class VlanWrapper
{
private boolean changed;
private int id;
private String project;
public VlanWrapper(int id, String prj)
{
this.id = id;
this.project = prj;
changed = false;
}
public String getProject() {
return project;
}
public void setProject(String project) {
System.out.println("Setting PRJ..");
changed = true;
this.project = project;
}
public int getId() {
return id;
}
public boolean isChanged() {
return changed;
}
}
}
Ausblick:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
</h:head>
<h:body>
<f:view>
<h:panelGroup>
<h:form>
<h:commandButton value="Commit changes to DB" action="#{VlanBean.commitChanges}">
</h:commandButton>
</h:form>
<h:dataTable value="#{VlanBean.model}" var="vlans">
<h:column><f:facet name="header">ID</f:facet>#{vlans.id}</h:column>
<h:column><f:facet name="header">Project</f:facet>
<h:inputText value="#{vlans.project}" immediate="true"/>
</h:column>
</h:dataTable>
</h:panelGroup>
</f:view>
</h:body>
</html>
Das Problem ist, dass alle Änderungen, die ich auf der Ansicht tun sind nicht in der Bohne reflektiert und ich habe keinen nützlichen Hinweis/post around (einige, wo vorgeschlagen Ajax gezwungen Update, andere Javascript, aber ich habe keine von ihnen funktioniert und niemand war wirklich clo zu der von mir gewünschten Verwendung).
Ich habe auch versucht, für ui: wiederholen, aber ich habe das gleiche Verhalten. Irgendwelche Ideen/Vorschläge? Ich bin nicht verpflichtet, Datatable zu verwenden, also bin ich offen für andere Lösungen/Ansätze!
Dank in advace, Alberto
Vielen Dank für die Antwort, es klärt mich mehrere Punkte! eigentlich für den Fluss muss ich implementieren, ich werde nicht die Editier-Eigenschaft benötigen, aber es war ein sehr guter Vorschlag und Beispiel! Vor allem der Ajaxteil! – kappaalby