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

Développement Web en Java Discussion :

[Strategie]un paramètre d'une session vers la couche donnée


Sujet :

Développement Web en Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 4
    Par défaut [Strategie]un paramètre d'une session vers la couche donnée
    J'ai une application web découpée en 3 couches :
    - web (JavaBean)
    - métier (tout ce qui ne concerne pas l'interface graphique ni les données)
    - donnée (connexion JDBC, requête SQL...)

    Cette application doit être capable de se connecter à plusieurs bases de données (production, développement...).
    Le choix s'effectue via une page JSP où l'utilisateur choisi le nom de sa base puis valide le formulaire.
    La base choisie peut être différente pour chaque utilisateur connecté.
    Je dois donc stocker le nom de la base dans un objet HttpSession.

    Mon soucis est que dans la couche "donnée", je ne veux pas attaquer la session Http pour récupérer le nom de la base car ce n'est pas le métier de cette couche.
    Et j'aimerais éviter de passer le nom de la base comme paramètre à chaque méthode de la couche métier, qui passerait le paramètre à chaque méthode de la couche donnée.
    Mais je ne peux pas utiliser d'attribut static ou de propriété système pour ça car le nom de la base peut être différent pour chaque utilisateur.

    Y'a t-il un moyen propre et efficace de faire ça ?


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

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 239
    Par défaut Re: [Strategie]un paramètre d'une session vers la couche don
    Je ne suis pas sûr de tout comprendre,

    ok pour ton appli a 3 couches.

    Reprenons le problème: Un utilisateur doit pouvoir sléectionner une Bdd de travail. Un formulaire lui permet de sélectionner une Bdd parmi une liste.

    Ton formulaire validé, tu récupère le nom de bdd choisi et le transmets (le nom bdd, pas l'ojet session) à travers la couche métier correspondante, puis cette dernière va appeler une méthode de la couche Données afin qu'il puisse se connecter à la bonne base de données.

    C'est tout. Indépendance des couches ne veut pas dire qu'elles sont isolées les unes des autres. Elles ont besoin de communiquer des informations et chacun à son role :

    1. web=recupere info utilisateur
    2. metier=traiter info utilisateur
    3. données= on agit en fonction de la couche métier
    4. metier=on valide le traitement la couche données
    5. web=on affiche le résultat adéquat (connexion à la bdd yyy réussi).

    Donc transmettre une info de la couche web vers la couche données est tout à fait normale et propre, même si son traitement est vraiment basique.

    j'espère avoir pu répondre à ta question.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 4
    Par défaut Re: [Strategie]un paramètre d'une session vers la couche don
    Déjà, merci pour ta réponse.

    Mon soucis n'est pas de passer le nom de la Bdd à travers les couches, mais comment éviter de le passer à chaque action (lien cliqué, formulaire validé...) une fois la base choisie via le formulaire.

    Y'a-t-il un moyen de le passer qu'une seule fois et que la couche Données s'en souvienne ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 239
    Par défaut
    Avec Struts (struts-config.xml), on passe bien l'objet connexion de la datasource à chaque traitement qui demande un accès Bdd. Donc c'est sûr c'est un peu lourd mais c'est le plus simple.

    Une solution serait de gèrer dans ton service qui accède à la bdd un pool d'utilisateurs, dans cette liste tu stockerais pour chaque utilisateur sa bdd de travail mais le pb reste le même car il faudra bien que tu passes à travers les différentes couches l'id de ton user pour retrouver cette information.

    En espérant que tu pourras trouver qq chose qui te convienne ...

  5. #5
    Membre Expert
    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
    Par défaut
    Hello,

    Au niveau des EJB tu peux utiliser l'EJBContext pour connaitre l'utilisateur courant.

    En appellant le Principal.

    Je n'ai pas une grande experience sur ce point mais en lisant la javadoc j'ai lu que c'etait possible : Javadoc EJBCONTEXT

    C'est une piste..

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 4
    Par défaut
    Pour ce qui est des EJB, je n'en utilise pas.
    Sinon avec un EJB session, je n'aurais pas eu ce soucis.

    Mon problème n'était pas bloquant.
    C'était simplement pour trouver un moyen de coder plus proprement.

    Je vais donc passer le nom de ma base à chaque méthode.

    En tout cas merci pour vos réponses.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 4
    Par défaut finalement il y a une solution
    J'ai trouvé une astuce intéressante :

    J'utilise dans ma couche données un objet de type ThreadLocal.
    Chaque thread a son propre ThreadLocal.
    Et comme un ThreadLocal permet de stocker un objet via les méthodes set et get, je peux donc stocker le nom de ma base une fois pour toute.

    Explication :

    Dans une classe de ma couche données, j'ai cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static final ThreadLocal threadLocal = new ThreadLocal();
    Si deux threads différents accèdent à cette variable, celle-ci sera différente pour chacun des threads.

    Quand un utilisateur choisit le nom d'une base, je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    threadLocal.set( nomBase );
    Et avant chaque requête SQL, je récupère le nom de la base comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String base = (String)threadLocal.get();
    Si deux utilisateurs différents sont connectés à mon appli, je sais que l'objet stocké dans threadLocal sera différent pour chacun d'eux.
    Même si threadLocal est static et partagé pour tout le monde...
    C'est l'interêt de cette classe.

  8. #8
    Membre Expert
    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
    Par défaut
    Hello,

    Merci pour cette explication!!
    Je n'avais pas vraiment compris l'utilité et le fonctionnement d'un threadLocal.
    Et tout c'est eclairci grace à ton explication!!

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    Juste un exemple d'utilisation du ThreadLocal avec Hibernate pour le gestion des sessions. Voir le code de la classe utilitaire HibernateUtil dans le tutoriel de Julien DEFAUT

    http://defaut.developpez.com/tutorie...ibernate/#L4.1

  10. #10
    Membre Expert
    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
    Par défaut
    Hello,

    Merci

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

Discussions similaires

  1. Problème envoyer paramètres d'une JSP vers une autre
    Par toufik135 dans le forum Taglibs
    Réponses: 1
    Dernier message: 29/12/2014, 05h27
  2. Passer des paramètres d'une Activity vers un Service
    Par Messi007 dans le forum Android
    Réponses: 3
    Dernier message: 23/09/2012, 18h26
  3. Passage de paramètre d'une session à une autre
    Par tribalwoman dans le forum Informatica
    Réponses: 2
    Dernier message: 26/10/2011, 09h44
  4. [9i] connaitre les paramètres d'une session
    Par sygale dans le forum Administration
    Réponses: 2
    Dernier message: 25/04/2007, 14h45
  5. Réponses: 13
    Dernier message: 16/04/2004, 12h00

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