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 :

Accéder au datasource à partir d'une ActionForm


Sujet :

Struts 1 Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 161
    Par défaut Accéder au datasource à partir d'une ActionForm
    Bonjour,
    je voudrait afficher une liste d'éléments dans un formulaire, je veut donc dans mon bean ActionForm pouvoir récupérer cette liste dans ma base de données.

    Dans mon struts-config j'ai configuré mon datasource :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <data-sources>
         <data-source type="org.apache.commons.dbcp.BasicDataSource">
        <set-property property="driverClassName" value="" />
        <set-property property="url" value="" />
        <set-property property="username" value="" />
        <set-property property="password" value="" />
        <set-property property="defaultAutoCommit" value="false" />
        <set-property property="defaultReadOnly" value="false" />
        <set-property property="validationQuery" value="SELECT 1 FROM dual" />
      </data-source>
    j'arrive à acceder à ma base à partir d'une action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dataSource = getDataSource(request);
    Cependant à partir de mon ActionForm je n'est pas la variable request. Comment doit-je récupérer le dataSource dans l'ActionForm ?

    Merci pour vos réponses.

    PS : je sait que ce n'est pas conseillé de configurer le datasource dans struts et qu'il serait plus interessant de le faire à partir de TomCat mais on me demande des résultats rapidement donc même si c'est mal programmé, le client veut le resultat

  2. #2
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 57
    Par défaut
    Je pense que ce n'est pas dans ton ActionForm que tu dois appeler la datasource.

    C'est dans ta classe Action (celle déclarée dans <action-mapping> dans ton fichier struts-config.xml) qui va afficher ta page qui contiendra ton formulaire, c'est à ce moment là que tu fais appel à ta datasource

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class FormulaireAction extends Action {
     public ActionForward execute(ActionMapping mapping, ActionForm form,
     HttpServletRequest request, HttpServletResponse response) throws Exception {
     dataSource = getDataSource(request);
    /* tu remplis ensuite ton actionForm et tu pense a l'enregistrer dans la session */ 
    session.setAttribute("le_nom_de_ton_formulaire_que_tu_utilise_dans_ta_jsp",formulaire);
      }
    }
    Enfin bon au lieu de faire appel à ta datasource, je te conseillerai d'appeler une méthode de ta couche métier qui elle appelerait une méthode dans ta couche DAO, mais bon c'est plus un problème d'architecture après.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 161
    Par défaut
    Merci de ta réponse,

    J'ai essayé de faire ceci par l'action vu qu'apperement ca ne se fait pas dans l'ActionForm. Dans mes tutoriaux que j'ai lu, c'était mentionné que l'ActionForm devait accéder au données, c'est pour ca que je voulait le faire dans l'ActionForm. Et puis pour l'affichage ensuite ca aurait été plus facile.


    En ce qui concerne ton autre solution qui remplacerai le datasource, ca serai de faire par exemple une classe AccesDB qui gère l'accès à la base et ensuite mon ActionForm accéderai à la base à partir de cette classe ?

  4. #4
    Membre confirmé Avatar de zambizi
    Inscrit en
    Juin 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2007
    Messages : 109
    Par défaut
    tu peux aussi faire ça dans le l'ActionForm, avec la mèthode validate() elle a toujour le paramètre request!!

    et tu peur récuperer le datasource!

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Par défaut Accéder au datasource à partir d'un ActionForm
    Bonjour,

    Struts est un framework respectant le MVC2.
    Ce type d'architecture impose qu'une application soit divisée en 3 parties complètement autonomes et distinctes.

    C'est la raison pour laquelle les actionForm ne peuvent avoir un accès aux données

    Donc pour initialiser tes actionForms, tu dois créer des Struts actions qui vont aller chercher les données dans ta base de donnée (ou mieux, dans une autre couche dite DAO) et les ajouter dans ton ActionForm.

    Bonne continuation ;o)

    Eric.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 161
    Par défaut
    Citation Envoyé par g56589 Voir le message
    Donc pour initialiser tes actionForms, tu dois créer des Struts actions qui vont aller chercher les données dans ta base de donnée (ou mieux, dans une autre couche dite DAO) et les ajouter dans ton ActionForm.

    Le problème est de savoir comment ajouter les données que l'on a recupérer à partir de l'action dans l'ActionForm.
    Pour contourner ce problème, j'ai fait un accès au données dans une action, j'ai fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session.setAttribute("listedonnees", ListeDonnees);
    puis après je récupère dans la jsp cette variable.

  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
    Tu peux très bien initialiser le form-bean dans l'Action.
    Pour cela, il faut définir la propriété listeDonnees avec getter et setter dans l'ActionForm, référencer le form-bean correspondant dans le mapping de l'Action via l'attribut name et initialiser la collection dans l'Action via le setter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TonActionForm tonActionForm=(TonActionForm) form ;
    tonActionForm.setListeDonnees(listeDonnees) ;

  8. #8
    Membre confirmé
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    167
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 167
    Par défaut
    Tu faire cela en effet mais le plus "propre" est de faire un cast de ton form dans l'action. cf ci-après.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    public ActionForward edit(ActionMapping mapping, ActionForm actionForm,
    HttpServletRequest request, HttpServletResponse response)throws Exception {
    MonForm form = (MonForm) actionForm;
     
    ...
     
    form.setMaListe( liste);
    }

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Par défaut Accéder au datasource à partir d'un ActionForm
    Pour mettre des données dans le ou les ActionForm(s), car tu peux avoir besoin de plusieurs formulaires, tu exécutes le genre de code suivant depuis ta fonction qui manipule les données :

    Le code ci dessous récupère les annonces d'un utilisateur donné en paramètre.
    Pour chaque résultat, je crée un objet ActionForm et je vais ajouter le titre de l'annonce dans l'actionForm.
    Chaque actionForm (qui correspond à une annonce est référencé dans un ArrayList nommé "annonces"
    Utilisateur utilisateur = (Utilisateur) session.get(Utilisateur.class, new Integer(id));

    ArrayList annonces = new ArrayList();
    Iterator it = utilisateur.getAnnonces().iterator();
    while (it.hasNext()) {
    Annonce annonce = (Annonce) it.next();
    AnnonceForm annonceForm = new AnnonceForm();
    annonceForm.setTitre(annonce.getTitre());

    annonces.add(annonceForm);
    }

    return annonces;
    Et puis, depuis ma StrutsAction, je passe l'ArrayList en paramètre à ma JSP comme ceci :
    session.setAttribute("annonces", Modele.getUtilisateurAnnonces(u));
    Et dans ma JSP, j'affiche les annonces via un iterate comme ca :
    <logic:iterate name="annonces" id="annonce" type="tfe.AnnonceForm">
    <tr>
    <td><bean:write name="annonce" property="titre" filter="true"/></td>
    </tr>
    </logic:iterate>

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 161
    Par défaut
    Citation Envoyé par c_nvy Voir le message
    Tu peux très bien initialiser le form-bean dans l'Action.
    Pour cela, il faut définir la propriété listeDonnees avec getter et setter dans l'ActionForm, référencer le form-bean correspondant dans le mapping de l'Action via l'attribut name et initialiser la collection dans l'Action via le setter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TonActionForm tonActionForm=(TonActionForm) form ;
    tonActionForm.setListeDonnees(listeDonnees) ;

    J'ai tester ta solution, ca ne fonctionne pas, j'ai surrement du oublier quelquechose.
    Mon struts-config :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <action	path="/listeCommandes"
    				name="commandeForm"
    				type="ListeCommandesAction"
    				scope="request" >
    				<forward name="success" path="/choixCommande.jsp" />
    		</action>
    Mon action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ((ChoixCommandesForm) form).setCommandesList(commandesList) ;
    return (mapping.findForward("success"));
    Mon ActionForm : commandeForm (avec le getter et setter)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     /**
         * Liste des commandes proposées
         */
        private ArrayList<Commande> commandesList= new ArrayList<Commande>();

    Ma jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <logic:iterate id="commandesbean" name="commandesList">
        <bean:write name="commandesbean" property="nom"/>
    </logic:iterate>
    J'appèle a partir de l'url listeCommandes.do et j'obtiens :
    Cannot find bean: "commandesList" in any scope

    Alors qu'en mettant le session.set... dans mon action ca fonctionne bien sûr.

    Sinon la solution de jdvacheron est la même sauf avec un actionForward edit (que je ne connaissait pas), ca peut changer quelquechose ?

  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
    commandesList étant désormais une propriété du form-bean commandeForm, il faut modifier le logic:iterate comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <logic:iterate id="commandesbean" name="commandeForm" property="commandesList">
        <bean:write name="commandesbean" property="nom"/>
    </logic:iterate>

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 161
    Par défaut
    C'est bon ca marche bien maintenant.
    J'ai mon option qui ne marche plus egalement, je vais essayer de trouver la syntaxe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:options collection="commandesList" property="nom" labelProperty="nom">

  13. #13
    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
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:optionsCollection property="commandesList" value="nom" label="nom"/>

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 161
    Par défaut
    Encore merci , ca fonctionne.

  15. #15
    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
    De rien.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 161
    Par défaut
    J'ai encore un autre problème lié a ce changement...

    Je n'arrive pas a acceder a cette liste dans l'action qui est executé au submit de ma jsp.

    En fait je rempli ma liste dans listeCommandes.do ensuite jaffiche ma jsp, et après validation de la jsp mon action choixCommandes.do n'arrive pas a recupérer cette liste.

    Pourtant je peu récupérer d'autres éléments.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ((ChoixCommandesForm) form).getSelectedCommandes();
    ((ChoixCommandesForm) form).getCommandesList();
    La première instruction me renvoi les commandes selectionnés, la deuxième devrait me renvoyer la liste des commandes affichés dans le formulaire mais cela ne fonctionne pas. C'est une liste vide.

  17. #17
    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
    Dans le struts-config.xml, il faut mettre le scope à session dans le mapping de l'Action qui initialise le formulaire et dans celui de l'Action qui s'exécute au submit du formulaire.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 161
    Par défaut
    Ca venait bien de la, encore merci.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/05/2014, 13h48
  2. Comment accéder à plusieurs comptes à partir d'une seule interface
    Par phplover_2010 dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 21/07/2010, 11h57
  3. Accéder à un UIElement à partir d'une classe externe
    Par tom741 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 02/12/2009, 20h51
  4. Appel une méthode à partir d'une ActionForm
    Par barchoui dans le forum Struts 1
    Réponses: 7
    Dernier message: 28/12/2008, 21h03
  5. Réponses: 22
    Dernier message: 03/02/2005, 16h43

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