2010-08-26 4 views
0

J'ai une JSP où je montre la date et la description de la base de données. Chaque entrée a un identifiant unique, mais je ne montre pas sur la page (montrant la case à cocher) Ces entrées sont lancées en utilisant une "logique: itérer", donc le nombre de lignes change toujours en fonction des entrées. Maintenant, ces champs sont affichés en tant que champ de texte afin que l'utilisateur peut également mettre à jour la date ou la description. Une case à cocher est à gauche afin que l'utilisateur puisse sélectionner toutes les valeurs qu'il souhaite mettre à jour. Rappelez-vous la logique: itérer ci-dessus, la case à cocher doit être définie en utilisant le nom et ne peut pas avoir d'ID.Erreur dans mes entretoises Classe d'action

... 
... 
<logic:notEmpty name="specialResult" scope="request"> 
    <logic:iterate name="specialResult" id="specialResult" indexId="index"> 
     <tr align="center"> 
      <td width="15%"> 
      <input type="checkbox" name="upisActive" property="upisActive" 
           value="<bean:write name="specialResult" property="upId"/>"></input></td> 
      <td width="15%"><input type="text" name="upDate" value="<bean:write name="specialResult" property="upDate"/>" 
           property="upDate" size="20" class="Date" id="Date"></input></td> 
      <td width="15%"><input type="text" name="upDesc" value="<bean:write name="specialResult" property="upDesc"/>" 
           property="upDesc" size="20" id="Desc"/></td> 
     </tr> 
    </logic:iterate> 

... 

Mon erreur est que si j'ai trois lignes et je veux mettre à jour la troisième ligne et sélectionnez la troisième case. Ma classe Action récupère la date et la descente de la première ligne. Comment puis-je modifier ma classe d'action pour récupérer la valeur par rapport aux cases cochées?

public ActionForward class(ActionMapping mapping, ActionForm theForm, 
     HttpServletRequest request, HttpServletResponse response) throws IOException, 
     SQLException, ServletException 
{ 
    Connection conn = null; 
    Service Serv = new Service(); 
    List updList = new ArrayList(); 
    Form upForm = (Form) theForm; 
    String[] values = request.getParameterValues("upisActive"); 
    try 
    { 
     conn = getConnection(request, false); 
     for (int i=0;i<values.length;i++){ 
      VO hdvo = new VO(); //Vo class with getters and setters 
      val = values[i]; 
      hdvo.setDate(upForm.upDate[i]); 
      hdvo.setDesc(upForm.upDesc[i]); 
      updList.add(hdvo); 

     } 
     hdServ.updTest(updList, conn); 
     ... 
+0

Je ne fais pas Struts, alors voici juste un indice pour vous aider à une étape supplémentaire: Ouvrez la page dans webbrowser, rightclick et choisissez * Afficher la source *. Est-ce que tout semble bien? – BalusC

Répondre

1

Le problème est lié à la façon dont vous avez configuré votre page. Vous avez toutes les cases avec le même nom (configuration standard) mais vous avez également les champs upDate et upDesc également configurés avec le même nom.

Cela signifie que lorsque vous soumettez votre formulaire, sur le serveur, vous obtiendrez (en considérant votre exemple) une liste de 3 upDate valeurs, une liste de 3 upDesc valeurs et une liste de 3 upisActive cases à cocher. Eh bien ... pas tout à fait!

Le problème est vos cases à cocher et le code que vous utilisez pour lire les valeurs à mettre à jour. D'abord, les cases à cocher ne sont pas envoyées sur la requête si elles ne sont pas cochées. Cela signifie que, en fonction de votre sélection, sur le serveur, vous obtiendrez une liste de valeurs upisActive de longueur 0, 1, 2 ou 3.

Deuxièmement, vous avez alors ce code sur le serveur:

String[] values = request.getParameterValues("upisActive"); 
... 
for (int i = 0; i < values.length; i++) { 
    ... 
    val = values[i]; 
    hdvo.setDate(upForm.upDate[i]); 
    hdvo.setDesc(upForm.upDesc[i]); 
    ... 
} 

Dans votre exemple, cochez la troisième case et envoyez votre formulaire. Cela signifie que String[] values sera de longueur 1 car seule la case sélectionnée est envoyée au serveur. Mais les champs de saisie sont toujours envoyés en 3 upDesc et 3 upDate.

Ensuite, vous bouclez-le (une fois) et extrayez upForm.upDate[0] et upForm.upDesc[0]. De cette façon, vous mettez à jour la première ligne en cochant la troisième case.

Autres problèmes:

1) Vous avez utilisé le même identifiant dans le code suivant (il est d'avoir des ennuis): Vous utilisez des entrées classiques et a ajouté property attribut

<logic:iterate name="specialResult" id="specialResult"... 

2) lui :

<input type="text" ... property="upDate" />" property="upDate" ... 

3) Je ne sais pas que les garanties de navigateur que les champs seront envoyés dans l'ordre de correspondance exacte à chaque fois, donc en utilisant un seul compteur est, Je suppose, juste "espérant" pour le même ordre.

4) De plus, lisez this

+0

Merci pour le post. Je vais essayer de faire des changements comme vous l'avez indiqué. J'espère que vos suggestions fonctionnent. –