Bonjour.

Je n'arrive pas à utiliser proporement une checkboxlist avec struts 2.
J'utilise aussi hibernate (d'où l'utilisation des map)
Je tourne dans tous les sens.

Tout d'abord,
un utilisateur peut contenir un ensemble de groupe de contrat
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
public class Utilisateur implements java.io.Serializable {
....
	private Set<GroupeContrat> groupeContrats = new HashSet<GroupeContrat>(0);
...
Dans mon action, j'ai la liste de tous les groupes possibles, ainsi que la liste des groupes de l'utilisateur au format "list" et non "map". En effet, j'avais vu dans l'utilsiation des input qu'on ne pouvait pas itérer sur une map car non indexé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
	private List<GroupeContrat> listeGroupeContrats ;
	private ArrayList<GroupeContrat> utilisateurGroupesContratList = new ArrayList<GroupeContrat>();
Dans la jsp,
si je fait ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
<s:checkboxlist list="listeGroupeContrats" name="utilisateurGroupesContratList" 
	label="%{getText('label.utilisateur.groupeContrats')}" 
/>
--> j'ai ma liste de l'ensemble des groupe de contrat.
--> seul les contrats présent dans "utilisateurGroupesContratList" (les contrats de l'utilisateurs) sont sélectionnés : c'est ce que je veux
==> Par contre, les libellé sont "cont.hibernate.GroupeContrat@18ba2b6b", ce qui n'est pas ce que je veux
Le html généré est
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
<div class="checkbox">
        <label for="utilisateurGroupesContratList-3" class="checkbox">
            <input type="checkbox" name="utilisateurGroupesContratList" value="cont.hibernate.GroupeContrat@18ba2b6b" id="utilisateurGroupesContratList-3">            cont.hibernate.GroupeContrat@18ba2b6b            </label>
</div>
<div class="checkbox">
        <label for="utilisateurGroupesContratList-5" class="checkbox">
            <input type="checkbox" name="utilisateurGroupesContratList" value="cont.hibernate.GroupeContrat@22222" id="utilisateurGroupesContratList-5">            cont.hibernate.GroupeContrat@22222      </label>
</div>
Afin d'afficher les libellés, j'ai donc essayé cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
<s:checkboxlist list="listeGroupeContrats" name="utilisateurGroupesContratList" 
	label="%{getText('label.utilisateur.groupeContrats')}"  
	listKey="grpId" listValue="%{grpCode +' - '+ grpLibelle}"    />
Le html généré est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
<div class="checkbox">
        <label for="utilisateurGroupesContratList-3" class="checkbox">
            <input type="checkbox" name="utilisateurGroupesContratList" value="3" id="utilisateurGroupesContratList-3">            aa - aaa        </label>
</div>
<div class="checkbox">
        <label for="utilisateurGroupesContratList-5" class="checkbox">
            <input type="checkbox" name="utilisateurGroupesContratList" value="5" id="utilisateurGroupesContratList-5">        cc - cccc        </label>
    </div>
--> Mon affichage est donc correct
--> le value=3 correspond bien au libellé affiché
==> Par contre, les contrats de l'utilisateur (présent dans utilisateurGroupesContratList) ne sont plus coché par défaut
==> à la validation, la liste ne contient pas l'ensemble des ééments coché si il y en avait plusieurs de coché


La seule méthode que j'ai trouvé pour valider correctement la sélection (et donc faire correctement l'enregistrement dans l'action) est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
<s:checkboxlist list="listeGroupeContrats" name="utilisateurGroupesContratList.grpId" 
	label="%{getText('label.utilisateur.groupeContrats')}"  
	listKey="grpId" listValue="%{grpCode +' - '+ grpLibelle}"    />
Ce qui donne :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
<div class="checkbox">
        <label for="utilisateurGroupesContratList.grpId-3" class="checkbox">
            <input type="checkbox" name="utilisateurGroupesContratList.grpId" value="3" id="utilisateurGroupesContratList.grpId-3">        aa - aaa        </label>
    </div>
<div class="checkbox">
        <label for="utilisateurGroupesContratList.grpId-5" class="checkbox">
            <input type="checkbox" name="utilisateurGroupesContratList.grpId" value="5" id="utilisateurGroupesContratList.grpId-5">        cc - cccc        </label>
    </div>
--> L'affiche est correct
--> A la validation, j'obtiens bien une liste "utilisateurGroupesContratList" qui contient les objets 'groupe de contrat" qui ont été sélectionnés dans lequel le grpId est alimenté.
==> Par contre, les éléments ne sont pas sélectionnés par défaut lorsque "utilisateurGroupesContratList" contenait des éléments lors de l'arrivée sur la page



--> Sauriez vous donc comment faire?
Car je ne trouve vraiment pas. La seule chose que je remarque, c'est que ca fonctionne facilement si on travaille simplement avec des string, mais pas avec des objets plus complexe


Merci d'avance.