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

Tomcat et TomEE Java Discussion :

[Struts][Pool SGBD Tomcat]LookUp Datasource


Sujet :

Tomcat et TomEE Java

  1. #1
    Membre régulier Avatar de ultracoxy
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 116
    Points : 74
    Points
    74
    Par défaut [Struts][Pool SGBD Tomcat]LookUp Datasource
    Développeurs, Développeuses, bonjour !

    Je suis actuellement stagiaire.

    J'utilise Struts, Tomcat et MySQL dans mon appli et je veux mettre en place un pool de connexion par Tomcat.

    J'ai bien suivi les tutos en ce qui concerne les fichiers nécessaires et les paramétrages dans les fichiers xml.

    Seulement, je ne sais pas où récupérer ma datasource sachant que j'ai plusieurs servlets. Dois-je réaliser, une unique fois, ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Context initCtx = new InitialContext();
     Context envCtx = (Context)initCtx.lookup("java:comp/env");
     Datasource ds = (Datasource)envCtx.lookup("jdbc/MaDatasource");
     Connection conn;
     if(ds instanceof ConnectionPoolDataSource){
        ConnectionPooledDatasource poolDS = (ConnectionPoolDataSource)ds;
        PooledConnection pc = poolDS.getPooledConnection();
        conn = pc.getConnection();
     }else{
        conn = ds.getConnection();
    Ou bien dois je mettre ce bout de code dans chaque servlet ?

    Si je dois l'exécuter une seule fois, j'ai penser à utiliser un singleton.

    Pourriez vous éclairer mes esprits ? Je cherche à faire le plus propre et générique possible, afin de respecter le pattern MVC de Struts.

    Merci d'avance !

  2. #2
    Membre régulier Avatar de ultracoxy
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 116
    Points : 74
    Points
    74
    Par défaut
    Re bonjour,

    Ne me dites pas qu'aucun de vous ne s'est jamais servi des datasources ? Comment avez vous écrits vos programmes ? Me conseillez vous d'utiliser le pattern de DAO ? Comment et où récupérez vous votre datasource jndi ?

    Help !

  3. #3
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Points : 737
    Points
    737
    Par défaut
    L'utilisation du pattern DAO est en effet une bonne iddée. La séparation des couches étant la base de toute bonne programmation J2EE.

    Sinon, je te conseil d'externaliser la création de ta connection dans une classe helper (qui peut être un singleton). Derrrière celà, il y a aussi la question de quand ouvrire ou fermer les connexion (donc faut-il le faire dans toutes les servelt). Les avis sont partagé :
    - connection persistante : commune à toutes les servelt, ouverte en début d'application, fermée en fin
    - connection courte : ouverte avant chaque utilisation, fermé aprés chaque.
    - connection de la durrée de la request : stockée dans une variable ThreadLocale, elle est ouverte en début de requête HTTP et fermé en fin de requête (par exemple dans la servelt de strust ou le request processor de tiles) - parfois compliqué à mettre en place.

    Mon avis est qu'en contexte web, il faut mieux ne pas laisser de connexion ouverte trop longtemps, donc une solution avec des connexion courte ou des connexions de la durrée de la request sont à privilégié.

    Tu peut aussi jetter un coup d'oeil du coté des commons-dbutils de jakarta qui donne des outils pour manipuler facilement les connexions.

  4. #4
    Membre régulier Avatar de ultracoxy
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 116
    Points : 74
    Points
    74
    Par défaut
    Merci des infos. J'ai vu un post qui propose de faire une classe de type Singleton sur cette page http://www.developpez.net/forums/arc.../t-100999.html
    Mais je ne comprends pas bien ce que cela implique. La connexion est ouverte en permanence dans ce cas ou non ? Si la datasource a été récupérée par une servlet, une autre servlet peut elle en récupérer une autre instance en même temps ?

    Pour ma part, vu que j'aurai pas mal de requêtes à traiter, je souhaiterais mettre en place des connexions courtes par une méthode pas trop trop compliquée dans un premier temps. Vu que je débute en Struts, je m'embrouille sur l'oganisation MVC. Comment puis-je utiliser des connexions courtes ? Je dois rechercher le context JNDI et le datasource à chaque fois que je veux me connecter à ma BDD ? Est ce que je peux utiliser la méthode décrite dans le post dans j'ai mis l'url plus haut ?

    Thanks

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    Salut,


    J'utilise aussi les pool de connexion Tomcat vers une db mysql.

    Ce que j'ai fait c'est que pour chaque table de ma base, j'ai une classe "nomDeLaTableDAO" dans laquelle j'ai des méthodes basiques du style "ajouterObjet()", "obtenirListeSelonCode(int code)" etc...

    et c'est donc dans le constructeur de cette classe je récupère la connexion via le lookup, puis dans chaque méthode je récupère la connexion, je l'ouvre et je la ferme dans le finally().

    Au final, dans mes actions struts, lorsque j'ai besoin d'aller en bdd je fais ca :

    ArrayList laListe = new tableDAO().getAllObjets();

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    voici du code pour être plus clair :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
     
    public class AdminDAO {
        private DataSource ds;
        Connection con=null;
        Statement s=null;
        ResultSet rs=null;
     
        /** Creates a new instance of AdminDAO */
        public AdminDAO() {
            //récupération de la source de donnée
            try{
                Context initCtx = new InitialContext();
                ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/connGesam");            
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
    /**
         * Retourne l'AdminBean correspondant au login passé en param ou null si le login est erronné.
         *
         */
        public synchronized AdminBean getAdmin(String login) {
     
            try {
                //récupération de la Connection depuis le DataSource
                con = ds.getConnection();
                rs=null;
                s = con.createStatement();
                rs = s.executeQuery("SELECT * FROM admins where login LIKE '"+login+"'");
     
                if (rs!=null && rs.next()){                
                    return (new AdminBean(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4),rs.getString(5)));
                } else
                    return null;
     
            } catch (Exception ex) {
                ex.printStackTrace();
                return null;
            }finally {
                if (rs != null) {
                    try {
                        rs.close();
                    } catch (SQLException e) {}
                    rs = null;
                }
                if (s != null) {
                    try {
                        s.close();
                    } catch (SQLException e) {}
                    s = null;
                }
                if (con != null) {
                    try {
                        con.close();
                    } catch (SQLException e) {}
                    con = null;
                }
            }
        }
    Tu remarquera que j'ai mis les méthodes en synchronized.
    Au début je me suis dit tiens comme ca au moins il n'y aura pas d'accès concurrent, mais je pense que c'est faux car effectivement il ne peux pas y avoir d'accès concurent sur la même instance de ma classe AdminDAO, par contre si je crée simultanément plusieurs AdminDAO, je peux appeller ces méthodes simultanément...

    dites le moi si je me trompe

  7. #7
    Membre régulier Avatar de ultracoxy
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 116
    Points : 74
    Points
    74
    Par défaut
    Je ne crois pas que tu te trompes, du moins à mon niveau de connaissance. J'ai commencé à suivre une logique similaire avec des classes user, userBean et userDAO.

    Du coup, il suffirait d'instancier un objet userDAO dans chacune des servlets en ayant besoin...et d'ouvrir/fermer une connexion juste le temps d'effectuer une requête ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    l'ouverture/fermeture se faisant dans chaque méthode oui.

    Mais je ne sais pas si c'est top, il faudrais un avis plus expérimenté.

    Mon appli tourne sur intranet avec 2 ou 3 connexions simultanées, donc je ne peux pas savoir si c'est très optimisé...

  9. #9
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Bonjour,

    En JDBC pur, pour bien respecter la décomposition en couches, l'idéal serait d'avoir :

    - 1 couche contrôleur (qui appelle un et un seul service, par exemple updatePersonne() )
    - 1 couche service (qui regroupe un ou plusieurs appels à la couche DAO le tout dans une transaction, par exemple updatePersonne() et updateAdresse() )
    - 1 couche DAO (qui procède à des mises à jour atomiques)

    Le contrôleur ne devrait dans la mesure du possible ne jamais manipuler de datasource/connexion.
    Le Design Pattern ThreadLocal est relativement à la mode pour une manipulation transparente de la connexion.

    Eric

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    C'est bien ce que je fais, par exemple pour une personne persistée en bdd, j'ai une classe PersonneBean qui porte bien son nom, puis PersonneDAO qui offre les opérations atomiques, et pour finir PersonneMetier qui offre des services plus poussés regroupants comme tu le dis un ou plusieurs appels aux classes DAO et du traitement Java si besoin est.

  11. #11
    Membre régulier Avatar de ultracoxy
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 116
    Points : 74
    Points
    74
    Par défaut
    Ca s'éclaircit un peu plus à mes yeux, je vais essayer de mettre ça en place. Par contre, je me pose une question. Dans mon application, il n'y a pas, dans certains cas, de partie vue. Une application java "se connecte" à mon appli web (de manière transparente pour l'utilisateur de l'application) et me fournit les login/password de son utilisateur directement dans la requête http, pour que je l'identifie. Dans une seconde partie, l'utilisateur pourra se connecter à mon appli web et s'identifier à travers un formulaire. Dois je alors créer un Bean UserBean unique pour ces deux parties de mon application ou alors avez d'autres suggestions ?

    Merci de votre patience !

  12. #12
    Membre régulier Avatar de ultracoxy
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 116
    Points : 74
    Points
    74
    Par défaut
    Juste une dernière chose avant de fermer ce topic ... Savez vous où je peux trouver des exemples d'applications mettant en oeuvre struts avec une couche de DAO ? J'en ai trouvé un qui ne me satisfait que peu.

    Merci par avance ...

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    pas à ma connaissance, le seul truc que je peux te dire c'est appelle tes classes DAO dans tes Action ou mieux passe par des classes metiers qui appellent des classes DAO.

    C'est la seule chose à savoir à mon sens pour bien developper en MVC avec Struts.

    Ton Action c'est le C de MVC (controleur) et ta classe DAO ou ta classe metier fait partie du M (modèle). après le controleur forward ou redirige vers une vue (jsp par exemple), c'est le V de MVC.

  14. #14
    Membre régulier Avatar de ultracoxy
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 116
    Points : 74
    Points
    74
    Par défaut
    Pour le moment, j'ai créé mes classes : User, UserBean(héritant de ActionForm), UserDAO (avec des méthodes eécutant les requêtes sql nécessaires) et UserService (qui appelle les méthodes de UserDAO). Dans mon action, j'exécute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public ActionForward execute(ActionMapping mapping, ActionForm  form,
                HttpServletRequest request, HttpServletResponse response)
                throws Exception {
            boolean regOk;
            UserService service = new UserService();
            UserBean userBean = (UserBean) form;
            User user = new User();
            BeanUtils.copyProperties(user, userBean);
            regOk = service.addNewUser(user);
            //request.setAttribute("user",user);        
            return mapping.findForward(SUCCESS);        
        }
    Cela est il correct ?

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    si j'ai bien compris un user proviens d'un tuple en base de données et si c'est bien ca, moi je n'appelle pas mes actionform de cette manière.

    Pour moi un UserBean c'est une classe Java qui va représenter l'objet que tu as en bdd soit une classe avec tous les champs dont tu as envie (nom,prenom,etc..) et les getters/setters correspondant à la norme javabean c'est à dire pour l'attribut "private String nom;" tu auras getNom() et setNom()
    Cette classe n'hérite de rien pour le moment, par contre elle doit implémenter serializable car je pense que tu va passer des objets de ce type en session à un moment ou un autre.

    Ensuite concernant tes actionform, à mon sens leur nom doivent etre représentatifs du style tu as une page jsp qui contient un formulaire d'ajout d'un nouvel user, tu l'appelles ajoutUser.jsp puis l'actionform correspondant tu l'appelle AjoutUserForm.java et l'action AjoutUserAction.java par exemple.
    Si tu as besoin d'une action pour préremplir ton formulaire jsp tu peux créer une action AjoutUserBuilder.java par exemple.

    tout ceci c'est juste ma méthode, j'ai pris des conseils à gauche à droite, et j'ai arrangé tout ca à ma sauce bien evidemment.

    Seb

  16. #16
    Membre régulier Avatar de ultracoxy
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 116
    Points : 74
    Points
    74
    Par défaut
    En fait, j'ai une page registerUser.jsp avec l'ActionForm correspondant UserForm.java et l'Action registerUser.java.

    La classe user.java (implements Serializable) a les même caractétistiques que mon ActionForm, i.e. les getters et setters nécéssaires, seulement ma classe user.java me permet de décrire ce qu'est un utilisateur et de passer un objet directement entre mes classes (UserService.java puis UserDAO.java) et non pas un ensemble de varialbes : login, mot de passe, etc...J'ai trouvé dans deux articles la création d'un ActionForm et d'un objet Serializable identique en contenu.

    Par contre, je pensais ne devoir faire qu'un seul ActionForm UserForm.java qui puisse aussi bien correspondre à ma page registerUser.java ou bien loginUser.java.

    Voilà mon code pour éclaircir mon propos :

    Ma classe registerUser.jsp :
    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
    28
    29
    30
    31
     
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title><bean:message key="title.user.regiterUserForm"/></title>
        </head>
        <body>
            <h1><bean:message key="title.user.regiterUserForm"/></h1>    
            <html:form action="registerUser">
                <table>
                    <tr>
                        <td ><bean:message key="field.firstname"/></td>
                        <td><html:text property="firstname"/></td>
                    </tr>
                    <tr>
                        <td><bean:message key="field.lastname"/></td>
                        <td><html:text property="lastname"/></td>
                    </tr>
                    <tr>
                        <td><bean:message key="field.phone"/></td>
                        <td><html:text property="phone"/></td>
                    </tr>
                    <tr>
                        <td><bean:message key="field.email"/></td>
                        <td><html:text property="email"/></td>
                    </tr>
                </table>
                <html:submit><bean:message key="button.submit"/></html:submit>   
            </html:form>
        </body>
    </html>
    Ma classe registerUserAction.java :
    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
     
    public class registerUserAction extends Action {
     
        private final static String SUCCESS = "success";
     
        public ActionForward execute(ActionMapping mapping, ActionForm  form,
                HttpServletRequest request, HttpServletResponse response)
                throws Exception {
            boolean regOk;
            UserService service = new UserService();
            UserForm userForm = (UserForm) form;
            User user = new User();
            BeanUtils.copyProperties(user, userForm);
            regOk = service.addNewUser(user);
            //request.setAttribute("user",user);        
            return mapping.findForward(SUCCESS);        
        }
    }
    Ma classe UserService.java :
    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
     
    public class UserService {
     
        private UserDAO udao;
     
        public UserService() {
            this.udao = new UserDAO();
        }
     
        public boolean addNewUser(User user) {
            boolean ok = false;
            try {
                //call other business classes to do insert, ie :
                ok = this.udao.addNewUser(user);
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            return ok;
        }    
    }
    Ma classe UserForm.java :
    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
     
    public class UserForm extends org.apache.struts.action.ActionForm {
     
        private String username;
        private String userpwd;
        private String firstname;
        private String lastname;
        private String phone;
        private String email;
     
        public UserForm() {
            super();
        }
     
        public String getUsername() {
            return username;
        }
     
        // + Tous les autres getters / setters
    }
    Ma classe User.java :
    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
     
    public class User implements Serializable {
     
        private String username;
        private String userpwd;
        private String firstname;
        private String lastname;
        private String phone;
        private String email;
     
        public User() {
        }
     
        public User(String userID, String username, String userpwd, String firstname, String lastname, String phone, String email) {
            //etc....        
        }
     
        public String getUsername() {
            return username;
        }
     
        // + Tous les autres getters / setters
    }
    Ma classe UserDAO.java :
    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
     
    public class UserDAO extends BaseDAO {
     
        public UserDAO() {
            super();
        }
     
        public boolean addNewUser(User user) throws SQLException {
     
            // ......
            // ......
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rset = null;
            // ......
    }

    Quelque chose ne colle pas ?

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    apparement ca devrais marcher, je pense que c'est la cas.

    Mais ce que voulais t'expliquer, c'est que les attributs de ton action form tu les determine en fonction des elements html que tu as ton ta page jsp.

    Si tu as 4 input text et 1 select, il va te falloir 4 Strings pour les 4 input text puis pour les select si ils sont remplis dynamiquement tu devras avoir une ArrayList de LabelValueBean par exemple, puis un attribut qui recuperera l'id choisi dans le select pour chaque select, soit 6 attributs.

    Et tu n'es pas non plus obligé d'avoir dans ton actionform tous les attributs d'un user car peut-être qu'un jour tu ne voudras saisir que le nom et prénom lors de la création, et que le tel et l'email tu les gère plus tard ou pas du tout.

  18. #18
    Membre régulier Avatar de ultracoxy
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 116
    Points : 74
    Points
    74
    Par défaut
    Effectivement, je n'avais pas vu les choses sous cet angle. Je pense à changer pour suivre ton conseil car j'aurai plusieurs formulaires, un d'enregistrement avec tous les attributs, un d'identification avec seulement le login et le mot de passe, etc... Donc, je vais m'appliquer à créer un ActionForm pour chaque formulaire jsp.

    Merci de ton aide.

  19. #19
    Membre régulier Avatar de ultracoxy
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 116
    Points : 74
    Points
    74
    Par défaut
    Pour reprendre le sujet de la datasource, je viens de rencontrer un problème, Une erreur tout à fait classique mais que je n'arrive pourtant pas à résoudre :
    javax.naming.NameNotFound Exception : le nom jdbc n'est pas lié à ce contexte.

    Voici mon code pour paramétrer la datasource :

    Mon fichier web.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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
        <servlet>
            <servlet-name>action</servlet-name>
            <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
            <init-param>
                <param-name>config</param-name>
                <param-value>/WEB-INF/struts-config.xml</param-value>
            </init-param>
            <init-param>
                <param-name>debug</param-name>
                <param-value>2</param-value>
            </init-param>
            <init-param>
                <param-name>detail</param-name>
                <param-value>2</param-value>
            </init-param>
            <load-on-startup>2</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>action</servlet-name>
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>  
        <resource-ref>
            <description>Pool de connection</description>
            <res-ref-name>jdbc/monAppli</res-ref-name>
            <res-type>javax.sql.DataSource</res-type>
            <res-auth>Container</res-auth>
            <res-sharing-scope>Shareable</res-sharing-scope>
        </resource-ref>
        <session-config><session-timeout>
                30
            </session-timeout></session-config><welcome-file-list><welcome-file>
                index.jsp
            </welcome-file></welcome-file-list>
        </web-app>
    Mon fichier context.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <Context docBase="\monAppli" path="/monAppli" useNaming="true">
      <ResourceLink global="jdbc/monAppli" name="jdbc/monAppli" type="javax.sql.DataSource"/>
      <Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="8" maxIdle="8" maxWait="10000" name="jdbc/monAppli" password="monpassword" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/mabdd?autoReconnect=true" username="monusername"/>
    </Context>
    Mon 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    public abstract class BaseDAO {
     
        private static final String JNDI_DATASOURCE = "java:comp/env/jdbc/monAppli";
        private DataSource dataSource;
     
        public BaseDAO() {
            super();
            try {
                Context ctx = new InitialContext();
                this.dataSource = (DataSource) ctx.lookup(JNDI_DATASOURCE);
            } catch (NamingException ex) {
                ex.printStackTrace();
            }
        }
     
        public void closeResources(ResultSet rset, Statement stmt, Connection conn) {
            if (rset != null) {
                try {
                    rset.close();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
     
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
     
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
        }
     
        public Connection getConnection() {
            Connection conn = null;
            try {
                conn = this.dataSource.getConnection();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            return conn;
        }
    }
    En feuilletant les forums et le web, j'ai trouvé des raisons possibles à cette erreur, mais aucune correction n'a résolu ce problème (j'ai mis useNaming à true, j'ai utilisé username et non user, etc...).

    Je ne vois pas ce qui cloche mais j'ai quelques hypothèses :
    la déclaration de la DataSource serait mal placée (mauvais niveau) dans le fichier web.xml ?
    il manquerait le paramètre <Context /> dans le fichier server.xml ?

    Sinon, je tiens à préciser que si cette deuxième hypothèse s'avère être la cause de l'erreur alors je serais déçue, J'ai configuré la DataSource dans le fichier context.xml au lieu du fichier server.xml de Tomcat afin de ne pas avoir à faire de modif lorsque je déploierai mon application sur un autre Tomcat que celui que j'utilise avec NetBeans.

    Quelqu'un a la recette qui gagne ?

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    perso aucune idée, au pire fait un nouveau topic

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [DataDource][Struts][Tomcat] Pb DataSource
    Par hepsilonz dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 17/01/2007, 22h24
  2. [struts] probleme de tomcat?
    Par pouss dans le forum Tomcat et TomEE
    Réponses: 9
    Dernier message: 04/05/2006, 14h36
  3. [pool connexion tomcat]
    Par agougeon dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 16/01/2006, 15h18
  4. [ Tomcat ]débuguer application Struts sans pluggin Tomcat
    Par laurent.c123 dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 12/07/2005, 14h32
  5. [Eclipse + Tomcat + Struts] lancement de Tomcat
    Par phoebe dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 24/05/2005, 10h17

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