2009-03-12 8 views
2

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

+0

Ich denke jetzt, dass anstelle einer Liste, ich sollte vielleicht eine Karte verwenden, so würde mein Checkbox-Tag aussehen: morgancodes

Antwort

0

Wenn Sie sich nicht darauf verlassen können, dass die Liste beim Abrufen immer gleich ist, müssen Sie eine andere Sammlung verwenden - eine Karte.

Ein anderer Ansatz wäre, Ihre Liste irgendwo zwischenzuspeichern. Vielleicht ein AOP um Ihre Datenbank.getBeans Methode.

0

Der schnelle Weg ist es, zunächst alle vorhandenen SomeBeans aus der Datenbank zu löschen und die, die auf einreichen gebunden zu erstellen.

Ein eleganterer Weg könnte darin bestehen, den eindeutigen Bezeichner des SomeBean in ein verstecktes Formularfeld zu schreiben.

2

Wenn die sessionForm auf false festgelegt ist, wird der Befehl während der Übermittlung in der formBackingObject-Methode neu erstellt. Die Reihenfolge der Liste in der onSubmit-Methode entspricht genau der Reihenfolge der gebundenen Objekte auf der Seite.