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 :

Initialisation html:checkbox


Sujet :

Struts 1 Java

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut Initialisation html:checkbox
    Bonjour,

    J'ai un problème avec une checkbox que je n'arrive pas à initialiser.
    Le principe est de stocker en session la valeur de la CB à la validation de l'écran et de pouvoir réafficher l'écran à jour au cours de la navigation. Le problème est que si j'arrive bien à récupérer ma valeur (true/false), il m'est en revanche impossible d'initialiser la checkbox. Elle est toujours vide (false) lorsque que je retourne sur l'écran après l'avoir quitté (Et validé bien sur).
    Le code :

    JSP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:checkbox property="var"></html:checkbox>
    ActionForm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      private Boolean var; 
      public Boolean getVar() {
    	return var;
      }
      public void setVar(Boolean var) {
    	this.var = var;
      }
      public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {
    	var = false;
      }
    J'ai essayé dans la méthode reset() de donner à var la valeur stockée en session, mais dans ce cas la checkBox reste cochée en permanence à la validation du formulaire. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {
            HttpSession session = httpServletRequest.getSession();
            Boolean v = (Boolean) session.getAttribute("myVar");
    	var = v != null && v.booleanValue();
      }
    Je ne sais plus quel piste explorer... Toute aide serait la bienvenue.

    Merci

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    La problématique est récurrente et vient du fait qu'une checkbox non cochée ne renvoie rien.
    La piste est la bonne, même s'il existe des variations...
    Il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) 
    {
        Boolean v = (Boolean)request.getSession().getAttribute("myVar");
        var = (v != null) ? v.booleanValue() : false;
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut
    merci pour la réponse.

    J'avais essayé quelque chose dans le genre mais ça ne fonctionne pas (j'ai tester ta solution tout de même): La CB reste coché et renvoi toujours "true".
    Le problème semble venir du fait que le reset() est appelé avant mon action...

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut
    Aucune idée?
    Pas instinctive l'utilisation de cette checkbox...

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Je suppose que ta valeur en session n'est pas correctement modifiée...
    A la sortie du contrôleur, il faudrait toujours positionner la valeur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut
    C'est ce que je crois faire... mais j'arrive à douter de tout là...

    Méthode reset de mon actionForm:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {
        System.out.println("[ActionForm:reset / START] VAR (variable) = " + var);
     
        Boolean v = (Boolean) session.getAttribute(Constants.VAR);
        System.out.println("[ActionForm:reset] VAR (session) = " + session.getAttribute(Constants.VAR));
        this.setVar((v == null || !v) ? null : true);
        System.out.println("[ActionForm:reset / END] VAR (variable) = " + var);
      }
    Action :
    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
     
    public ActionForward execute(ActionMapping mapping,
                                   ActionForm actionForm,
                                   HttpServletRequest request,
                                   HttpServletResponse response) {
        PrefForm prefForm = (PrefForm) actionForm;
        //get the preferences and store them in  session
        HttpSession session = request.getSession();
        HashMap hs = new HashMap();
        System.out.println("[ACTION / START] VAR (from actionForm) = " + prefForm.getVar());
        hs.put(Constants.VAR, prefForm.getVar());
     
        for (Iterator iter = hs.keySet().iterator(); iter.hasNext(); ) {
          Object item = (Object) iter.next();
          session.setAttribute((String) item, hs.get(item) );
        }
        System.out.println("[ACTION / END] VAR (from session) = " + session.getAttribute(Constants.VAR));
        return new ActionForward();
      }
    Mes étapes de test:
    1 - Lorsque j'arrive sur mon écran, la checkbox n'est pas coché OK.
    2 - Je valide, elle reste décochée : OK.
    3 - Je la décoche, je valide. Elle est de nouveau cochée. Pas OK.

    Logs correspondants :
    étape 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [ActionForm:reset / START] VAR (variable) = null
    [ActionForm:reset] VAR (session) = null
    [ActionForm:reset / END] VAR (variable) = null
    [ACTION / START] VAR (from actionForm) = true
    [ACTION / END] VAR (from session) = true
    étape 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [ActionForm:reset / START] VAR (variable) = null
    [ActionForm:reset] VAR (session) = true
    [ActionForm:reset / END] VAR (variable) = true
    [ACTION / START] VAR (from actionForm) = true
    [ACTION / END] VAR (from session) = true
    Trois trucs que je ne comprend pas:
    1 - Pourquoi la méthode "reset()" de l'actionForm est appelée avant l'action?
    2 - Pourquoi dans l'étape 2, au niveau de l'action, var = true alors que dans l'actionForm, var = null?
    3 - Pourquoi ce comportement est différent dans l'étape 3?

    Il doit y avoir un truc que je fais mal mais je vois pas quoi.

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Dans ton code, je ne vois pas de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session.setAttribute(Constants.VAR, monBoolean)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut
    Je le fais via une hastable (qui a une autre fonction...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    hs.put(Constants.VAR, prefForm.getVar());
     
        for (Iterator iter = hs.keySet().iterator(); iter.hasNext(); ) {
          Object item = (Object) iter.next();
          session.setAttribute((String) item, hs.get(item) );
        }

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Tu peux montrer les getter/setter du formulaire ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut
    Voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            private Boolean var;
            public Boolean getVar() {
    	        return var;
    	}
            public Boolean isVar() {
    		return var;
    	}
    	public void setVar(Boolean var) {
    		this.var = var
    	}

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    J'ai du mal à comprendre cette séquence
    [ActionForm:reset / START] VAR (variable) = null
    [ActionForm:reset] VAR (session) = null
    [ActionForm:reset / END] VAR (variable) = null
    [ACTION / START] VAR (from actionForm) = true
    [ACTION / END] VAR (from session) = true
    Peux-tu montrer le code entier du formulaire ?

    Dans l'absolu, un boolean n'a que 2 états, je préfère l'affectation suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (v == null) ? false : v.booleanValue()
    mais bon, ce n'est pas le problème...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut
    Code de l'actionForm (J'ai essayé une autre notation, même problème):
    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
     
    public class PrefForm extends ActionForm {
     
      	private Boolean var;
     
      	public Boolean getVar() {
    	  return var;
    	}
      	public Boolean isVar() {
    		return var;
    	}
    	public void setVar(Boolean var) {
    		this.var = var;
    	}
     
    	public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {
    		System.out.println("[ActionForm:reset / START] VAR (variable) = " + var);
    	    HttpSession session = httpServletRequest.getSession();
     
    	    Boolean tl = (Boolean) session.getAttribute(Constants.PREFERENCE_TRIPLELANG_KEY);
    	    System.out.println("[ActionForm:reset] VAR (session) = " + session.getAttribute(org.wipo.romarin.Constants.PREFERENCE_TRIPLELANG_KEY));
    	    this.setVar((tl == null) ? false : tl.booleanValue());
    	    System.out.println("[ActionForm:reset / END] VAR (variable) = " + var);
    	}
     
    }

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut
    J'ai ajouté une trace dans le setter du formulaire.
    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
     
    public class PrefForm extends ActionForm {
      	private Boolean var;
      	public Boolean getVar() {
    	  return var;
    	}
      	public Boolean isVar() {
    		return var;
    	}
    	public void setVar(Boolean var) {
    		System.out.println("[ActionForm:SET / START] VAR (variable) = " + var);
    		this.var = var;
    	}
     
    	public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {
    		System.out.println("[ActionForm:reset / START] VAR (variable) = " + var);
    	    HttpSession session = httpServletRequest.getSession();
     
    	    Boolean tl = (Boolean) session.getAttribute(Constants.PREFERENCE_TRIPLELANG_KEY);
    	    System.out.println("[ActionForm:reset] VAR (session) = " + session.getAttribute(org.wipo.romarin.Constants.PREFERENCE_TRIPLELANG_KEY));
    	    this.setVar((tl == null) ? false : tl.booleanValue());
    	    System.out.println("[ActionForm:reset / END] VAR (variable) = " + var);
    	}
    }
    : résultat (pour les mêmes étapes qu'auparavant):
    étape 2 (validation apres cochage de la checkbox):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [ActionForm:reset / START] VAR (variable) = null
    [ActionForm:reset] VAR (session) = false
    [ActionForm:SET / START] VAR (variable) = false
    [ActionForm:reset / END] VAR (variable) = false
    [ActionForm:SET / START] VAR (variable) = true
    [ACTION / START] VAR (from actionForm) = true
    [ACTION / END] VAR (from session) = true
    3 (validation après décochage de la checkbox):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [ActionForm:reset / START] VAR (variable) = null
    [ActionForm:reset] VAR (session) = true
    [ActionForm:SET / START] VAR (variable) = true
    [ActionForm:reset / END] VAR (variable) = true
    [ACTION / START] VAR (from actionForm) = true
    [ACTION / END] VAR (from session) = true
    Concrètement, le setter n'est appelé à la validation du formulaire, que lorsque que je coche la checkbox (envoi "true"), dans l'autre cas (checkbox décochée), le setter n'est pas appelé, et la valeur reste celle affecté par la methode reset... Mais pourquoi?!

  14. #14
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Si là tu as mis le code complet, la séquence s'explique par le fait que ton request contient le paramètre avec une valeur "true".
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut
    dans le 1er cas le setter est appelé deux fois: Une fois par moi dans le reset, une fois par struts pour affecter la variable saisie. Dans le 2nd cas, struts n'affecte pas la variable saisie. Et paur cause, il n'appelle jamais la méthode setCheckBoxValue(false) : http://jmatrix.net/dao/case/case.jsp...100A671370A-71

  16. #16
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Oui, ça on est d'accord, le problème ne vient pas de struts, c'est html qui n'a pas prévu le cas. Pour bien faire, la syntaxe d'une checkbox devrait être du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <input type="checkbox" checkedValue="1" uncheckedValue="0" ...>
    mais ce n'est pas le cas et donc il faut faire avec ce qu'on a.

    La méthode reset(...) sert à ça, elle est appelée avant la phase "populate()" Ça ne pose pas de problème dans le cas d'un appel de la page contenant la balise <form> mais ne suffit pas lorsque, par exemple, une autre page demande l'affichage de la page... là...
    Il existe une méthode de contournement en ajoutant à la page un champ caché (nommé pour l'exemple methodName) avec comme valeur "validateMonForm" (pour l'exemple).
    On teste la valeur dans la méthode reset pour savoir s'il faut ou non mettre à "false" la valeur des checkbox.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void reset(...)
    {
       super.reset(...);
       if ("validateMonForm".equals(request.getParameter("methodName")))
       {
          monBoolean = false;
       }
     
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  17. #17
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut
    Effectivement, ça marche. Pas très instintif tout ça.
    Merci pour tes réponses.

    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [html:checkbox] initialisation et modification
    Par zybay dans le forum Struts 1
    Réponses: 7
    Dernier message: 12/06/2007, 12h00
  2. [DEBUTANT][STRUTS] Initialiser html:select
    Par mlequim dans le forum Struts 1
    Réponses: 13
    Dernier message: 25/10/2005, 14h59
  3. [struts][debutant]input checkbox vs html checkbox
    Par venegan dans le forum Struts 1
    Réponses: 2
    Dernier message: 19/08/2005, 16h23
  4. html:checkbox gache tout
    Par cbi1net dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 12/08/2005, 11h02
  5. Réponses: 4
    Dernier message: 29/07/2005, 11h47

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