Bonjour,
relativement nouveau dans le développement avec struts 1.3, je dois développer des formulaires contenant des collections d'items eux-même composés de plusieurs champs, le tout sans javascript.
Un screenshot d'un exemple concret:
Ici, c'est une collection de noms, où on peut voir trois 'items', chacun contenant deux champs (langue et nom).
L'utilisateur peut ajouter un nouvel item avec l'unique bouton add de la collection, et supprimer un item en particulier en cliquant sur le bouton 'remove' propre à chaque item.
Conceptuellement, le code de la page jsp ressemble à ça:
Pour mettre plusieurs bouton dans mon formulaire, étant donné que je dois tout faire sans javascript, j'ai utilisé un LookupDispatchAction, comme précisé dans la (super) faq struts, avec le mapping suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 name(s): <html:submit property="formSubmitAction"> <bean:message key="button.add"/> </html:submit> <nested:iterate property="names" indexId="index"> <html:submit property="formSubmitAction"> <bean:message key="button.remove"/> </html:submit> lang: <nested:text property="lang"/> name: <nested:text property="name" size="50"/> </nested:iterate>
ainsi que le struts-config:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public class SubmitAction extends LookupDispatchAction { // le mapping: protected Map getKeyMethodMap() { Map map = new HashMap(); map.put("button.save", "save"); // le submit principal de la form map.put("button.add", "add"); map.put("button.remove", "remove"); return map; } // et les fonction appelées: public ActionForward save(/*...*/) { /*...*/ } public ActionForward add(/*...*/) { /*...*/ } public ActionForward remove(/*...*/) { /*...*/ } }
Le problème:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <action path="..." type="..." name="..." input="..." validate="true" scope="request" parameter="formSubmitAction">
- dans ce cas précis, le bouton 'add' est unique. Donc aucun souci particulier (*).
- par contre, j'ai un bouton 'remove' pour chaque item. Il faudrait donc que je puisse savoir dans la fonction 'remove' de mon LookupDispatchAction quel bouton 'remove' a réellement été cliqué, afin que je puisse supprimer le bon item de la collection. Or, si j'ai bien compris, le seul paramètre passé par la form à mon action est le label affiché dans le bouton (ici: 'button.remove'), identique pour chacun des boutons de chaque item que j'ai dans mon formulaire.
Quel moyen puis-je utiliser (sans javascript) pour savoir quel item est concerné dans le cas d'un clic sur un des boutons 'remove' ?
Merci d'avance
(*) ça deviendra problématique quand j'aurai plusieurs collections (donc plusieurs boutons 'add') dans le même formulaire.
Partager