[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
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.
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 ?
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:
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:
threadLocal.set( nomBase );
Et avant chaque requête SQL, je récupère le nom de la base comme ça :
Code:
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.