IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Struts 1 Java Discussion :

[Struts 1.3.8] Checkbox dont la valeur = true alors qu'elle est décochée


Sujet :

Struts 1 Java

  1. #1
    Invité
    Invité(e)
    Par défaut [Struts 1.3.8] Checkbox dont la valeur = true alors qu'elle est décochée
    Bonjour tout le monde!

    Je m'arrache les cheveux sur un problème de checkbox que je n'arrive pas à comprendre.

    J'ai une page avec 2 checkbox:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <html:checkbox property="add_product1" />Add Product 1
    []
    <html:checkbox property="add_product2" />Add Product 2
    Dans l'ActionForm associé à mon formulaire, j'ai les champs et les getter/setter suivants:
    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
    16
    17
    18
     
        private boolean add_product1;
     
        public boolean isAdd_product1() {
            return this. add_product1;
        }
        public void setAdd_product1(boolean add_product1) {
            this. add_product1 = add_product1;
        }
     
        private boolean add_product2;
     
        public boolean isAdd_product2() {
            return this. add_product2;
        }
        public void setAdd_product2(boolean add_product2) {
            this. add_product2 = add_product2;
        }
    Dans le reset() de l'ActionForm, j'initialise mes 2 booléens à false:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        public void reset() {
            []
            add_product1 = false;
            add_product2 = false;
        }
    Dans mon formulaire, lorsque l'utilisateur change l'item sélectionné dans un popup menu, une action est lancée par l'intermédiaire de la fonction retrieveURL de la biblio ajax.js, qui permet de ne recharger qu'une partie de la page (tout ce qui se trouve entre de <span id="mon_id"></span>, ce qui est le cas de mes checkbox).

    Le problème, c'est qu'avant même que mon action ne soit traitée, Struts mets mes 2 booléens à la valeur true, que la checkbox soit cochée ou pas. Et ça je ne comprends vraiment pas pourquoi…

    En effet, j'ai mis un point d'arrêt sur les setters de mes 2 booléens et lorsque je passe en debug je vois que les setters sont appelés avec comme paramètre true, même si les checkbox ne sont pas cochées, exactement comme s'il y avait une erreur de mapping entre mon formulaire et mon ActionForm (avant même d'arriver au traitement de mon action dans ma classe Action)… Pourquoi?

    Selon la FAQ Struts, si la checkbox n'est pas cochée le champ associé devrait être à null, or il est à true…

    Merci d'avance pour votre aide.

    PS: j'ai essayé la même chose avec des String à la place des booléens et j'obtiens la même chose…
    Dernière modification par Invité ; 22/05/2007 à 07h32.

  2. #2
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Bonjour,

    Peux tu poster le code de retrieveURL et les paramètres que tu lui passes ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    J'appelle retrieveURL de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retrieveURL('/vcctl/operation/mixing.do?action=change_product',this.form.name);
    Le code de retrieveURL se trouve dans le fichier ajax.js, qui fait partie de cette archive.

    Plus d'infos sur ajax.js sur la page évoquée plus haut.

    Comme je l'ai dit, retrieveURL permet de ne recharger que certaines parties d'une page, celles étant contenues entre les balises <span id="mon_id"></span>, ce qui est le cas de mes checkboxes.

    The JavaScript function retrieveURL() calls Struts on the server (via the URL provided), takes the JSP response, and updates the web page being displayed, where the <span> tags on the existing web page match those on the newly returned JSP. Simple!
    Mais je ne pense pas que le problème vienne de là, j'utilise souvent cette fonction sans problème. notamment pour d'autres éléments de la page en question.

    De plus, mon action est bien appelée comme il se doit, mais le problème se produit avant même le traitement de l'action.

    Merci en tout cas de m'aider.

    [Edit]Code source de ajax.js:
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    /**
     * Ajax.js
     *
     * Collection of Scripts to allow in page communication from browser to (struts) server
     * ie can reload part instead of full page
     *
     * How to use
     * ==========
     * 1) Call retrieveURL from the relevant event on the HTML page (e.g. onclick)
     * 2) Pass the url to contact (e.g. Struts Action) and the name of the HTML form to post
     * 3) When the server responds ...
     *               - the script loops through the response , looking for <span id="name">newContent</span>
     *               - each <span> tag in the *existing* document will be replaced with newContent
     *
     * NOTE: <span id="name"> is case sensitive. Name *must* follow the first quote mark and end in a quote
     *               Everything after the first '>' mark until </span> is considered content.
     *               Empty Sections should be in the format <span id="name"></span>
     */
     
    //global variables
      var req;
      var which;
     
     
      /**
       * Get the contents of the URL via an Ajax call
       * url - to get content from (e.g. /struts-ajax/sampleajax.do?ask=COMMAND_NAME_1) 
       * nodeToOverWrite - when callback is made
       * nameOfFormToPost - which form values will be posted up to the server as part 
       *                                    of the request (can be null)
       */
      function retrieveURL(url,nameOfFormToPost) {
     
        //get the (form based) params to push up as part of the get request
        url=url+getFormAsString(nameOfFormToPost);
     
        //Do the Ajax call
        if (window.XMLHttpRequest) { // Non-IE browsers
          req = new XMLHttpRequest();
          req.onreadystatechange = processStateChange;
          try {
          	req.open("GET", url, true); //was get
          } catch (e) {
            alert("Problem Communicating with Server\n"+e);
          }
          req.send(null);
        } else if (window.ActiveXObject) { // IE
     
          req = new ActiveXObject("Microsoft.XMLHTTP");
          if (req) {
            req.onreadystatechange = processStateChange;
            req.open("GET", url, true);
            req.send();
          }
        }
      }
     
    /*
       * Set as the callback method for when XmlHttpRequest State Changes 
       * used by retrieveUrl
      */
      function processStateChange() {
     
      	  if (req.readyState == 4) { // Complete
          if (req.status == 200) { // OK response
     
            ///alert("Ajax response:"+req.responseText);
     
            //Split the text response into Span elements
            spanElements = splitTextIntoSpan(req.responseText);
     
            //Use these span elements to update the page
            replaceExistingWithNewHtml(spanElements);
     
          } else {
            alert("Problem with server response:\n " + req.statusText);
          }
        }
      }
     
     /**
      * gets the contents of the form as a URL encoded String
      * suitable for appending to a url
      * @param formName to encode
      * @return string with encoded form values , beings with &
      */ 
     function getFormAsString(formName){
     
     	//Setup the return String
     	returnString ="";
     
      	//Get the form values
     	formElements=document.forms[formName].elements;
     
     	//loop through the array , building up the url
     	//in the form /strutsaction.do&name=value
     
     	for ( var i=formElements.length-1; i>=0; --i ){
     		//we escape (encode) each value
     		returnString=returnString+"&"+escape(formElements[i].name)+"="+escape(formElements[i].value);
     	}
     
     	//return the values
     	return returnString; 
     }
     
     /**
     * Splits the text into <span> elements
     * @param the text to be parsed
     * @return array of <span> elements - this array can contain nulls
     */
     function splitTextIntoSpan(textToSplit){
     
      	//Split the document
     	returnElements=textToSplit.split("</span>")
     
     	//Process each of the elements 	
     	for ( var i=returnElements.length-1; i>=0; --i ){
     
     		//Remove everything before the 1st span
     		spanPos = returnElements[i].indexOf("<span");		
     
     		//if we find a match , take out everything before the span
     		if(spanPos>0){
     			subString=returnElements[i].substring(spanPos);
     			returnElements[i]=subString;
     
     		} 
     	}
     
     	return returnElements;
     }
     
     /*
      * Replace html elements in the existing (ie viewable document)
      * with new elements (from the ajax requested document)
      * WHERE they have the same name AND are <span> elements
      * @param newTextElements (output of splitTextIntoSpan)
      *					in the format <span id=name>texttoupdate
      */
     function replaceExistingWithNewHtml(newTextElements){
     
     	//loop through newTextElements
     	for ( var i=newTextElements.length-1; i>=0; --i ){
     
     		//check that this begins with <span
     		if(newTextElements[i].indexOf("<span")>-1){
     
     			//get the name - between the 1st and 2nd quote mark
     			startNamePos=newTextElements[i].indexOf('"')+1;
     			endNamePos=newTextElements[i].indexOf('"',startNamePos);
     			name=newTextElements[i].substring(startNamePos,endNamePos);
     
     			//get the content - everything after the first > mark
     			startContentPos=newTextElements[i].indexOf('>')+1;
     			content=newTextElements[i].substring(startContentPos);
     
     			//Now update the existing Document with this element
     
    	 			//check that this element exists in the document
    	 			if(document.getElementById(name)){
     
    	 				//alert("Replacing Element:"+name);
    	 				document.getElementById(name).innerHTML = content;
    	 			} else {
    	 				//alert("Element:"+name+"not found in existing document");
    	 			}
     		}
     	}
     }

  4. #4
    Invité
    Invité(e)
    Par défaut
    Peut-être n'utilise-je pas les checkbox de la bonne manière?
    Selon vous, cela devrait-il fonctionner?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Personne n'a de solution?

    Est-ce que ça vous paraît juste ce que j'ai fait?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 116
    Par défaut
    Est-ce que ton code fonctionne en enlevant la partie ajax ?
    Sinon la partie jsp, a l'air d'etre correcte.
    Essaye aussi d'effacer le repertoire work de tomcat puis de le redemarrer.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par MooGle
    Est-ce que ton code fonctionne en enlevant la partie ajax ?
    Sinon la partie jsp, a l'air d'etre correcte.
    Essaye aussi d'effacer le repertoire work de tomcat puis de le redemarrer.
    Si je remplace mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retrieveURL('/vcctl/operation/mixing.do?action=change_product',this.form.name);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    window.location.href='/vcctl/operation/mixing.do?action=change_product';
    , ben là plus grand chose ne marche car aucun des setters n'est appelé et donc aucune des valeurs qui est changée n'est prise en compte.

Discussions similaires

  1. Xhtml et datable avec <h:inputText et tout type input checkbox dont son valeur est une Liste
    Par richfaces dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 19/08/2010, 09h41
  2. [AC-2007] Test d'une valeur pour savoir si elle est nulle
    Par glooping dans le forum IHM
    Réponses: 2
    Dernier message: 01/10/2009, 11h26
  3. [checkbox] Récupération des valeurs de checkbox
    Par chng001 dans le forum Struts 1
    Réponses: 13
    Dernier message: 07/09/2009, 20h31
  4. [struts] [checkbox] récupération des valeurs cochées
    Par abourell dans le forum Struts 1
    Réponses: 16
    Dernier message: 10/06/2005, 20h58
  5. [struts] mémorisation d'une checkbox avec cookie
    Par rocco dans le forum Struts 1
    Réponses: 3
    Dernier message: 22/04/2004, 12h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo