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 :

Passer un formulaire d'une action à une autre


Sujet :

Struts 1 Java

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Par défaut Passer un formulaire d'une action à une autre
    Bonjour,
    Je ne sais pas si c'est possible, en tout cas, je n'y arrive pas... ;-)
    J'aimerai passer les données d'un formulaire mises à jour dans une action, dans une autre action... et récupérer dans cette action les données de ce formulaire.
    Voici un peu de code.
    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 MonForm extends ActionForm {
        private String id;
    }
     
    public class MonAction1 extends Action {
    	public ActionForward execute(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response)
    			throws Exception {
    		ActionForward forward = mapping.findForward("success");
    		MonForm f = (MonForm) form;
    		f.setId("toto");
    		return forward;
    	}
    }
     
     
    public class MonAction2 extends Action {
    	public ActionForward execute(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response)
    			throws Exception {
    		ActionForward forward = mapping.findForward("success");
    		MonForm f = (MonForm) form;
    		System.out.println(f.getId()); // je récupère "" et non "toto"
    		return forward;
    	}
    }
    Dans le fichier struts-config.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <struts-config>
    <!-- Beans de formulaire -->
    	<form-beans>
    		<form-bean name="MonForm" type="xxx.MonForm">
    		</form-bean>
    	</form-beans>
    <!-- Actions -->
    	<action name="MonForm" path="/action1" scope="request" type="xxx.MonAction1">
    		<forward name="success" path="/action2" />
    	</action>
    	<action name="MonForm" path="/action2" scope="request" type="xxx.MonAction2">
    		<forward name="success" path="/jsp/form.jsp" />
    	</action>
    </struts-config>
    J'aimerai garder cette structure d'une action qui appelle l'action....
    J'ai essayé avec le scope session, ça ne change rien...
    Avez-vous des idées?
    Cordialement
    Matthieu

  2. #2
    Membre expérimenté Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Par défaut



    Et si tu stockais les valeurs que tu veux récupérer dans une variable de session ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    request.getSession().setAttribute("NOM_VAR", monObjet) // -> sauvegarde ton objet en session
    MonObjet monObjet = (MonObjet) request.getSession().getAttribute("NOM_VAR") // pour récupère ton objet en session
    Tu stockes un objet, donc cela peut être n'importe quel objet de ton choix.

    Comme cela, tu te sers de cette variable pour passer d'un form à un autre en faisant une recopie des valeurs de champs avec la fonction clone() de l'objet.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Par défaut
    essaye ceci dans le struts config :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <!-- Actions -->
    	<action name="MonForm" path="/action1" scope="session" type="xxx.MonAction1">
    		<forward name="success" path="/action2" />
    	</action>
    	<action name="MonForm" path="/action2" scope="session" type="xxx.MonAction2">
    		<forward name="success" path="/jsp/form.jsp" />
    	</action>
    Pourquoi as tu mis des scope=request ? tu y es obligé ?

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Par défaut
    Citation Envoyé par AnneB Voir le message
    essaye ceci dans le struts config :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <!-- Actions -->
    	<action name="MonForm" path="/action1" scope="session" type="xxx.MonAction1">
    		<forward name="success" path="/action2" />
    	</action>
    	<action name="MonForm" path="/action2" scope="session" type="xxx.MonAction2">
    		<forward name="success" path="/jsp/form.jsp" />
    	</action>
    Pourquoi as tu mis des scope=request ? tu y es obligé ?
    j'avais déjà essayé en mettant le scope session, et ça ne fonctionnait pas non plus.
    Non, je ne suis pas obligé d'utiliser le scope Request, mais comme ce ne sont pas des données "persistantes" le long de la session, je ne vois pas l'intérêt de les garder pour un besoin technique.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Par défaut
    Et en faisant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session.setAttribute("MonForm", form);
    à la fin de l'action avant le forward vers l'action suivante, tu arriverais pas à qqch?
    (tout en gardant scope=session là ou je te l'ai indiqué bien sur!!!)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Par défaut
    Salut,

    bon, en fait la meilleure solution consiste à le mettre en attribut de requête, vu que tu es au sein d'une seule et même requête.


    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
    public class MonForm extends ActionForm {
        private String id;
    }
    
    public class MonAction1 extends Action {
        public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response)
                throws Exception {
            ActionForward forward = mapping.findForward("success");
            MonForm f = (MonForm) form;
            f.setId("toto");
            request.setAttribute("monForm",f);
            return forward;
        }
    }
    
    
    public class MonAction2 extends Action {
        public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response)
                throws Exception {
            ActionForward forward = mapping.findForward("success");
            MonForm f = (MonForm) request.getAttribute("monForm");
            System.out.println(f.getId()); // je récupère "" et non "toto"
            return forward;
        }
    }

  7. #7
    Expert confirmé

    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
    Par défaut
    A mon avis, tu initialises à "" la propriété id dans la méthode reset de l'ActionForm.
    Si c'est bien le cas, fais le test en mettant en commentaire cette initialisation.

    Si tu mets le form-bean en scope request, tu devrais bien récupérer toto avec le f.getId() dans Action2. Par contre, la requête étant terminée une fois passée dans cette Action, tu ne pourras afficher l'id dans la jsp car celui-ci sera null.
    Donc, si dans form.jsp, tu as besoin d'afficher l'id ou toute autre propriété du formulaire initialisée dans Action1, il faut obligatoirement mettre le scope="session".

    Petite remarque par rapport aux réponses précédentes : faire un setAttribute sur le form-bean n'a aucun intérêt, celui-ci étant mis automatiquement dans le scope précisé dans le mapping de l'Action dans le struts-config.xml.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Par défaut
    Désolé de contredire ce qui précède mais il me semble avoir déjà eu le problème et l'avoir résolu en recollant le formulaire dans la requête. A priori, sous réserve, lors du passage par struts_config.xml, struts réécrase le formulaire avec sa version initiale.

    Par ailleurs, si on est en struts 1.x, les formulaires étant poolés pour gagner en perfs, la méthode reset est nécessaire pour faire le ménage et ce n'est pas une bonne idée de supprimer le setId(""), a moins de vouloir lors d'une utilisation future avoir le champ initialisé avec n'importe quoi.
    En struts 2.x, aucun danger par contre je pense.
    Toutefois, à moins d'être explicite, l'appel à la méthode reset() est transparent et ne peut être la cause du dysfonctionnement.

    Enfin, le flux de requête ne se termine pas avec la fin de l'action mais à la fin du traitement côté serveur, c'est à dire après que la jsp a été générée et mis en flux response et heureusement parce que sinon, je ne vois pas bien comment on pourrait utiliser dans la jsp un formulaire avec un scope "request" par exemple.

    L'utilisation (sous eclipse) du debugger devrait permettre de rapidement identifier l'endroit où la valorisation se perd (on examine l'évolution de form et de f dans le temps et on voit si ça se valorise de manière identique).

  9. #9
    Expert confirmé

    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
    Par défaut
    Citation Envoyé par Iskendor Voir le message
    Enfin, le flux de requête ne se termine pas avec la fin de l'action mais à la fin du traitement côté serveur, c'est à dire après que la jsp a été générée et mis en flux response et heureusement parce que sinon, je ne vois pas bien comment on pourrait utiliser dans la jsp un formulaire avec un scope "request" par exemple.
    C'est vrai dans le cas d'une Action qui redirige vers une jsp mais pas dans le cas d'une Action qui redirige vers une autre Action qui ensuite redirige vers une jsp, soit le cas de mattheox.
    Il suffit de faire le test pour voir le résultat dans ce cas bien précis.

    Bon, sinon, où en es-tu mattheox ?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Par défaut
    Citation Envoyé par c_nvy Voir le message
    C'est vrai dans le cas d'une Action qui redirige vers une jsp mais pas dans le cas d'une Action qui redirige vers une autre Action qui ensuite redirige vers une jsp, soit le cas de mattheox.
    Il suffit de faire le test pour voir le résultat dans ce cas bien précis.

    Bon, sinon, où en es-tu mattheox ?
    Mode Troll : On
    Ben si, pareil...
    Ce n'est pas parce qu'on va lire le fichier Struts_config.xml pour trouver l'action suivante à appeler que le serveur crée un nouveau flux http.

    Que tu appelles directement la servlet struts au travers d'une nouvelle action ou que tu appelles une servlet "de type jsp", tu appelles une servlet, ça marche pareil quel que soit le nombre de findForward.

    Le flux requête n'est détruit que lorsque le serveur a répondu au client.

    Pour t'en convaincre crée deux actions et une jsp.

    Fait un request.setAttribute dans la première action et un request.getAttribute dans les deux autres objets. Tu verras que tu obtiens bien ton objet. Par conséquent, c'est bien la même requête.

    Mode Troll : Off

  11. #11
    Expert confirmé

    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
    Par défaut
    Citation Envoyé par Iskendor Voir le message
    Pour t'en convaincre crée deux actions et une jsp.
    En fait, j'avais fait le test avant de répondre à cette discussion et je peux t'assurer qu'avec le form-bean en scope request, le champ initialisé dans la première Action était bien renseigné dans la deuxième Action mais pas dans la jsp.

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Par défaut
    Citation Envoyé par c_nvy Voir le message
    Bon, sinon, où en es-tu mattheox ?
    A vrai dire, n'ayant pas de solutions qui me convenaient, j'ai fait autrement et je n'ai plus d'action qui redirige vers une autre action avec un formulaire "commun".

    Citation Envoyé par c_nvy
    En fait, j'avais fait le test avant de répondre à cette discussion et je peux t'assurer qu'avec le form-bean en scope request, le champ initialisé dans la première Action était bien renseigné dans la deuxième Action mais pas dans la jsp.
    j'obtenais le même résultat.

    Sur le principe, je ne souhaite pas mettre le scope "session" que je trouve "trop lourd" par rapport au scope "request".
    Je ne mets en session que les données qui persistent : l'utilisateur, ....

    Je trouve dommage d'être obligé de faire des request.setAttribute("monForm", monForm).... je pensais que Struts pouvait gérer ça tout seul.... c'était l'objet de mon post qui déchaîne les passions ;-)

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Par défaut
    Bon, je sais que t'as marqué le sujet comme résolu, mais j'ai peut-être une solution (à tester donc, ce que je n'ai pas le temps de faire en ce moment).

    A priori la doc struts indique au détour de ce que fait le contrôleur :

    2.3 ActionForm Beans
    .........

    If you declare such beans in your Struts configuration file (see Writing Action Mappings), the Struts controller servlet will automatically perform the following services for you, before invoking the appropriate Action method:

    ...
    * For every request parameter whose name corresponds to the name of a property in the bean, the corresponding setter method will be called. This operates in a manner similar to the standard JSP action <jsp:setProperty> when you use the asterisk wildcard to select all properties.
    ...



    Conclusion, à chaque passage par Struts-config, on ressette le formulaire avec les paramètres de requête.

    Donc, dès que la jsp de départ contient un tag avec ton champ Id, celui-co est écrasé lors du passage de l'action 1 à l'action 2.

    Et, c'est ballot, impossible avec la spec servlet 2.2 de faire un Request.removeParameter ou un request.setParameter.

    Donc, le seul moyen, a priori, mais non testé, est de ne pas référencer les champs que tu veux toucher dans la première jsp, pour qu'il ne soient pas settés automatiquement dans le formulaire à l'appel du execute de la servlet.

    Pour le débat, vu qu'on ne parle pas de la même chose (portée d'un Form-Bean vs portée d'une request), on va pas aller bien loin.

  14. #14
    Expert confirmé

    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
    Par défaut
    Alors, la semaine dernière, je me suis plantée lamentablement dans mes propos en confondant le cycle de vie d'une requête, pour lequel je suis tout à fait d'accord avec toi Iskendor, et le cycle de vie d'une ActionForm.

    Après ce long week-end très reposant, je pense être en mesure d'expliquer pourquoi le cas de mattheox ne fonctionne pas.

    Donc, avec un form-bean en scope="request", à l'appel de action1.do, voici ce qui se passe (pour simplifier, je considère que validate="false") :

    création d'une instance de MonForm
    appel de la méthode reset
    appel de la méthode execute de action1
    appel de la méthode setId
    forward action2.do
    appel de la méthode reset
    appel de la méthode execute de action2
    appel de la méthode getId => ici, getId renverra "toto" si et seulement si la propriété id n'est pas réinitialisée dans la méthode reset
    forward jsp

    Deux cas :

    1) Si dans la jsp, on affiche l'id en dehors d'un tag html:form, simplement via le tag suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <bean:write name="MonForm" property="id"/>
    alors :

    appel de la méthode getId => ici, toto s'affichera dans la jsp

    2) Si dans la jsp, l'affichage de la propriété id se fait à l'intérieur d'un tag html:form et que le form-bean associé à l'Action est toujours MonForm, alors :

    création d'une nouvelle instance de MonForm
    appel de la méthode reset
    appel de la méthode getId

    => ici, id ne sera plus égal à "toto" car une nouvelle instance de MonForm aura été créée.

    En résumé, en scope request, id aura pour valeur "toto" dans la jsp, si et seulement si la propriété id n'est pas initialisée dans la méthode reset de MonForm, et si l'affichage se fait en dehors d'un tag html:form.

    J'espère cette fois-ci avoir vu juste.
    Sinon, je laisse le soin à d'autres d'expliquer ce qui se passe.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Par défaut Peut-être comme ça...
    Ouuuh, ça me fait penser à un truc tout ce que tu dis là...

    Mattheox, t'as essayé de valoriser le paramètre d'input dans ton mapping d'action pour indiquer la source de tes données.

    <Action path="MonAction1....... input="MaJspSource" />
    <Action path="MonAction2....... input="MonAction1.do" />

    Je suis pas sûr mais il semble que ça se perde en chemin... Peut-être qu'en flèchant mieux, ça marche mieux...

  16. #16
    Expert confirmé

    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
    Par défaut
    Il est vrai que dans le mapping que mattheox a donné, il n'a pas mis l'attribut validate. Mais vu le nom des Actions, j'ai supposé que c'était un mapping exemple et qu'il avait volontairement codé seulement les attributs qu'il lui semblait intéressant pour la discussion.
    Normalement, si on met validate à "true" sans avoir codé d'attribut input, cela génère une erreur qui ne peut pas passer inaperçue.

  17. #17
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Par défaut
    effectivement, je n'ai pas mis les attributs "input" car je n'ai pas besoin de validation....

    j'ai bien compris pourquoi mon cas ne fonctionnait pas....
    mais pourqu'il fonctionne que faut-il faire?
    - mettre le scope session?
    - ne rien faire dans la méthode reset?
    - est-ce que ça change si je mets "validate" à true?

    merci pour vos interventions, j'apprends des choses.

  18. #18
    Expert confirmé

    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
    Par défaut
    Si tu n'as pas besoin de validation, je ne vois pas l'intérêt de mettre validate à true.
    As-tu fait des tests suite à nos différentes remarques ?

  19. #19
    Membre éclairé
    Inscrit en
    Novembre 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 69
    Par défaut
    Bonjour,

    Pour garder les données d'un actionForm d'une action a une autre tu dois mettre redirect="false" dans le forward qui te rederige vers la 2eme action

    <forward name=......... redirect="false" />

    Omar.

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

Discussions similaires

  1. Passer un paramètre d'une action à une autre
    Par mattheox dans le forum Struts 1
    Réponses: 3
    Dernier message: 14/01/2008, 10h54
  2. Passer un objet d'une action à une autre
    Par mattheox dans le forum Struts 1
    Réponses: 3
    Dernier message: 09/01/2008, 22h51
  3. Réponses: 4
    Dernier message: 20/06/2007, 17h34
  4. Réponses: 1
    Dernier message: 23/05/2006, 14h36
  5. [Struts]passer d'une action à l'autre en struts
    Par clement42 dans le forum Struts 1
    Réponses: 1
    Dernier message: 16/08/2005, 07h08

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