CURSUS DE FORMATION AUX NOUVELLES TECHNOLOGIES DE DEVELOPPEMENT UV J2EE / JNDI Module Java Expert
Module J2EE/JNDI Page 2 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Module Java n Vue densemble du langage Java n Le langage Java : syntaxe et sémantique n Programmation multi-tâche : les threads n Accéder aux bases de données n Composants réutilisables : le modèle MVC n Développement Client/Serveur n Présentation dun IDE : WSAD / Forté / JBuilder n Les serveurs dapplications J2EE n Les Enterprise JavaBeans n Ré-ingénierie dapplications Java
Module J2EE/JNDI Page 3 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Naming Service n Associer des noms aux objets (bind) n Récupérer les objets par leur nom (resolve) n nom de fichier ==> octets sur le disque n Exemples: –RMI Registry –CORBA Naming Service (COSNaming) –Domain Name Service (DNS) –système de fichiers
Module J2EE/JNDI Page 4 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Contextes n Contient un ensemble de liaisons (binding) et des opérations de recherche (lookup) n Possède ses propres convention de nommage n Exemples –Système de répertoire :/ –domaine DNS :edu –LDAP: c=us n Système de nommage est un ensemble de contextes –noms dun système particulier = espace de nommage (namespace)
Module J2EE/JNDI Page 5 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Noms n Identificateur assigné à un objet n localhost ==> n Convention de nommage définie par le système de nommage –/rép/rép2/file pour UNIX –disque:\rép\string pour DOS –cn=dan, o=ISP pour LDAP –www-lil.univ-littoral.fr pour DNS
Module J2EE/JNDI Page 6 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Noms (suite) n Nom Atomique –nom utilisé dans une liaison –Possède un sens uniquement dans un contexte –Ex. nom de fichier dans un répertoire n Nom composé –séquence de noms atomiques –/usr/bin/ls –conforme à la convention de nommage
Module J2EE/JNDI Page 7 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Names (Cont) n Nom composite –Couvre de multiple systèmes de nommage – URL id: http DNS: UNIX et serveur web: /usr/deruelle/public_html n Résolution Object o = ctx.lookup(usr/deruelle/public_html);
Module J2EE/JNDI Page 8 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Objectifs de JNDI n Proposer une API pour accéder à différents noms. n Différents noms peuvent être combinés dans une seul système logique. n De nouvelles implémentations de services de nommage peuvent être ajoutées sans modifications du client.
Module J2EE/JNDI Page 9 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Architecture JNDI API JNDI Interface JNDI de fournisseurs de service Application Cliente Java Manager de nommage JNDI DNS LDAP CORBA RMI autres
Module J2EE/JNDI Page 10 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Architecture JNDI n Application Programming Interface (API) –API pour les programmeurs dapplications clientes –interface Unifiée n Service Provider Interface (SPI) –Pour les vendeurs permettant un accès JNDI à leur service de nommage
Module J2EE/JNDI Page 11 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle JNDI API n Incluse dans le Java 2 SDK v 1.3 n Doit être téléchargé pour les JDK 1.1 et JDK 1.2 n Packages –javax.naming –javax.naming.directory –javax.naming.event –javax.naming.ldap –javax.naming.spi
Module J2EE/JNDI Page 12 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Service Providers n Implémentation des produits sous-jacents n Incluses dans Java 2 SDK 1.3 –LDAP –COSNaming –JNDI over RMI Registry n Doit être téléchargé pour les versions précédentes –
Module J2EE/JNDI Page 13 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle JNDI Providers n LDAP –com.novell.naming.service.nds.NdsInitialContextFactory n NIS –com.sun.jndi.nis.NISCtxFactory n NIS+ (future) n RMI –com.sun.jndi.rmi.registry.RegistryContextFactory n COSNaming n Fichies –com.sun.jndi.fscontext.[Ref]FSContextFactory
Module J2EE/JNDI Page 14 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Configuration n Pour 1.3, rien à faire. JNDI devrait être inclus dans la distribution avec 3 fournisseurs n Pour Java 2 SDK version 1.2 –jndi.jar in $JAVA_HOME/jre/lib/ext n Pour jdk 1.1 –Ajouter jndi.jar au CLASSPATH
Module J2EE/JNDI Page 15 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Quelques produits LDAP n accessible publiquement : –ldap://ldap.Bigfoot.com –ldap://ldap.four11.com –ldap://ldap.InfoSpace.com
Module J2EE/JNDI Page 16 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Tâches Communes JNDI n Obtenir une référence au contexte initial (InitialContext) n Opérations sur le contexte –Lister les fils dun contexte –Lier (Bind) des noms à des objets –rechercher (Lookup) des objets via leur nom –Créer/détruire des contextes –Note: NamingException peut être envoyée pour la plupart des opérations de contexte.
Module J2EE/JNDI Page 17 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Contextes JNDI
Module J2EE/JNDI Page 18 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Obtenir un contexte initial import javax.naming.*; // non nécessaire pour les serveurs dapplications J2EE java.util.Properties props = new java.util.Properties(); props.put(Context.INITIAL_CONTEXT_FACTORY, com.sun.jndi.fscontext.RefFSContextFactory); props.put(Context.PROVIDER_URL, file:///); //obligatoire pour toutes les applications Context initContext = new InitialContext( props );
Module J2EE/JNDI Page 19 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Contexte initial n Point de départ dans lespace de noms. n Toutes les opérations exécutées sont relatives au contexte initial. n Spécifier le fournisseur de service à laide de la propriété : props.put(Context.INITIAL_CONTEXT_FACTORY, com.sun.jndi.fscontext.RefFSContextFactory );
Module J2EE/JNDI Page 20 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Contexte initial (suite) n Spécifier les propriétés spécifiques au fournisseur n LDAP props.put(Context.PROVIDER_URL, ldap://host:port); props.put(Context.SECURITY_PRINCIPAL, user ); props.put(Context.SECURITY_CREDENTIALS, password); n Système de fichier props.put(Context.PROVIDER_URL, file://tmp/); n Créer le contexte initial InitialContext initContext = new InitialContext( props ); –Création sans paramètres provoque la recherche dun fichier jndi.properties, indiquant lAPI JNDI et lespace de nommage à utiliser
Module J2EE/JNDI Page 21 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Lister les fils NamingEnumeration children = initContext.list(); while( children.hasMore() ) { NameClassPair nc = (NameClassPair) children.next(); System.out.println(nc.getName()); System.out.println(nc.getClassName()); } n list() renvoie un NamingEnumeration dobjets NameClassPair n listBindings() renvoie un NamingEnumeration des objets liés
Module J2EE/JNDI Page 22 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle NameClassPair and Binding javax.naming.NameClassPair getClassName() : String getName() : String javax.naming.Binding getObject() : Object Représente une association entre un name et un objet Représente le nom et la classe dun objet lié à un contexte
Module J2EE/JNDI Page 23 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle NamingEnumeration n Spécialise la collection java.util.Enumeration. n Envoie une exception lorsque il ny a plus dentrées dans lénumération. n Permet des résultats partiels qui sont renvoyés et une exception suite à un accès invalide: –i.e. hasMore() renverra une exception
Module J2EE/JNDI Page 24 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Lier des noms à un objet n Lier un nom à un objet à l'intérieur dun contexte File f = new File(/tmp/dan); tmpDirContext.bind(dan, f ); n NameAlreadyBoundException est envoyée si le nom dan est déjà lié dans le contexte tmp. n Peut utiliser unbind() ou rebind()
Module J2EE/JNDI Page 25 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Recherche dun objet n Rechercher un objet dans un contexte –String name; Object o = initContext.lookup(name); –le nom peut être composé : –/usr/tmp/dir/myfile –les séparateurs ne sont pas standardisés ! –La classe renvoyée est chargée par le fournisseur !
Module J2EE/JNDI Page 26 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Paramètre Name n Les opérations de contexte peuvent prendre une String ou un Name dans le paramètre name. n Name –Séquence ordonnée de composants –Noms Composés –Noms Composites n String –Représente un nom composite
Module J2EE/JNDI Page 27 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Exceptions de nommage catch( NamingException e ) { } n Méthodes importantes –toString() : String –getRootCause() : Throwable –getRemainingName() : Name –getExplanation() : String
Module J2EE/JNDI Page 28 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle javax.naming.Context bind(String name, Object obj) createSubcontext(String name) : Context list(String name) : NamingEnumeration listBindings(String name) : NamingEnumeration lookup(String name) : Object > javax.naming.InitialContext InitialContext() InitialContext(java.util.Hashtable env) javax.naming.directory.InitialDirContext InitialDirContext() InitialDirContext(Hashtable env) javax.naming.directory.DirContext getAttributes() : Attributes search(String name, Attributes matchingAttributes) : NamingEnumeration >
Module J2EE/JNDI Page 29 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle Attributs de contexte n Attributs Commun LDAP c = Country o = Organization ou = Organizational Unit cn = Common Name (premier ou nom complet) sn = Users surname (surnom utilisateur)
Module J2EE/JNDI Page 30 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle JNDI and RMI n Propose une interface standard pour le registre RMI Properties props = new Properties(); props.put(Context.INITIAL_CONTEXT_FACTORY, com.sun.jndi.rmi.registry.RegistryContextFactory); props.put(Context.PROVIDER_URL, rmi://host:port); Context ctx = new InitialContext(props); ctx.rebind(Teller, unObjetRMI ); …….. Teller t = (Teller) ctx.lookup(Teller);
Module J2EE/JNDI Page 31 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle JNDI et JDBC n Sources de données JDBC (DataSource) –Evolutions du gestionnaire de Driver JDBC –Stockées dans larborescence JNDI –Permettent le pool de connexion –Méthodes dun objet DataSource ds : Connection conn = ds.getConnection(String name, String password ) conn.close()
Module J2EE/JNDI Page 32 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle JNDI et EJB n Objet Home pour un EJB est stocké dans JNDI n Afin de créer un bean: InitialContext ic = new InitialContext( props ); TellerHome th = (TellerHome) ic.lookup(TellerHome);
Module J2EE/JNDI Page 33 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle JNDI et les applications J2EE n InitialContext –fourni par le Container –accédé par un composant en utilisant le constructeur par défaut. InitialContext rootCtx = new InitialContext(); n Propriétés –fournies au Container à laide du descripteur de déploiement –accédées par un composant à travers un contexte spécial Object object = rootCtx.lookup(java:comp/env/monObjet);
Module J2EE/JNDI Page 34 / 34 Deruelle Laurent Copyright © 2002 Laurent Deruelle En résumé Les applications clientes JNDI peuvent accéder à des ressources telles que: –imprimantes –fax –bases de données (JDBC 2.0) –références dobjet qui sont contenues dans de multiples implémentations des services de nommage et en utilisant la même API.