ohne darüber nachzudenken, es zu viel zu tun, ich habe so etwas wie der folgenden getan:Spring - bester Weg, mit Bindung an eine Liste von Bohnen in einem simpleformcontroller
1) Aufbau eine Liste von SomeBean Objekten basierend auf die Ergebnisse einer Datenbank aufrufen
2)
3) Aufbau einer Form, die Liste in meinem Befehl Objekt setzen auf der Grundlage dieses Befehlsobjekt in dem Benutzer Attribute der SomeBeans ändern
4) Extrahieren von Daten der Post-Submit Befehlsobjekt und die aktualisierten Daten zu meiner Datenbank zu schreiben
Mein Code sieht in etwa wie folgt aus:
public class UpdateThingsinListController extends SimpleFormController {
protected Object formBackingObject(final HttpServletRequest request)
throws Exception {
List<SomeBean> beans = database.getBeans();
Command comamnd = new UpdateThingsCommand()
command.setList(beans);
return command;
}
protected ModelAndView onSubmit(final HttpServletRequest request,
final HttpServletResponse response, final Object commandArg,
final BindException errors) throws Exception {
database.setBeans(commandArg.getList());
}
}
mein jsp sieht somthething wie:
<form:form>
<c:forEach var="bean" items="${beans}" varStatus="status">
<form:checkbox path="beans[${status.index}].someBooleanProperty" />${bean.name} <br>
</c:forEach>
</form:form>
Der Code funktioniert gut, aber es ist nur dämmerte auf mich, dass meine "Bohnen" Liste zweimal erstellt wird (Sitzungsformular muss in meinem Fall falsch sein) - einmal beim Anzeigen des Formulars, einmal beim Binden. Wenn sich bei der zweiten Erstellung etwas ändert (eine Bean fehlt, die Ergebnisse haben eine andere Reihenfolge), wird meine Bindung durcheinander gebracht und ich werde gefeuert. Ich fange an zu denken, dass jedes Gebot, bei dem ein Befehlsobjekt mit einer Formularübergabe zusammengeführt werden muss, sehr riskant ist.
Meine Frage ist also - wie gewährleisten die Leute, dass Formulareinreichungen korrekt an Listen gebunden werden? Gibt es einen anderen Weg als den Listenindex? Objekt-IDs vielleicht?
Dank,
-Morgan
Ich denke jetzt, dass anstelle einer Liste, ich sollte vielleicht eine Karte verwenden, so würde mein Checkbox-Tag aussehen: –
morgancodes