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] Remise à zéro d'une valeur String


Sujet :

Struts 1 Java

  1. #1
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut [Struts 1] Remise à zéro d'une valeur String
    Bonjour,

    Je travaille sur une application web sur laquelle j'ai un comportement problématique.
    J'ai une page pour modifier une entité.
    Sur cette page selon les droits de l'utilisateur connecté on affiche ou non les éléments qui sont modifiables par lui.
    On utilise un objet Form pour stocker toutes ces données (le scope au niveau Struts est session).
    J'ai un problème sur certains champs lorsque ceux ci ne sont pas repris dans la page.
    Si je tente de faire un affichage de la valeur de mon champ sur ma page, elle a bien la bonne valeur, en revanche lorsque je soumet le formulaire, cette valeur est automatiquement remise à zéro.
    Lorsque la donnée est présente dans un input pas de problème.
    C'est étrange ça ne me le fait que sur certaines données de types string qui sont gérées par des checkbox.

    L'action struts est tout ce qu'il y a de plus classique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <action  path="/modifierPersonnel"
    	    	 type="package.ModifierPersonnelAction"
    	   	 name="personnelForm"
    	    	 scope="session"
    	    	 input=".modifier.personnel" 
    	    	 validate="false">
    	    	 <forward name="success" path=".afficher.personnel"/>
    	    	 <forward name="error" path=".modifier.personnel"/>	        
    </action>
    Je ne sais pas si quelqu'un a des idées mais je suis preneur, je peux donner plus d'informations au besoin, mais au vu du problème le code ne me semble pas très révélateur.
    Linio

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Points : 49
    Points
    49
    Par défaut
    Bonjour,

    Je ne serais rependre à ta problématique pour le moment, (si tu pouvais poster ClassAction, ActionForm, peut être on pourra voir plus clair), MAIS:

    Ce que je peux te conseiller :
    • il n'est pas tres safe d'envoyer une entité entière avec tous les paramètres et ensuite gérer les droit au niveau de l'affichage, si tu veux suivre réellement le modèle MVC, tu dois éffectuer ce contrôle au niveau de ton controlleur et du coup creer un filtre sur ton entité et envoyer que les données autorisé a cette utilisateur (Dans un modèle MVC: pour la sélection on peut (mais c'est pas recommandé) faire comuniquer la VUE au MODELE, mais jamais en édition)
    • Si les données de ton entité sont à afficher dans une seul page pourquoi t'as mis comme scope la session ?

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 91
    Points : 80
    Points
    80
    Par défaut
    Il faut toujours faire attention lorsqu'on utilise un scope session et que le formulaire possède des checkbox. ça m'a l'air d'être ton cas .

    En général, ce qu'il se passe :

    1. Tu envois le formulaire avec la checkbox coché => appel du setter et mise en place de l'actionForm dans la session

    2. Tu ré-envois le formulaire avec le checkbox vide => récupération de l'actionForm de la session et .... rien de plus, le checkbox vide n'est pas passé en paramètre ! Donc ton actionForm possèdera toujours l'ancienne valeur, le comportement n'aura pas été changé.

    En général, ce qu'il faut faire c'est un override de la méthode reset(ActionMapping mapping, HttpServletRequest request) dans ton actionForm, et là dedans tu réinitialise tes checkbox.


    Cf la doc de la méthode reset :
    /**
    * <p>Can be used to reset bean properties to their default state, as
    * needed. This method is called before the properties are repopulated by
    * the controller.</p>
    *
    * <p>The default implementation does nothing. In practice, the only
    * properties that need to be reset are those which represent checkboxes
    * on a session-scoped form. Otherwise, properties can be given initial
    * values where the field is declared. </p>
    *
    * <p>If the form is stored in session-scope so that values can be
    * collected over multiple requests (a "wizard"), you must be very careful
    * of which properties, if any, are reset. As mentioned, session-scope
    * checkboxes must be reset to false for any page where this property is
    * set. This is because the client does not submit a checkbox value when
    * it is clear (false). If a session-scoped checkbox is not proactively
    * reset, it can never be set to false.</p>
    *
    * <p>This method is <strong>not</strong> the appropriate place to
    * initialize form value for an "update" type page (this should be done in
    * a setup Action). You mainly need to worry about setting checkbox values
    * to false; most of the time you can leave this method unimplemented.
    * </p>
    *
    * @param mapping The mapping used to select this instance
    * @param request The servlet request we are processing
    */

  4. #4
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut
    Ouh la la, mais si c'était moi qui avait ne serait-ce qu'écrit une ligne de ce truc, je me serai déjà fait harakiri. J'ai déjà les yeux qui saignent rien qu'à essayer de comprendre comment (pourquoi??) ils ont fait ça comme ça...

    @aboussaidi

    Je ne peux donc pas suivre un quelconque modèle, et quand bien même je voudrais le faire "à partir de maintenant" ça serait impossible, j'ai du ldapElement dans mes jsp c'est dire si le modèle MVC est oublié depuis longtemps.

    Idem pour la session, c'est un truc qui a été décidé à la création de l'appli (là aussi pour des raisons qui me dépassent) et maintenant on paye les pots cassés, parce qu'encore là ça fonctionne vaguement mais ça donne des comportements plus qu'aléatoires sur certaines autres pages (du genre si je vais sur une page et que je reviens en arrière oulala magique j'ai les droits en édition)

    @fardon57

    En fait ce n'est justement pas exactement un problème de checkbox puisque là j'avais bel et bien vu que Struts ne le gérait pas très bien, en fait les checkbox ne sont affichée (et leur valeur envoyée dans la requête) que dans le cadre où l'utilisateur aurait le droit de modifier cette valeur, dans mon cas à l'inverse on n'affiche rien, et aucune valeur n'est envoyée dans la requête, je m'attends donc (mais c'est là finalement qu'est le coeur de ma question : ai-je bien compris le fonctionnement de Struts??) à avoir la donnée non modifiée dans mon formulaire.

    J'ai surchargé la méthode reset mais il ne passe apparemment pas dedans, est-ce que Struts appelle cette méthode à chaque chargement d'action?

    En gros ce que je ne comprends pas c'est que j'ai un objet personnelForm qui est en scope session et lorsque je clique sur le lien pour activer l'action de modification l'objet personnelForm a vu une partie de ses valeurs "disparaitre", or le scope est bien session, et pire, d'autres valeurs qui ne sont pas non plus passées par la requêtes sont elles en revanche bien là où elles devraient être.
    Linio

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    En l'occurrence, regarde le code de l'ActionForm associée à ton action, tu dois avoir une méthode reset(...) qui initialise les valeurs des checkbox.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Citation Envoyé par Linio Voir le message
    J'ai surchargé la méthode reset mais il ne passe apparemment pas dedans, est-ce que Struts appelle cette méthode à chaque chargement d'action?

    En gros ce que je ne comprends pas c'est que j'ai un objet personnelForm qui est en scope session et lorsque je clique sur le lien pour activer l'action de modification l'objet personnelForm a vu une partie de ses valeurs "disparaitre", or le scope est bien session, et pire, d'autres valeurs qui ne sont pas non plus passées par la requêtes sont elles en revanche bien là où elles devraient être.
    Un clic sur un lien ne soumet pas le formulaire, ce qui explique pourquoi la méthode reset n'est pas exécutée et pourquoi les valeurs que tu as modifié dans le formulaire sont perdues.

    Pour y remédier, lors du clic sur le lien, il faut déclencher une fonction Javascript dans laquelle tu références l'Action et tu soumets le formulaire.

    Quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function modifAction()
    {
      document.forms[0].action="modifAction.do";
      document.forms[0].submit() ;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:link href="javascript:modifAction();">Modification</html:link>
    Modératrice Java - Struts, Servlets/JSP, ...

Discussions similaires

  1. Remise à zéro d'une commande
    Par Clint Southwood dans le forum LabVIEW
    Réponses: 2
    Dernier message: 13/12/2007, 18h24
  2. Réponses: 11
    Dernier message: 30/10/2007, 09h35
  3. Renvoyer une valeur (String).
    Par PiXi-PiX dans le forum Langage
    Réponses: 4
    Dernier message: 20/07/2007, 14h09
  4. JButton en fonction d'une valeur String
    Par henry.schmitt dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 04/09/2006, 00h46
  5. récupérer une valeur String, est-ce correct.
    Par LESOLEIL dans le forum Langage
    Réponses: 2
    Dernier message: 06/04/2006, 10h56

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