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] Identifier le submit cliqué dans l'ActionForm


Sujet :

Struts 1 Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut [Struts] Identifier le submit cliqué dans l'ActionForm
    Salut tout le monde,

    Voilà j'ai un problème sur un formulaire qui contient plusieurs submit qui on le même libellé, voici un exemple :

    <html:submit property="action" onclick="return verifEditLibFonction();"><bean:message key="btn.editLibelleFonction"/></html:submit>

    <html:submit property="action" onclick="return verifAddFonction();"><bean:message key="btn.addLibelleFonction"/></html:submit>
    considérons ces 2 submit dans la jsp, et ceci dans le ressourcesproperties :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    btn.editLibelleFonction=Appliquer
    btn.addLibelleFonction=Appliquer
    ce que je voudrais faire c'est une verif dans le validate() de l'ActionForm, mais le problème c'est que quelque soit le submit cliqué, ceci renverra la même valeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getParameter("action")
    à savoir ca retournera le String "Appliquer" mais ca me dira pas sur quel submit on a cliqué.

    Une solution serait de donner des libellés différents à chacuns de mes submit, mais j'ai 3 fois "Ajouter" et 3 fois "Appliquer" alors bon faut presque un dictionnaire des synonymes si je fais ca !

    merci bcp

  2. #2
    Membre éprouvé
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Points : 1 144
    Points
    1 144
    Par défaut
    Sinon tu peux utiliser javascript.

    Change ton input type="sumbit" en button et sur l'evenement onClick (ou autre ?) tu appelles une fonction javascript qui remplie une variable from (le bouton que tu as cliqué) et qui submit le formulaire.

    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function submitMonForm(from) { 
      var form = document.candidatureForm;
      form.action = 'tonAction.do';
     form.from = from;
      form.submit();
    }
    
    PS : je l'ecris a l'arrache, j'ai pas testé hein

    Edit : pas besoin de modifier le bouton submit, tu appelles ta fonction javascript dans le onsubmit de ton formulaire (l'attribut doit exister dans le tag du form) et tu n'es pas non plus obligé de modifier ton action non plus dans ton javascript.

    Par contre comme le dis Vanilla il faut ajouter la propriété from dans ton ActionForm ainsi que de le déclarer en hidden dans ta JSP

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    Je sais pas trop si c'est compatible avec le LookupDispatchAction que j'utilise, parce que le paramètre action doit prendre la valeur de la clé que je donne dans le html:submit...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    je peux aussi mettre un champ caché que je rempli avant le submit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html:submit property="action" onclick="return verifEditLibFonction();"><bean:message key="btn.editLibelleFonction"/></html:submit>
     
    <html:submit property="action" onclick="return verifAddFonction();"><bean:message key="btn.addLibelleFonction"/></html:submit>
    et dans chacune de mes fonctions javascript, une fois les vérifs faites, je place une valeur drapeau dans ce champ caché, puis je récupère ce champ avec un request.getParameter() non?

  5. #5
    Membre éprouvé
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Points : 1 144
    Points
    1 144
    Par défaut
    J'ai édité le message d'avant.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    ce que j'ai testé entre temps fonctionne, à savoir ca :

    mettre le hidden dans le form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:hidden property="origineSubmit"/>
    dans les fonctions javascript qui vérifient la saisie, j'ai ca avant de retourne true :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.forms[0].origineSubmit.value="ajouterFonction";
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.forms[0].origineSubmit.value="editerFonction";
    puis quand j'arrive dans l'ActionForm je teste comme cela dans le validate() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     // TRAITEMENT DES FONCTIONS/METIERs
            if (origineSubmit.equals("editerFonction")){
                System.out.println("éditer fonction");
                }
     
            if (origineSubmit.equals("ajouterFonction")){
                System.out.println("add fonction");            
            }
    voilà bon par contre pour éviter de zapper la mise en place du paramètre faut que je mette ma vérif sur chaque submit à la fois dans le onclick et le on keypress sinon si l'utilisateur tape entrée ca ne prend pas en compte l'origine du submit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     <html:submit property="action" onkeypress="return verifEditLibFonction();" onclick="return verifEditLibFonction();">
    <bean:message key="btn.editLibelleFonction"/>
    </html:submit>

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    je craque ca marche pas, si on valide avec entrée et qu'aucun submit n'a le focus, c'est le premier submit de la page qui est envoyé.

    si quelqu'un a un tuyaux il me sortirai une grosse épine du pied parce là j'ai plus d'idées !

  8. #8
    Membre éprouvé
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Points : 1 144
    Points
    1 144
    Par défaut
    Oui donc retour au début

    Utilises un input type="button" avec une methode onclick de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    <html:button onclick="taFonction('ici')"/>
    
    et dans ta fonction tu fais ce que j'ai dis plus haut.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    le problème c'est que je n'ai pas tout compris dans ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function submitMonForm(from) { 
      var form = document.candidatureForm;
      form.action = 'tonAction.do';
    form.from = from;
      form.submit();
    }
    ligne 1 : tu recupere le formulaire html dans form
    ligne 2 : tu place la valeur 'tonAction.do' dans un champ hidden
    ligne 3 : tu place l'origine de l'appel dans un autre champ hidden "from"
    et tu submit

    ce qui me dérange c'est ca : form.action = 'tonAction.do'; je vois pas trop quoi mettre sachant que moi derrière j'ai une Action de type LookupDispatchAction avec cette methode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    protected Map getKeyMethodMap() {
            Map map = new HashMap();
            map.put("btn.editLibelleFonction", "editLibelleFonction");
            map.put("btn.addLibelleFonction", "addLibelleFonction");
            return map;
        }
    qui fait la correspondance entre le submit cliqué et une methode propre à ce submit.

  10. #10
    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
    Essaie en remplaçant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    form.action = 'tonAction.do';
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    form.action = 'tonAction.do?action=Appliquer';

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    non c'est pas bon parce que j'ai plusieurs "Appliquer" dans ressourcesproperties, et l'Action attend une key...

    c'est la galère ce truc bizarre que ca ai pas été prévu dans Struts

  12. #12
    Expert éminent sénior


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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Bonjour,

    pour en revenir au problème de la touche entrée, tu as sans doute une action "par défaut". Pourquoi ne pas adapter le code suivant :

    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
    // handle an event generated when a user press "enter" from an input form element
    function handleReturnKeyPressed(evt) {
        // character code for the key which has been pressed
        var characterCode;
     
        if (evt.which) {
            characterCode = evt.which;
        } else if (evt.keyCode && evt.srcElement) {
            // IE specific
            characterCode = evt.keyCode;
        } else {
          // unhandled browser
          return true;
        }
     
        // ascii 13 is the character code for the 'return' key
        if (characterCode && characterCode == 13) {
          var actionElement = document.getElementById('defaultAction');
          if (actionElement) {
            actionElement.click();
          }
          return false;
        }
     
        return true;
    }
    par exemple sur une zone de saisie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     onkeypress="handleReturnKeyPressed(event);"

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    oui, j'y ai pensé, ca résoud le problème, mais il faut se mettre ca sur tous les champs du form et à la main.

    Sinon faudrait simplement mettre une fonction javascript qui intercepte toute touche entrée sur la page et qui l'annule, mais bon je trouvais pas ca très propre et surtout si le javascript est désactivé c'est foutu !

  14. #14
    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 vallica
    non c'est pas bon parce que j'ai plusieurs "Appliquer" dans ressourcesproperties, et l'Action attend une key...
    Je ne pense pas.
    Pour moi, la valeur du paramètre passée à l'Action est le nom de la méthode à exécuter, donc la valeur affectée à la clé dans le fichier properties, donc dans ton cas Appliquer.
    Avec en plus le champ hidden from que t'as proposé yolepro, ça devrait fonctionner.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    oui mais à ce moment là, vu que dans l'Action j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <div style="text-align: left;">protected Map getKeyMethodMap() {
            Map map = new HashMap();
            map.put("btn.editLibelleFonction", "editLibelleFonction");
            map.put("btn.addLibelleFonction", "addLibelleFonction");
            return map;
        }</div>
    je dois passer dans le paramètre action des valeurs du style "editLibelleFonction" ou "addLibelleFonction" qui sont les vrais noms des méthodes qu'il faudra executer, parce que si je passe "Appliquer" comment Struts va savoir de quel appliquer on parle?

  16. #16
    Expert éminent sénior


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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Citation Envoyé par vallica
    oui, j'y ai pensé, ca résoud le problème, mais il faut se mettre ca sur tous les champs du form et à la main.
    Tu peux toujours étendre les taglibs et l'ajouter

    Citation Envoyé par vallica
    Sinon faudrait simplement mettre une fonction javascript qui intercepte toute touche entrée sur la page et qui l'annule, mais bon je trouvais pas ca très propre et surtout si le javascript est désactivé c'est foutu !
    Sincèrement, ton appli elle fonctionne complètement si on désacrive le js ?

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    Sincèrement, ton appli elle fonctionne complètement si on désacrive le js ?
    j'en doute.... prévoir quelques exceptions

    mais c'est justement pour ca que je veux valider en second lieu avec le validate()

  18. #18
    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 vallica
    oui mais à ce moment là, vu que dans l'Action j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <div style="text-align: left;">protected Map getKeyMethodMap() {
            Map map = new HashMap();
            map.put("btn.editLibelleFonction", "editLibelleFonction");
            map.put("btn.addLibelleFonction", "addLibelleFonction");
            return map;
        }</div>
    je dois passer dans le paramètre action des valeurs du style "editLibelleFonction" ou "addLibelleFonction" qui sont les vrais noms des méthodes qu'il faudra executer, parce que si je passe "Appliquer" comment Struts va savoir de quel appliquer on parle?
    Effectivement, ce n'est pas Appliquer mais editLibelleFonction ou addLibelleFonction.
    Je croyais que Appliquer était le nom de ta méthode.
    As-tu fait un test ?

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    non je ne peux pas le faire ce soir mais je vais me débrouiller pour le faire demain.

    en attendant merci bcp pour votre aide, et je viendrais vous embeter d'ici peu je pense...

    passez une bonne soirée

  20. #20
    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 c_nvy
    Je ne pense pas.
    Pour moi, la valeur du paramètre passée à l'Action est le nom de la méthode à exécuter, donc la valeur affectée à la clé dans le fichier properties, donc dans ton cas Appliquer.
    Avec en plus le champ hidden from que t'as proposé yolepro, ça devrait fonctionner.
    En fait, je me suis trompée en disant que c'était la valeur affectée à la clé parce que dans mon cas, cette valeur est égale au nom de la méthode à exécuter, contrairement à toi.
    Par contre, il est vrai que la valeur du paramètre passée à l'action est le nom de la méthode.

    Il faut donc faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    form.action = 'tonAction.do?action=addLibelleFonction';
    Bonne soirée à toi aussi.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Struts] reset dans une ActionForm avec des int
    Par mariemor64 dans le forum Struts 1
    Réponses: 19
    Dernier message: 18/05/2006, 12h47
  2. [struts]validate dans chaque actionForm?
    Par questionneuse dans le forum Struts 1
    Réponses: 3
    Dernier message: 17/05/2006, 15h36
  3. [ Struts ] récupération des roles dans l'ActionForm
    Par rikunter dans le forum Struts 1
    Réponses: 3
    Dernier message: 21/04/2006, 10h07
  4. [struts][jsp] récupérer objet session dans ActionForm
    Par mlequim dans le forum Struts 1
    Réponses: 24
    Dernier message: 02/11/2005, 16h32
  5. Réponses: 2
    Dernier message: 26/05/2005, 12h11

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