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 :

action créant le formulaire de l'action suivante.


Sujet :

Struts 1 Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 17
    Points
    17
    Par défaut action créant le formulaire de l'action suivante.
    Bonjour,

    Je travaille sur un projet assez ancien, appliquant le framework struts.

    Dans ce projet, on créé des "fiches", puis on leur attache des "documents".
    Les actions "creerFiche" et "ajouterDocument" sont deux actions distinctes, avec des formulaires associés.

    On me demande de de pouvoir ajouter un document à la création de la fiche.

    Pour "simplifier" le travail, je souhaitais procéder ainsi :
    1. ajouter un champ "file" dans le formulaire de création de fiche
    2. dans l'action de création, si le champ "file" existe, appeler l'action "ajouterDocument"
    3. ajouter le document à la fiche qui vient d'être créée.


    Dans un premier temps, j'ai pensé ajouter un mapping qui renvoyait vers l'action "ajouterDocument" si il y avait un document, mais dans ce cas là, je ne vois pas comment renvoyer le formulaire d'ajout de document.

    J'ai donc essayé, dans l'action "creationFiche", d'appeler l'action "ajouterDocument", en lui passant le formulaire que je créais dans l'action "creationFiche".
    Il m'aurait ensuite suffit d'utiliser le fwd renvoyé par l'action "ajouterDocument" pour que ça fonctionne.

    Mais je n'arrive pas à renvoyer le fwd associé à l'action "ajouterDocument", le mapping étant celui de "creationFiche".

    J'ai l'impression de faire quelque chose d'absolument pas efficace, et j'aimerais votre avis sur ce point.

    Pour résumer, la question est : comment aller vers une action "2" ayant besoin d'un formulaire "2form", via une autre action "1" qui possede le formulaiire "1form" ?


    Merci d'avance pour votre aide

  2. #2
    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
    Si j'ai bien compris ton problème, dans le mapping de l'Action "creerFiche", tu peux mettre le scope du form-bean à session et ajouter un forward vers l'Action "ajouterDocument".

    Dans l'Action "ajouterDocument", tu récupères le form-bean de l'Action "creerFiche" présent dans le scope session via un session.getAttribute("nomDuFormBeanDeLActionCreerFiche").

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    en fait, je veux aller dans l'autre sens.

    en gros, en struts
    on surcharge la méthode execute(mapping, request, reponse, form)

    dans ma page creationFiche.jsp, j'ai un form creationForm.

    dans ma page ajoutDocument.jsp, j'ai un form documentForm.

    d'habitude, les deux pages sont séparées, les deux actions aussi.
    là, on me demande "d'intégrer" ajoutDocument.jsp à creationFiche.jsp.
    J'ajoute donc le champ "file" à creationForm.

    dans mon action creationFiche, je fais mon traitement, puis il faudrait que je créé le documentForm pour le passer à l'action ajoutDocument.

    Mon but, c'était de ne pas modifier du tout ajoutDocument, qui fonctionne bien parfaitement, et donc de modifier uniquement le struts-config, et la classe creationFiche.java

    Néanmoins, c'est trop le bazar, et je pourrais faire plus ou moins ce que tu m'as dit : dans la classe ajoutDocument, faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DocumentForm documentForm = null;
    if(form == null)
     documentForm = (DocumentForm) session.getAttribute("documentForm");
    else
     documentForm = (DocumentForm) form;
    et roulez jeunesse.


    Mais ce que je voulais essayer de faire, c'est, plus ou moins

    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
     
    		// Si ce champ n'est pas vide, il y a un fichier en pièce jointe.
     
    	if (creationform.getTheFile() != null
    			&& creationform.getTheFile().getFileName().length() > 0
    				&& creationform.getTheFile().getFileSize() != 0) {
     
     
    // création du documentForm tel qu'il doit être
    			DocumentForm formDoc = new DocumentForm();
    			formDoc.setTheFile(creationform.getTheFile());
    			formDoc.setId("" + idNewForm);
    			formDoc.setUser_id(user.getId() + "");
     
    // Création de l'action AjouterDocument
    			AjouterDocument doc = new AjouterDocument();
    			doc.setServlet(servlet);	
     
     
    // recupération du forward			
    			ActionForward fwd = doc.execute(mapping, formDoc, request, reponse);
    			if (fwd.getName().equals("success"))
    				return fwd;
     
    		}

  4. #4
    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
    Alors, dans ce cas, dans le mapping de l'Action "creerFiche", tu ajoutes le forward vers l'Action "ajouterDocument" :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <forward name="ajouterDocument" path="/ajouterDocument.do"/>

    Tu mets le form-bean documentForm dans le scope session dans l'Action "creerFiche" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	if (creationform.getTheFile() != null
    			&& creationform.getTheFile().getFileName().length() > 0
    				&& creationform.getTheFile().getFileSize() != 0) {
     
     
    // création du documentForm tel qu'il doit être
    			DocumentForm formDoc = new DocumentForm();
    			formDoc.setTheFile(creationform.getTheFile());
    			formDoc.setId("" + idNewForm);
    			formDoc.setUser_id(user.getId() + "");
    			session.setAttribute("documentForm",formDoc) ;
    			return mapping.findForward("ajouterDocument") ;
    }
    Tu mets le scope du form-bean documentForm à session dans le mapping de l'Action "ajouterDocument".
    Et dans l'Action "ajouterDocument", tu récupères le form-bean documentForm comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DocumentForm documentForm = (DocumentForm) form;

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    ah d'accord. en faisant ça, il va aller chercher l'objet documentForm.

    Je pensais bien que le formulaire était passé dans le request, mais je croyais qu'il était nommé "form".

    j'avais donc essayé "session.setAttribute("form",formDoc) ;" mais c'était pas efficace.

    Ta méthode est meilleure que la mienne, j'effectue les modifications et je valide.

    Ma bizarrerie fonctionnait, mais c'était loin d'être propre, et je plaignais d'avance celui qui tomberait dessus plus tard

    merci beaucoup.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    édit : oups, désolé, j'ai fait citer au lieu de modifier

    Hop là, je reviens à la charge, ça marche pas

    j'ai bien mis le formbean de documentForm dans le scope session (avec les vrais noms)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <form-bean name="DocsUploadForm"
    			type="com.teamlog.webost.form.upload.DocsUploadForm" scope="session" />
    j'ai bien envoyé en session le formulaire documentForm dans l'action creerFiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Création du forumlaire d'ajout de document
    			DocsUploadForm formDoc = new DocsUploadForm();
    			formDoc.setTheFile(creationform.getTheFile());
    			formDoc.setId("" + idNewForm);
    			formDoc.setUser_id(user.getId() + "");
    			mySession.removeAttribute("FormCreationForm");
    			mySession.setAttribute("DocsUploadForm",formDoc) ;
    			// Création de l'action, et exécution.
    			return mapping.findForward("ajouterDocument") ;

    j'ai bien récupéré le form comme marqué (je fais tout le temps comme ça).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Récupère les donnèes du formulaire
    		DocsUploadForm uploadform = (DocsUploadForm) form;
    Dans un premier temps, j'ai eu une erreur de validation dans la méthode validate de mon DocumentForm, la valeur "id" était nulle.
    Dans mon struts config, j'ai modifié l'action ajouterDocument, en retirant la validation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		<!-- Ajout/Suppression de document joint à une fiche    -->
    		<action path="/DocsUpload" name="DocsUploadForm"
    			type="com.teamlog.webost.action.upload.DocsUploadAction"
    			validate="false" >
    			<forward name="doc" path="/upload" />
     
    			<forward name="failure" path="/FormDetails.do?action=doc" />
    		</action>
    et là, l'erreur est passé dans la méthode execute de la classe DocsUploadAction, lors d'une action sur le champ "user_id" du formulaire.

    En gros, il y a bien un formulaire qui arrive, mais il n'est pas rempli.

  7. #7
    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
    Si ça ne fonctionne pas, cela veut dire que quelque part, le form-bean DocsUploadForm est mis dans le scope request.
    Si tu as plusieurs actions liées au form-bean DocsUploadForm, il faut mettre l'attribut scope="session" dans le mapping de toutes ces actions.

    Je n'ai jamais mis l'attribut scope="session" dans la balise form-bean. Je ne savais d'ailleurs pas qu'on pouvait le faire.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par c_nvy Voir le message
    Si ça ne fonctionne pas, cela veut dire que quelque part, le form-bean DocsUploadForm est mis dans le scope request.
    Si tu as plusieurs actions liées au form-bean DocsUploadForm, il faut mettre l'attribut scope="session" dans le mapping de toutes ces actions.

    Je n'ai jamais mis l'attribut scope="session" dans la balise form-bean. Je ne savais d'ailleurs pas qu'on pouvait le faire.
    oups, en effet, j'avais mal compris une phrase, je déplacerais ça. j'ai pas apporté mon boulot chez moi, donc j'en saurais plus Lundi.

    Effectivement, si il faut mettre le scope de tous les docsUploadForm à session, je ne l'ai peut être pas fait, mais je crois bien qu'il n'y a qu'un action qui utilise ce form.

    Je te tiens au courant. Merci en tout cas

  9. #9
    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
    Assure-toi aussi que tu n'initialises pas à blanc ou null les propriétés du formulaire dans la méthode reset de l'ActionForm DocsUploadForm.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par c_nvy Voir le message
    Assure-toi aussi que tu n'initialises pas à blanc ou null les propriétés du formulaire dans la méthode reset de l'ActionForm DocsUploadForm.
    voila la solution.
    J'ai remis les scope=session au bon endroit, et j'ai vérifié qu'en effet, le docsUpload n'était pas appelé par d'autres actions.

    ça ne fonctionnait toujours pas, donc j'ai viré les mises à null des propriétés du formulaire. Et ça fonctionne parfaitement.

    Par contre, ça ne risque pas de poser problème ? Je ne sais pas trop, car j'ai toujours reinitialisé mes champs à null ou autre, et ça me paraissait assez logique. J'ai donc un peu de mal à comprendre pourquoi dans ce cas, il faut supprimer la réinitialisation.

    édit : encore merci c-nvy, je marque le sujet comme résolu

  11. #11
    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 phoenix_stealer Voir le message
    Par contre, ça ne risque pas de poser problème ? Je ne sais pas trop, car j'ai toujours reinitialisé mes champs à null ou autre, et ça me paraissait assez logique. J'ai donc un peu de mal à comprendre pourquoi dans ce cas, il faut supprimer la réinitialisation.
    Tu instancies et tu initialises le formulaire DocsUploadForm dans l'Action creerFiche et ensuite tu fais un forward vers l'Action ajouterDocument qui est liée à ce form-bean. Au moment du forward, il va exécuter la méthode reset de DocsUploadForm avant d'exécuter l'Action. Si tu réinitialises tes champs dans cette méthode, tu perds l'initialisation que tu as faite dans creerFiche.
    Donc, dans la méthode reset de l'ActionForm, il ne faut pas réinitialiser les propriétés que tu as initialisé dans creerFiche.

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

Discussions similaires

  1. Changer action d'un formulaire suivant l'option
    Par fredaster31 dans le forum Langage
    Réponses: 2
    Dernier message: 31/12/2012, 15h58
  2. Récupérer l'attribut action d'un formulaire
    Par boubouh dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 04/02/2006, 15h19
  3. Changer l'action d'un formulaire en cliquant sur un radio
    Par yoyot dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 19/10/2005, 13h59
  4. [STRUTS] Problème Name+Action d'un Formulaire
    Par javaSudOuest dans le forum Struts 1
    Réponses: 6
    Dernier message: 23/09/2005, 17h28
  5. Action sur sous-formulaire filtré
    Par thevenix dans le forum IHM
    Réponses: 4
    Dernier message: 20/06/2005, 00h39

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