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

Servlets/JSP Java Discussion :

[Strategie] Utilisations d'objets crées depuis un servlet


Sujet :

Servlets/JSP Java

  1. #1
    Invité
    Invité(e)
    Par défaut [Strategie] Utilisations d'objets crées depuis un servlet
    Bonjour,

    J'utilise un BasicDataSource que je créer depuis un servlet mis en load on startup. Je place l'instance de ce dataSource dans servletContext pour le récupérer depuis mes autres servlets.
    Jusque la ça va.

    MAIS

    Je veux pouvoir utiliser cette dataSource depuis d'autres classes qui ne sont pas dans une Servlet.
    Je m'explique :
    J'ai crée une classe user avec une méthode authentifie(String login, String password).

    Je vais donc avoir une formulaire qui vas envoyer le login et la password à une servlet qui va appeler user.authentifie(monlogin, monpassword);

    Mais comment faire pour que user.authentifie() puisse utiliser mon datasource ?

    Si ce n'est pas possible que me conseillez-vous ?

    Merci beaucoup


    Personne ?

    Bon..
    La seule solution que je voie ce serait de créer un nouveau dataSource pour User mais ça ne vas pas faire propre. DOnc même pas besoin de créer un dataSource juste de se connecter à la Db, de récupèere le sinfos et c'est tout.
    Mais ce n'est quand même pas propre..




    [Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java

  2. #2
    Membre actif Avatar de bidi
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 262
    Points : 266
    Points
    266
    Par défaut
    Ne peux-tu pas passer ta datasource à ta méthode d'authentification? ou tout bêtement la mettre en static...

  3. #3
    Membre habitué Avatar de manube
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Mai 2004
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 180
    Points : 178
    Points
    178
    Par défaut
    Salut,
    Pour authentifier ton utilisateur tu as besoin d'une connexion à la base de données, alors pourquoi ne pas suivre les conseils de bidi.
    En plus, tu n'as même pas besoin de passer la data source en paramètre, la connexion te suffit.
    Tu change ta méthode authentifie(String login, String password) de la classe user en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public boolean authentifie(String login, String password, Connection dbConnection)
    ... et le tour est joué, je ne comprend pas trop ce qui te pose pb...

    Bon courage
    Manu

  4. #4
    Invité
    Invité(e)
    Par défaut
    ben la seule chose qui me pose probléme c'est qu'un utilisateur c'est un nom, un prenom un login et un password mais pas un DataSOurce..

    c'est juste une question de représentation.



    --> Le fait de mettre mon DataSource en static me permettrais d'y accéder autrement ?


    Merci

  5. #5
    Membre habitué Avatar de manube
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Mai 2004
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 180
    Points : 178
    Points
    178
    Par défaut
    Nous sommes d'accord, un utilisateur reste un nom, un prénom et tous les paramètres que tu veux.
    Si tu veux être plus propre tu as plusieurs possibilités du coté des design patterns pour séparer les couches logiques des couches d'implémentation.
    Je peux te proposer une petite solution maison:
    Tu as ta servlet, ta classe user qui ne contient que les données métier (propres à l'utilisateur : nom, login, pwd ...) et tu crées une classe UserDAO qui gère la persistence de ton utilisateur sur la base de données. Cette class aura les méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public User create(String login, ..., Connection dbConnection){...}
    public User update(User user, String prénom, ..., Connection dbConnection){...}
    public void delete(User user, Connection dbConnection){...}
    public User get(String login, String pwd, Connection dbConnection){/*Ta méthode qui pose pb ici*/}
    C'est bcp plus propre on va dire
    Manu

  6. #6
    Membre actif Avatar de bidi
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 262
    Points : 266
    Points
    266
    Par défaut
    Ben oui, Si tu la mets en static, tu y as accès dans toute l'application...

  7. #7
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Hello,

    Tu pourrais mettre ta datasource dans sous une reference JNDI.

    Tu peux faire cela dans tous les conteneurs implementant la norme J2EE verifier quand meme)

    Ensuite tu implementes une classe sur le principe du pattern singleton.
    Cette classe sera accessible depuis l'ensemble de ton appli.
    Cette s'appuira sur ta datasource pour te fournir des objets de type Connection. Comme ca le jour ou tu veux changer ta datasource tu n'auras qu'une seul classe à modifier.

    Aussi l'ideal est d'utiliser un pool de connection

    Je pense que passer une datasource ou une connection en parametre d'une méthode de service n'est pas genial ..

    Dans le sens ou une methode issue de la couche persistance doit pourvoir s'assumer soit meme... sans aide de la couche de service...

    Aussi pour les methodes suivantes, je modifirai la signature comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public User create(String login, ..., Connection dbConnection){...}
    public User create(UserDAO){...}
     
    public UserDAO get(String login, String pwd){/*Ta méthode qui pose pb ici*/}
    Comme ca le jour ou tu rajoutes un champ à ton user la modification est plus simple...pas de signature de methode à changer..
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup à tous.

    Mais vous n'avez pas une petite piste pour ceci :
    Citation Envoyé par manube
    tu crées une classe UserDAO qui gère la persistence de ton utilisateur sur la base de données. Cette class aura les méthodes :
    Je dois avouer que je ne vois pas trop comment ça doit fonctionner ..

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par fabszn
    Tu pourrais mettre ta datasource dans sous une reference JNDI.
    ...
    Ensuite tu implementes une classe sur le principe du pattern singleton.
    ...
    Aussi l'ideal est d'utiliser un pool de connection
    J'ai déja utilisé un Singleton pour une applic Swing. Mais je ne vois pas trop ou l'instancier dans mon applic web ?
    Si je l'instancie depuis un servlet load-on-startup c'est suffisant ?

  10. #10
    zl
    zl est déconnecté
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 75
    Points : 90
    Points
    90
    Par défaut
    DAO: Data Access Object. C'est un pattern bien connu. C'est tout simplement une class qui doit communiquer dans un seul sens: Vers ta source de données (une base de donnée par exemple).


    Je te conseille d'aller lire la doc Sun concernant ce pattern et bien d'autres.

    Zl.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Merci

  12. #12
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2006
    Messages : 103
    Points : 98
    Points
    98
    Par défaut
    Je te propose d'utiliser static, c plus facile.

  13. #13
    Membre habitué Avatar de manube
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Mai 2004
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 180
    Points : 178
    Points
    178
    Par défaut
    Salut,
    Bon je vais reprendre tranquillement.
    Pour commencer, si tu veux en savoir plus sur les Data Access Objects va faire un tour sur Google ou alors je peux te proposer les blue prints de java :
    http://java.sun.com/blueprints/patterns/DAO.html.
    L'idée est de créer un objet qui va gérer la persistance des données sur ta base de données.
    Donc dans ta classe User, tu ne garde que les méthodes métier (getNom(), getPrenom(), getNomDeJeuneFille()...) => Tout ce dont tu auras besoin dans ta servlet pour communiquer à l'utilisateur final.
    Tu crées une nouvelle classe UserDAO dans laquelle tu vas définir tous les échange entre ton objet métier et la base de données. Voici un exemple de code pour une classe user (extrait d'une classe perso):
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    public class UserDAO {
    /**
    	 * The SQL statement to create a new user 
    	 */
    	protected static final String CREATE_STATEMENT = "INSERT INTO _user (login, first_name, last_name, email, user_group, pwd) VALUES (?, ?, ?, ?, ?, ?);"; 
    	/**
    	 * The SQL statement to update a user (except the encoded key)
    	 */
    	protected static final String UPDATE_STATEMENT = "UPDATE _user SET login = ?, first_name = ?, last_name = ?, email = ?, user_group = ? WHERE id = ?;";
    	/**
    	 * The SQL statement to delete a user 
    	 */
    	protected static final String DELETE_STATEMENT = "DELETE FROM _user WHERE id = ?;";
    	/**
    	 * The SQL statement to find all the users
    	 */
    	protected static final String FIND_ALL_STATEMENT = "SELECT * FROM _user ORDER BY login;";
    	/**
    	 * The SQL statement to find a user by login and pwd
    	 */
    	protected static final String CONNECT_STATEMENT = "SELECT * FROM _user WHERE login = ? AND pwd = ?;";
     
     
    	public User create(String login, String firstName, String lastName, String email, UserGroup userGroup, String pwd) throws DAOException
    	{
    		Connection dbConnection = null;
    		User user = null;
     
    		try {
                            // DBConnectionManager is the manager of my custom connection pool
    			dbConnection = DBConnectionManager.getConnection();
    			dbConnection.setAutoCommit(false);
    			User user = null;
    		// Create the user
    		PreparedStatement ps = dbConnection.prepareStatement(CREATE_STATEMENT);
    		ps.setString(1, login);
    		ps.setString(2, firstName);
    		ps.setString(3, lastName);
    		ps.setString(4, email);
    		ps.setLong(5, userGroup.getId());
    		ps.setString(6, encodedKey);
    		if( ps.executeUpdate() == 1 )
    		{
    			user = new User(login, firstName, lastName, email, userGroup, pwd);
    		else
    		{
    			dbConnection.rollback();
    			throw new DAOException("Unable to create the user "+login, null);
    		}
     
    		        ps.close();
    			dbConnection.commit();			
    		} 
    		catch (SQLException e) {
    			try{
    				if( dbConnection!=null )
    					dbConnection.rollback();
    			}
    			catch (SQLException rollbackException) {
    				ErrorLog.log("Unable to rollback after creating a user", rollbackException, sqlUser);
    			}
    			throw new DAOException("Unable to create the user "+login, e);
    		}
    		finally
    		{
    			DBConnectionManager.releaseConnection(dbResource, dbConnection);
    		}
    		return user;
    	}
     
            // idem pour les methodes update, delete, authenficate(String login, String pwd)
    De cette facon tu sépare le code SQL de la logique métier (tu rajoutes une couche d'abstraction).
    Mais je te conseille qd meme de te renseigner un minimum sur le sujet (Google sera ton ami) afin de bien comprendre les enjeux et surtout comment ca marche.
    ++
    Manu

  14. #14
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2006
    Messages : 103
    Points : 98
    Points
    98
    Par défaut
    que veut dire exactement blue print

  15. #15
    Membre habitué Avatar de manube
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Mai 2004
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 180
    Points : 178
    Points
    178
    Par défaut
    Alors l'origine du mot je n'en sais rien, les blue prints de Sun (http://java.sun.com/reference/blueprints/) sont des explications illustrées de morceaux de code en général plutôt bien faites.
    Tu peux apparenter ca a des petits tutoriaux fait par Sun a propos de concepts appliqués à java.
    Voila, j'espère ne pas avoir dis de betises....

  16. #16
    Invité
    Invité(e)
    Par défaut
    Ok, merci beaucoup manube.

    Mais cela m'oblieg toujours à passer mon ConnectionManager en paramètres..

    Je fais un essai en le mettant en SIngleton et esnuite j'essaye ta méthode.

    Merci

  17. #17
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2006
    Messages : 103
    Points : 98
    Points
    98
    Par défaut
    Citation Envoyé par manube
    Alors l'origine du mot je n'en sais rien, les blue prints de Sun (http://java.sun.com/reference/blueprints/) sont des explications illustrées de morceaux de code en général plutôt bien faites.
    Tu peux apparenter ca a des petits tutoriaux fait par Sun a propos de concepts appliqués à java.
    Voila, j'espère ne pas avoir dis de betises....

    Merci bien pour cette explications, je pense que t'as raison

  18. #18
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par Blaise1
    Citation Envoyé par fabszn
    Tu pourrais mettre ta datasource dans sous une reference JNDI.
    ...
    Ensuite tu implementes une classe sur le principe du pattern singleton.
    ...
    Aussi l'ideal est d'utiliser un pool de connection
    J'ai déja utilisé un Singleton pour une applic Swing. Mais je ne vois pas trop ou l'instancier dans mon applic web ?
    Si je l'instancie depuis un servlet load-on-startup c'est suffisant ?
    Hello,

    En fait le pattern singleton est definie par une classe.

    Il n'y a pas d'instanciation à proprement dit. Tu accedes a ta ressource (ici une source de données) par l'intermédiaire d'une methode static.

    Cette méthode verifie que la ressource existe deja en memoire, si c'est le cas elle l'utilise , sinon elle la créé (creation d'une nouvelle instance).
    Pour

    Donc tu n'as pas à te soucier de l'intanciation de ta ressource.

    Aussi pour gagner en performance, tu peux faire un appel fictif sur ton singleton dans un bloc static d'une de tes servlets (qui sera appelé pendant ton load-on-startup)... cela permettra de masquer la phase d'initialisation de ta ressource..

    Voili voilou j'espere avoir repondu à ta question...
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  19. #19
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par tangjuncn
    Je te propose d'utiliser static, c plus facile.
    Hello,

    Qu'est que tu entends utiliser static?
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  20. #20
    zl
    zl est déconnecté
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 75
    Points : 90
    Points
    90
    Par défaut
    A mon avis, par static, il entend déclarer la variable dont il a besoin comme static pour pouvoir y accéder depuis n'importe quelle classe et donc depuis n'importe quelle couche. C'est une solution mais ce n'est pas "terrible".

    Il faut séparer les couches aux maximum. La communication entre les couches doit se faire dans un seul sens:

    Présentation-->Métier-->Persistence.


    Zl.

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

Discussions similaires

  1. [Flex3] Utiliser un objet depuis une autre page MXML
    Par cairon59 dans le forum MXML
    Réponses: 4
    Dernier message: 11/08/2010, 16h50
  2. Réponses: 4
    Dernier message: 19/05/2009, 19h14
  3. Réponses: 1
    Dernier message: 09/04/2008, 02h13
  4. Réponses: 2
    Dernier message: 08/04/2008, 11h03
  5. utilisation d'objets ADO pour CMS sur POSTGRESQL7.3.2
    Par turbok dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 10/10/2003, 09h29

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