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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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 ;-)

+ 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