2009-03-12 4 views
2

Sans y penser trop, je fais quelque chose comme ce qui suit:printemps - la meilleure façon de traiter la liaison à une liste de haricots dans un SimpleFormController

1) la construction d'une liste d'objets SomeBean sur la base les résultats d'une base de données appellent

2) mettre cette liste dans mon objet de commande

3) la construction d'un formulaire basé sur cet objet de commande où les utilisateurs peuvent modifier les attributs des SomeBeans

4) extraction des données sur de la post-soumission objet de commande et l'écriture des données mises à jour ma base de données

Mon code ressemble à ceci:

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());   

    } 


} 

mon jsp ressemble somthething comme:

<form:form> 
    <c:forEach var="bean" items="${beans}" varStatus="status"> 
     <form:checkbox path="beans[${status.index}].someBooleanProperty" />${bean.name} <br>  
    </c:forEach> 
</form:form> 

Le code fonctionne très bien, mais il est juste aube sur moi que ma liste de «haricots» est créée deux fois (la forme de session doit être fausse dans mon cas) - une fois en affichant le formulaire, une fois en liant. Si quelque chose change sur la deuxième création (un haricot est manquant, les résultats sont dans un ordre différent), ma liaison sera foiré, et je serai viré. Je commence à penser que tout schéma de fusion dans lequel un objet de commande doit être fusionné avec une soumission de formulaire est très risqué. Donc, ma question est: comment les gens s'assurent-ils que les soumissions de formulaire sont liées aux listes correctement? Existe-t-il un autre moyen de le faire en plus de l'index de la liste? ID d'objet peut-être?

grâce,

-Morgan

+0

Je pense maintenant qu'au lieu d'une liste, je devrais peut-être utiliser une carte, donc ma balise checkbox ressemblerait à: morgancodes

Répondre

0

Si vous ne pouvez pas compter sur la liste toujours identique à chaque fois que vous la récupérez, vous devez utiliser une collection différente - une carte.

Une autre approche serait de mettre votre liste en cache quelque part. Peut-être quelques AOP autour de votre méthode database.getBeans.

0

La manière rapide est d'abord supprimer tous les SomeBeans existants de la base de données et créer ceux liés à soumettre.

Une manière plus élégante pourrait être de mettre l'identifiant unique de SomeBean dans un champ de formulaire caché.

2

Si sessionForm est défini sur false, lors de l'envoi, la commande est recréée dans la méthode formBackingObject. L'ordre de la liste dans la méthode onSubmit sera exactement comme l'ordre des objets liés sur la page.

Questions connexes