cursus de formation aux nouvelles technologies de developpement uv j2ee / jndi module java expert
TRANSCRIPT
CURSUS DE FORMATION AUX NOUVELLES TECHNOLOGIES DE DEVELOPPEMENT
UV J2EE / JNDI
Module Java Expert
Module J2EE/JNDIPage 2 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Module Java
Vue d’ensemble du langage Java Le langage Java : syntaxe et sémantique Programmation multi-tâche : les threads Accéder aux bases de données Composants réutilisables : le modèle MVC Développement Client/Serveur Présentation d’un IDE : WSAD / Forté / JBuilder Les serveurs d’applications J2EE Les Enterprise JavaBeans Ré-ingénierie d’applications Java
Module J2EE/JNDIPage 3 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Naming Service
Associer des noms aux objets (bind) Récupérer les objets par leur nom (resolve) nom de fichier ==> octets sur le disque Exemples:
– RMI Registry– CORBA Naming Service (COSNaming)– Domain Name Service (DNS)– système de fichiers
Module J2EE/JNDIPage 4 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Contextes
Contient un ensemble de liaisons (binding) et des opérations de recherche (lookup)
Possède ses propres convention de nommage Exemples
– Système de répertoire : “/”
– domaine DNS : “edu”
– LDAP: “c=us” Système de nommage est un ensemble de contextes
– noms d’un système particulier = espace de nommage (namespace)
Module J2EE/JNDIPage 5 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Noms
Identificateur assigné à un objet localhost ==> 127.0.0.1 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/JNDIPage 6 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Noms (suite)
Nom Atomique– nom utilisé dans une liaison
– Possède un sens uniquement dans un contexte
– Ex. nom de fichier dans un répertoire Nom composé
– séquence de noms atomiques
– /usr/bin/ls
– conforme à la convention de nommage
Module J2EE/JNDIPage 7 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Names (Cont)
Nom composite– Couvre de multiple systèmes de nommage– http://www.apl.jhu.edu/~deruelle/
• URL id: http
• DNS: www.apl.jhu.edu
• UNIX et serveur web: /usr/deruelle/public_html
RésolutionObject o = ctx.lookup(“usr/deruelle/public_html”);
Module J2EE/JNDIPage 8 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Objectifs de JNDI
Proposer une API pour accéder à différents noms. Différents noms peuvent être combinés dans une
seul système logique. De nouvelles implémentations de services de
nommage peuvent être ajoutées sans modifications du client.
Module J2EE/JNDIPage 9 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Architecture JNDI
API JNDI
Interface JNDI de fournisseurs de service
Application Cliente Java
Manager de nommage JNDI
DNS LDAP CORBARMI autres
Module J2EE/JNDIPage 10 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Architecture JNDI
Application Programming Interface (API)– API pour les programmeurs d’applications clientes– interface Unifiée
Service Provider Interface (SPI)– Pour les vendeurs permettant un accès JNDI à leur service
de nommage
Module J2EE/JNDIPage 11 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
JNDI API
Incluse dans le Java 2 SDK v 1.3 Doit être téléchargé pour les JDK 1.1 et JDK 1.2 Packages
– javax.naming– javax.naming.directory– javax.naming.event– javax.naming.ldap– javax.naming.spi
Module J2EE/JNDIPage 12 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Service Providers
Implémentation des produits sous-jacents Incluses dans Java 2 SDK 1.3
– LDAP– COSNaming– JNDI over RMI Registry
Doit être téléchargé pour les versions précédentes– http://java.sun.com/products/jndi/
Module J2EE/JNDIPage 13 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
JNDI Providers
LDAP– com.novell.naming.service.nds.NdsInitialContextFactory
NIS– com.sun.jndi.nis.NISCtxFactory
NIS+ (future) RMI
– com.sun.jndi.rmi.registry.RegistryContextFactory COSNaming Fichies
– com.sun.jndi.fscontext.[Ref]FSContextFactory
Module J2EE/JNDIPage 14 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Configuration
Pour 1.3, rien à faire. JNDI devrait être inclus dans la distribution avec 3 fournisseurs
Pour Java 2 SDK version 1.2– jndi.jar in $JAVA_HOME/jre/lib/ext
Pour jdk 1.1– Ajouter jndi.jar au CLASSPATH
Module J2EE/JNDIPage 15 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Quelques produits LDAP
accessible publiquement :– ldap://ldap.Bigfoot.com– ldap://ldap.four11.com– ldap://ldap.InfoSpace.com
Module J2EE/JNDIPage 16 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Tâches Communes JNDI
Obtenir une référence au contexte initial (InitialContext)
Opérations sur le contexte– Lister les fils d’un 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/JNDIPage 17 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Contextes JNDI
javax.naming.Context
bind(String name, Object obj)createSubcontext(String name) : Contextlist(String name) : NamingEnumerationlistBindings(String name) : NamingEnumerationlookup(String name) : Object
<<abstract>>
javax.naming.InitialContext
InitialContext()InitialContext(java.util.Hashtable env)
Module J2EE/JNDIPage 18 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Obtenir un contexte initial
import javax.naming.*;
// non nécessaire pour les serveurs d’applications 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/JNDIPage 19 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Contexte initial
Point de départ dans l’espace de noms. Toutes les opérations exécutées sont relatives au
contexte initial. Spécifier le fournisseur de service à l’aide de la
propriété :
props.put(Context.INITIAL_CONTEXT_FACTORY”,
“com.sun.jndi.fscontext.RefFSContextFactory” );
Module J2EE/JNDIPage 20 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Contexte initial (suite)
Spécifier les propriétés spécifiques au fournisseur LDAP
props.put(Context.PROVIDER_URL, “ldap://host:port”);
props.put(Context.SECURITY_PRINCIPAL, “user” );
props.put(Context.SECURITY_CREDENTIALS, “password”);
Système de fichierprops.put(Context.PROVIDER_URL, “file://tmp/”);
Créer le contexte initialInitialContext initContext = new InitialContext( props );– Création sans paramètres provoque la recherche d’un fichier jndi.properties,
indiquant l’API JNDI et l’espace de nommage à utiliser
Module J2EE/JNDIPage 21 / 34
Deruelle LaurentCopyright © 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());
}
list() renvoie un NamingEnumeration d’objets NameClassPair listBindings() renvoie un NamingEnumeration des objets liés
Module J2EE/JNDIPage 22 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
NameClassPair and Binding
javax.naming.NameClassPair
getClassName() : StringgetName() : String
javax.naming.Binding
getObject() : Object
Représente une association entre un name et un objet
Représente le nom et la classe d’un objet lié à un contexte
Module J2EE/JNDIPage 23 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
NamingEnumeration
Spécialise la collection java.util.Enumeration. Envoie une exception lorsque il n’y a plus d’entrées dans
l’énumération. 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/JNDIPage 24 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Lier des noms à un objet
Lier un nom à un objet à l'intérieur d’un contexte
File f = new File(“/tmp/dan”);
tmpDirContext.bind(“dan”, f );
NameAlreadyBoundException est envoyée si le nom “dan” est déjà lié dans le contexte tmp.
Peut utiliser unbind() ou rebind()
Module J2EE/JNDIPage 25 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Recherche d’un objet
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/JNDIPage 26 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Paramètre Name
Les opérations de contexte peuvent prendre une String ou un Name dans le paramètre name.
Name– Séquence ordonnée de composants
– Noms Composés
– Noms Composites
String– Représente un nom composite
Module J2EE/JNDIPage 27 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Exceptions de nommage
catch( NamingException e )
{
}
Méthodes importantes– toString() : String– getRootCause() : Throwable– getRemainingName() : Name– getExplanation() : String
Module J2EE/JNDIPage 28 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
javax.naming.Context
bind(String name, Object obj)createSubcontext(String name) : Contextlist(String name) : NamingEnumerationlistBindings(String name) : NamingEnumerationlookup(String name) : Object
<<abstract>>
javax.naming.InitialContext
InitialContext()InitialContext(java.util.Hashtable env)
javax.naming.directory.InitialDirContext
InitialDirContext()InitialDirContext(Hashtable env)
javax.naming.directory.DirContext
getAttributes() : Attributessearch(String name, Attributes matchingAttributes) : NamingEnumeration
<<abstract>>
Module J2EE/JNDIPage 29 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
Attributs de contexte
Attributs Commun LDAPc = Country
o = Organization
ou = Organizational Unit
cn = Common Name (premier ou nom complet)
sn = User’s surname (surnom utilisateur)
Module J2EE/JNDIPage 30 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
JNDI and RMI
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/JNDIPage 31 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
JNDI et JDBC
Sources de données JDBC (DataSource)– Evolutions du gestionnaire de Driver JDBC– Stockées dans l’arborescence JNDI– Permettent le pool de connexion– Méthodes d’un objet DataSource ds :
• Connection conn = ds.getConnection(String name, String password )
• conn.close()
Module J2EE/JNDIPage 32 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
JNDI et EJB
Objet Home pour un EJB est stocké dans JNDI Afin de créer un bean:
InitialContext ic = new InitialContext( props );
TellerHome th = (TellerHome) ic.lookup(“TellerHome”);
Module J2EE/JNDIPage 33 / 34
Deruelle LaurentCopyright © 2002 Laurent Deruelle
JNDI et les applications J2EE
InitialContext – fourni par le Container– accédé par un composant en utilisant le constructeur par
défaut.• InitialContext rootCtx = new InitialContext();
Propriétés – fournies au Container à l’aide 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/JNDIPage 34 / 34
Deruelle LaurentCopyright © 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 d’objet
qui sont contenues dans de multiples implémentations des services de nommage et en utilisant la même API.