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 :

Initialisation ActionForm


Sujet :

Struts 1 Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 35
    Par défaut Initialisation ActionForm
    Bonjour,

    Dans mon application Struts, j'ai besoin d'un formulaire qui peut parfois être initialement vide MAIS d'autres fois initialisé avec des valeurs présentes dans un bean qui lui est alors présent dans la session. Mon formulaire est validé dans l'action Struts et peut revenir à la même page si une erreur se produit, via un redirect (mapping.getInput()). Actuellement j'utilise dans mes html:text, le paramètre value="${bean.property}" pour obtenir une valeur initiale si le bean est présent dans la session. LE PROBLEME, c'est que quand le bean n'est pas dans la session, ET si je rentre des données dans le formulaire ET que la validation me renvoi vers la page input à nouveau, je perds les données précédemment rentrées. Ceci est bien génant dans le cas d'un formulaire avec plusieurs champs. Pouvez vous me dire quelle est la démarche à suivre au nivea de mon ActionForm et de ma JSP (html:text...) pour que le formulaire soit correctement initialisé (si le bean est dans la session) sans pour autant écraser le valeurs rentrées si je reviens de l'Action, après validation, à la même page? J'espère que c'est assez clair!! Merci.

  2. #2
    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
    En principe, on définit deux Actions : une qui initialise le formulaire et une qui s'exécute au submit du formulaire :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <action path="/pathInitAction" type="nomdupackage.InitAction"
            name="nomDuFormBean" validate="false">
       <forward name="success" path="/page1.jsp"/>
    </action>
    <action path="/pathAction" type="nomdupackage.Action"
            name="nomDuFormBean" validate="true" input="/pathInitAction.do">
       <forward name="success" path="/page2.jsp"/>
    </action>
    et pour initialiser le formulaire dans l'Action qui s'exécute avant l'affichage du formulaire, on code ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TonActionForm tonActionForm=(TonActionForm) form ;
    tonActionForm.setChamp1(bean.getChamp1()) ;
    tonActionForm.setChamp2(bean.getChamp2()) ;
    Dans ce cas, on enlève l'attribut value des tags html:text.

    Et quand il y a une erreur de validation, on redirige vers l'Action d'initialisation du formulaire en codant input="/pathInitAction.do" dans le mapping de cette Action.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 35
    Par défaut
    Bonjour,

    Merci pour la réponse, que j'essayerai prochainement. Celà dit, je ne comprends pas comment on puisse récupérer le formulaire dans l'action d'initialisation avant même qu'il ne soit soumis?! (TonActionForm tonActionForm=(TonActionForm) form). Ma 2eme question est: est ce qu'en cas d'erreur et retour au formulaire, les éventuels changements dans le formulaire seront maintenues et vont bien remplacer, à l'affichage, les valeurs initiales du bean produites par la première action? Ma 3eme question est de savoir quel est le "life cycle" (création, initialisation (reset...), validation...destruction) d'un ActionForm Struts? Celà me permettrait de mieux cerner ce type de problèmes avec Struts.
    Merci beaucoup.

  4. #4
    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 hocdz Voir le message
    Celà dit, je ne comprends pas comment on puisse récupérer le formulaire dans l'action d'initialisation avant même qu'il ne soit soumis?! (TonActionForm tonActionForm=(TonActionForm) form).
    Tu peux récupérer l'ActionForm dans l'Action d'initialisation tout simplement parce que tu l'as référencé dans le mapping de l'Action via l'attribut name="nomDuFormBean".
    Dans ce cas, à l'appel de l'Action d'initialisation, l'instance de l'ActionForm est créée et la méthode reset et les setters sont appelés, tout ceci avant l'appel de la méthode execute de l'Action.
    Ceci explique pourquoi, dans la méthode execute, tu peux récupèrer l'instance de l'ActionForm via TonActionForm tonActionForm=(TonActionForm) form et initialiser chacune de ses propriétés avec les valeurs du bean via ses setters.

    Citation Envoyé par hocdz Voir le message
    Ma 2eme question est: est ce qu'en cas d'erreur et retour au formulaire, les éventuels changements dans le formulaire seront maintenues et vont bien remplacer, à l'affichage, les valeurs initiales du bean produites par la première action?
    Si tu veux conserver les valeurs saisies dans le formulaire en cas d'erreur de validation, contrairement à ce que j'ai dit, il ne faut pas spécifier l'Action d'initialisation dans l'attribut input mais plutôt la jsp qui affiche le formulaire.

    Au submit du formulaire, les setters de l'ActionForm étant appelés, tu devrais retrouver, au réaffichage du formulaire, les valeurs saisies, même en cas d'erreur de validation.

    Citation Envoyé par hocdz Voir le message
    Ma 3eme question est de savoir quel est le "life cycle" (création, initialisation (reset...), validation...destruction) d'un ActionForm Struts? Celà me permettrait de mieux cerner ce type de problèmes avec Struts.
    Merci beaucoup.
    Le cycle d'une ActionForm est la création d'une instance de l'ActionForm, l'appel de la méthode reset, l'appel des setters et si validate="true", l'appel de la méthode validate, et tout ceci, avant l'appel de la méthode execute de l'Action.

    Si par contre, un même form-bean est lié à plusieurs Actions et qu'il est stocké dans le scope session, l'instance de l'ActionForm est créée à l'appel de la première Action liée à ce form-bean et ensuite récupérée dans le scope session par les autres.
    Et contrairement à ce que beaucoup pensent, la méthode reset est systématiquement appelée, que le form-bean soit dans le scope request ou session.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 35
    Par défaut
    D'accord...donc pour résumer, je doit avoir deux actions utilisant le même ActionForm (initAction et Action), la première pour initialiser les champs du formulaire (si le bean est présent) et la deuxième pour traiter ce formulaire. En cas d'erreur de validation, le retour se fait à la même jsp (via input=majsp) et les dernières données rentrées seront ainsi maintenues. Je rajoute juste que dans mon cas je fais le validation dans l'action! (je ne sais pas si c'est une bonne ou mauvaise pratique?). Je reviens aussi au cycle de vie de l'ActionForm et pose une question sur le reset. Cette méthode est apparement d'initialisation aussi, mais je ne comprends pas bien son utilité et la manière dont on peut en tirer profit? Mon autre question concerne le scope du formulaire. Dans la documentation Struts, le scope par défaut et le request (je crois...?). Dans mon application, j'ai +ieurs liens qui ouvrent tous une nouvelle fenêtre avec le même formulaire en passant un paramètre différent à chaque fois. Quand je clique sur un deuxième lien (donc nouvelle requête), la fenêtre qui s'ouvre contient au départ les données saisies dans la fenêtre d'avant, alors que le formulaire n'est pas précisé avec scope=session, Est ce normal? Merci.

  6. #6
    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 hocdz Voir le message
    Je rajoute juste que dans mon cas je fais le validation dans l'action! (je ne sais pas si c'est une bonne ou mauvaise pratique?).
    Tout dépend quelle genre de validation tu fais dans l'Action.
    Par exemple, pour vérifier que les données saisies sont bien dans la forme attendue, comme par exemple vérifier qu'une valeur est bien saisie dans un champ ou bien encore que la valeur saisie ne doit pas dépasser tant de caractères, la bonne pratique est d'utiliser la méthode validate de l'ActionForm ou bien le Validator.
    Par contre, pour une validation métier, comme par exemple vérifier que l'identifiant saisi existe bien dans la base de données, on la fait généralement dans l'Action.
    Il y a aussi le cas des DispatchAction ou LookupDispatchAction où généralement, la validation n'est pas sensée être faite pour toutes les actions sur le formulaire. Dans ce cas, on met validate à false dans le mapping de l'Action et on fait appel à la méthode validate de l'ActionForm seulement dans la(ou les) méthode(s) de l'Action pour lesquelles la validation est justifiée.

    Citation Envoyé par hocdz Voir le message
    Je reviens aussi au cycle de vie de l'ActionForm et pose une question sur le reset. Cette méthode est apparement d'initialisation aussi, mais je ne comprends pas bien son utilité et la manière dont on peut en tirer profit?
    La méthode reset est utile par exemple dans le cas où tu souhaites réinitialiser certains champs, au réaffichage d'un formulaire stocké dans le scope session.

    Elle est également très utile dans le cas où il y a des checkbox dans un formulaire, parce qu'elle permet de forcer le décochage des checkbox, et donc de pallier au fait que, lorsqu'une checkbox est décochée, sa valeur n'est pas transmise au submit du formulaire.

    Citation Envoyé par hocdz Voir le message
    Mon autre question concerne le scope du formulaire. Dans la documentation Struts, le scope par défaut et le request (je crois...?). Dans mon application, j'ai +ieurs liens qui ouvrent tous une nouvelle fenêtre avec le même formulaire en passant un paramètre différent à chaque fois. Quand je clique sur un deuxième lien (donc nouvelle requête), la fenêtre qui s'ouvre contient au départ les données saisies dans la fenêtre d'avant, alors que le formulaire n'est pas précisé avec scope=session, Est ce normal? Merci.
    Et bien non, le scope par défaut d'un form-bean n'est pas request mais session, ce qui explique le comportement que tu observes.
    Si tu veux que le form-bean soit stocké dans le scope request, il faut ajouter l'attribut scope="request" dans le mapping de la (ou des) Action(s) concernée(s).

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

Discussions similaires

  1. [Servlet] Fichiers d'initialisation
    Par david71 dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 03/09/2003, 13h47
  2. Créer et initialiser un composant TStatusBar :help:
    Par James_ dans le forum C++Builder
    Réponses: 10
    Dernier message: 21/08/2003, 08h52
  3. [servlet] initialisation d'objets
    Par tiPouick dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 05/08/2003, 12h12
  4. Initialisation de XMLModule
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 10
    Dernier message: 01/04/2003, 10h08
  5. initialisation Directinput avec delphi
    Par Madmaxx dans le forum DirectX
    Réponses: 1
    Dernier message: 21/02/2003, 17h37

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