2009-04-27 3 views
0

Sans utiliser DynaForm et ses parents.Qu'est-ce qu'un bon moyen de faire des mises à jour de plusieurs lignes dans struts (avec struts live)?

Je voudrais utiliser un objet de transfert de données POJO, par exemple, personne:

public class Person { 
    private Long id; 
    private String firstName; 
    private String lastName; 
    // ... getters/setters for the fields 
} 

Dans les entretoises en direct sous forme d'action que nous aurons:

public class PersonUpdateForm extends SLActionForm { 
    String organization; 
    Person[] persons; // all the people will be changed to this organization; they're names and so forth can be updated at the same time (stupid, but a client might desire this) 

    // getters/setters + index setters/getters for persons 

} 

Quel serait le code html correspondant: texte les balises ressemblent à la JSP pour permettre cela? Si je passe à un champ Liste de personnes et que j'utilise une liste de chargement paresseux (dans commons-collections), comment cela changerait-il?

Il semble y avoir aucune bonne façon de le faire dans struts-1.2 (.9?)

Toute aide est grandement appréciée !!! Si vous avez besoin de plus de contexte faites le moi savoir et je peux en fournir.

+0

D'accord, je crois que je l'ai compris! L'astuce consiste à faire en sorte que votre getter indexé crée un élément chaque fois que la méthode getPersons() est appelée par la méthode populate de BeanUtils. Le code est encore terminé, mais j'ai obtenu un résultat positif. Il est 3h30 et j'ai été bloqué pendant un moment. Personne n'a semblé connaître la réponse, ce qui me donne envie de les frapper à la tête avec une truite. Quant à ma propre ignorance ... Je les ai seulement à blâmer! – les2

Répondre

1

D'accord, je crois que je l'ai compris! L'astuce consiste à faire en sorte que votre getter indexé crée un élément chaque fois que la méthode getPersons() est appelée par la méthode populate de BeanUtils. Le code est encore terminé, mais j'ai obtenu un résultat positif. Il est 15h30 et j'ai été bloqué pendant un moment. Personne n'a semblé connaître la réponse, ce qui me donne envie de les frapper à la tête avec une truite. Quant à ma propre ignorance ... Je les ai seulement à blâmer!

public List<Person> getPersons() { 
    persons.add(new Person()); // BeanUtils needs to know the list is large enough 
    return persons; 
} 

Ajoutez vos getters et setters indexés, bien sûr.

Je me souviens comment j'ai fait cela. Vous devez pré-initialiser la liste des personnes ci-dessus à la taille maximale que vous prévoyez de transférer. Cela est dû au fait que la liste est d'abord convertie en un tableau, les propriétés définies ensuite sur chaque élément du tableau et enfin la liste en utilisant setPersons (...). Par conséquent, l'utilisation d'une implémentation de liste par chargement paresseux ou d'une approche similaire (comme celle ci-dessus) ne fonctionnera PAS avec les struts en direct. Voici ce que vous devez faire plus en détail:

private List<Person> persons = new ArrayList<Person>(MAX_PEOPLE); 
public MyConstructor() { for(int i = 0; i < MAX_PEOPLE; i++) persons.add(new Person()); } 

public List<Person> getPeopleSubmitted() { 
    List<Person> copy = new ArrayList<Person>(); 
    for(Person p : persons) { 
     if(p.getId() != null) copy.add(p); 
     // id will be set for the submitted elements; 
     // the others will have a null id 
    } 
    return copy; // only the submitted persons returned - not the blank templates 
} 

C'est essentiellement ce que vous avez à faire! Mais la vraie question est - qui utilise les entretoises en direct ?!