Login
Cerca all'interno di JavaPortal
Help
Home Page Documentazione Forum Progetti Partner Pubblica!
Documentazione > Tutorial > Java Naming and Drectory Interface (JNDI)
Hide
Best Practices
EJB
Frameworks
Howto
J2EE
J2ME and Wireless
J2SE
JSP e Servlet
Java Application Server
Java IDE/Tools
Java Media
Java Security
Java Sys Admin
Java e XML
Java e SQL
OpenSource Java
Patterns
Repository
Tesi
UML
Web Services
Slide
White Paper di jws.it
project management
Eventi
Groovy

Hai una tesi in Java?
Tesine preparate
per esami?
Pubblica tutto su
JavaPortal!

Scrivi al nostro staff


Oracle scippa Sun a IBM


Henry Ford
Vero progresso quando i vantaggi di una nuova tecnologia diventano per tutti


Introduzione a jrpc


Rss Feed
Home Page
Articoli
News
Forum
Classi

  Visualizza Commenti (0) Aggiungi Commento    
Add to Shortcuts
 
Vota l'articolo
Java Naming and Drectory Interface (JNDI)
By Carlo Di Gianvito
3 settembre 2005

  Java Naming and Drectory Interface (JNDI)
Program Lookup.java

Un servizio di naming e directory fornisce un modo naturale e comprensibile per identificare ed associare nomi con i dati. In ogni programma o nei sistemi operativi è doveroso fornire dei nomi agli oggetti. Un sistema operativo come il DOS ad esempio, ci consente di usare un sistema di naming per associare dati con cartelle e file, in un servizio di posta elettronica si deve fornire il nome del recipient al quale si deve spedire il messaggio, in un database relazionale si usa un sistema di naming per associare dati con colonne e nomi di tabelle. In breve un sistema di naming ci permette di associare nomi a oggetti e di recuperare oggetti in base al loro nome.

In un applicazione distribuita i componenti non possono localizzarne un altro e c'è bisogno di un qualcosa che aiuti i vari componenti a trovarsi l'uno con l'altro. JNDI fornisce solo questa capacità. I servizi di naming e directory lavorano su due livelli. Un livello server e un livello client. Il livello server è responsabile della manutenzione e risoluzione delle associazioni nomi-oggetti, del controllo dell'accesso e della gestione delle operazioni eseguite sulla struttura del servizio di directory. Il livello client agisce come un'interfaccia che le applicazioni usano per comunicare col servizio. JNDI non è inteso come alternativa ad altri servizi ma è disegnato per fornire un'interfaccia comune per accedere ad esistenti servizi come DNS, NDS, LDAP, CORBA e RMI.

COS(Common Object Service)Naming: è il servizio di naming per applicazioni CORBA. Permette alle applicazioni di immagazzinare e di accedere a reference di oggetti CORBA.

DNS(Domain Name System): è il servizio di naming di Internet. Associa nomi come http://www.javaportal.it a indirizzi IP come ad esempio 192.25.140.36.

LDAP(Lightweight Directory Access Protocol)
: sviluppato dalla "University of Michigan", come il suo nome suggerisce è una versione leggera del DAP, uno standard di naming per network.

NIS(Network Information System) e NIS+: è un network naming service sviluppato dalla Sun Microsystem. Permette agli utenti di accedere a file e applicazioni su ogni host tramite identificazione con ID e Password.

Molti sistemi di naming non immagazzinano oggetti direttamente, ma reference a oggetti. Un indirizzo IP è una reference alla locazione di un computer su Internet, non il computer stesso. Inoltre i sistemi di naming variano in base alla naming convention e cioè al modo in cui i nomi vengono specificati. Nel DNS i nomi sono costruiti da componenti separati dal punto ("."), sono letti da destra verso sinistra. Il nome www.javaportal.it nomina una macchina chiamata "www" nel dominio "javaportal.it", allo stesso modo "javaportal.it" nomina il dominio "javaportal" nel dominio top-level "it". Nel sistema LDAP la situazione è un pochino più complicata. I nomi sono costruiti da componenti separati da una virgola (","), come nel DNS sono letti da destra verso sinistra ma sono specificati da una coppia nome-valore. Il nome "cn=John Smith", o=DotFrame, c=US" nomina la persona "cn=John Smith" nella organizzazione "o=DotFrame", "c=US". Allo stesso modo il nome "o=DotFrame","c=US" nomina l'organizzazione "o=DotFrame"nel paese "c=US". JNDI risolve le differenze tra i vari servizi fornendoci gli strumenti per lavorare con ognuno di essi.
Un sistema di naming è simile a quando ci rivolgiamo all'operatore di una società telefonica per conoscere il numero di telefono di un abbonato. Noi sostituiamo l'operatore col nome della persona, sarà l'operatore che eseguirà il look up del telefono della persona con cui vogliamo parlare ed eventualmente ci connetterà ad essa. Un servizio di naming è costituito da:
Name: il nome che viene dato all'oggetto
Binding: associare un nome a un oggetto è chiamato binding (legatura)
Reference : è un puntatore per accedere all'oggetto
Context:è un insieme di associazioni nome-oggetto. Fornisce una operazione di look up che restituisce l'oggetto stesso e può provvedere a operazioni come associazioni di nomi, disassociazioni e liste nomi. Ad esempio in un filesystem di tipo UNIX un file directory come "/usr" è un context. Un oggetto context può essere legato a un altro oggetto context chiamato subcontext. Ad esempio un file directory come "/usr/bin" è un subcontext.
Naming system: è un insieme di context dello stesso tipo (cioè hanno la stessa naming convention)
Namespace: è l'insieme dei nomi in un naming system Un servizio di naming può essere usato per trovare ogni tipo di oggetto generico. Ma c'è un tipo di oggetto molto importante: directory object. Questo tipo di oggetto differisce da un oggetto generico dal fatto che è possibile immagazzinare degli attributi insieme all'oggetto. Ad esempio l'oggetto stampante ha i suoi attributi nella velocità, nella risolozione e nel colore, oppure un oggetto utente ha i suoi attributi nelle informazioni del suo account. Si può ad esempio immagazzinare la User ID a la Password di un utente come attributi nell'oggetto directory, così in una applicazione che richiede l'autenticazione, quando il client si connette all'applicazione deve fornire qusti valori che possono essere confrontati con gli attributi della directory. Un servizio di directory estende un servizio di naming e fornisce operazioni per creare, aggiungere rimuovere e modificare gli attributi associati con gli oggetti in una directory. Alcuni esempi di directory service possono essere Netscape Directory Server e Microsoft's Active Directory.

Oggetti Java e directory: Si può pensare a una directory Java come a un deposito di oggetti che possono essere condivisi e essere usati dalle applicazioni Java distribuite attraverso il network. Ad esempio un application server potrebbe usare una directory per registrare gli oggetti che rappresentano i servizi che gestisce, cosicchè, un client può successivamente cercare la directory e localizzare i servizi di cui ha bisogno. JNDI fornisce una vista della directory permettendo agli oggetti di essere aggiunti e recuperati. In J2EE si può usare JNDI per molti propositi tra cui:

  •       acquisire una reference a Java Transaction API (JTA)
  •       connettersi a risource factories come driver JDBC e driver JMS
  •       eseguire il look up tra un bean e un altro

L'architettura JNDI è costituita dalle API e da un Server Provider Interface (SPI). Le API forniscono alle applicazioni Java l'accesso ai servizi di naming e directory e lo SPI è l'interfaccia col rispettivo servizio. SPI permette al produttore del servizio di naming and directory di adattarli al loro protocollo nel sistema. Per fare un esempio con JDBC si potrebbe dire che un client usa le API JDBC per eseguire operazioni sui database e i produttori di database forniscono il loro driver JDBC per permettere l'accesso al loro database, allo stesso modo un client usa le API JNDI per eseguire operazioni di naming and directory e i produttori del servizio forniscono il service provider per permettere l'accesso al loro particolare servizio.

Fig. 1 Java Naming and Drectory Interface (JNDI)

Dalla versione 1.3 del JDK, vengono inclusi tre service provider per i seguenti servizi: Lightweight Directory Access Protocol (LDAP), Common Object Request Broker Architecture (CORBA) Common Object Services (COS) name service, Java Remote Method Invocation (RMI) Registry.

JNDI è diviso in cinque packages:
javax.naming: fornisce le operazioni di naming di base.
javax.naming.directory: estende il package javax.naming per fornire l'accesso ai directory services.
javax.naming.event: fornisce il supporto per la notifica degli eventi durante l'accesso ai servizi di naming and directory.
javax.naming.ldap: supporta LDAP.
javax.naming.spi: fornisce l'interfaccia tra JNDI e il provider specifico del servizio.

La nuova versione JNDI 1.2 aggiunge nuovi strumenti alla versione 1.1 tra cui:

  • Numerose modiche ai package javax.naming , javax.naming.spi, javax.naming.directory
  • Il package javax.naming.ldap ora supporta la versione 3 di LDAP
  • Supporto ai Service Provider, tra cui Storing Objects, Federation e Environment Properties (vedi JNDI SPI document)

File System Service Provider

Tutti i Service Provider richiedono come requisito indispensabile la disponibilità di un server di naming and directory ad eccezione del File System Service Provider. Anche per questo l'esempio che seguirà sarà basato su quest'ultimo. Il File System Service Provider è un servizio di directory che opera sul file system locale.

  • Questo esempio si riferisce al nuovo file system provider per JNDI 1.2
  • Prima di tutto scaricare il provider all'indirizzo http://java.sun.com/products/jndi/serviceproviders.html
  • Il file zip si chiama fscontext-1_2-beta3
  • Creare una directory di installazione per il provider e nominarla (nella fattispecie si chiamerà myJNDI)
  • Estrarre il file zip nella directory come mostrato in figura

 

Fig. 2 Java Naming and Drectory Interface (JNDI)

  • scaricare il file Lookup.java
  • nella partizione dell'hard disk creare la directory tmp e al suo interno la directory tutorial
  • all'interno di tutorial creare un file di nome report.txt
  • compilare con javac Lookup.java
  • modificare la variabile d'ambiente CLASSPATH in modo che includa:
    • la directory corrente (.)
    • myJNDI\lib\fscontext.jar
    • myJNDI\lib\providerutil.jar
    • In Windows 2000 e XP le variabili d'ambiente si impostano da: Pannello di Controllo>Sistema>Tab Avanzate>Tab Variabili d'Ambiente - Esempio in figura.

Fig. 3 Java Naming and Drectory Interface (JNDI)

  • eseguire con java Lookup
  • il risultato è mostrato in figura 

 

Fig. 4 Java Naming and Drectory Interface (JNDI)



Lookup.java top

/*
* @(#)Lookup.java 1.4 00/04/28
*
* Copyright 1997, 1998, 1999 Sun Microsystems, Inc. All Rights
* Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free,
* license to use, modify and redistribute this software in source and
* binary code form, provided that i) this copyright notice and license
* appear on all copies of the software; and ii) Licensee does not
* utilize the software in a manner which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any
* kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
* WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
* HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
* MODIFYING OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN
* NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
* CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT
* OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line
* control of aircraft, air traffic, aircraft navigation or aircraft
* communications; or in the design, construction, operation or
* maintenance of any nuclear facility. Licensee represents and warrants
* that it will not use or redistribute the Software for such purposes.
*/
1. import javax.naming.*;
2. import java.io.File;
3. import java.util.Hashtable;
4.
5. /**
6. * Demonstrates how to look up an object.
7. *
8. * usage: java Lookup
9. */
10.
11. class Lookup {
12.     public static void main(String[] args) {
13.
14.          // Set up the environment for creating the initial context
15.          Hashtable env = new Hashtable(11);
16.          env.put(Context.INITIAL_CONTEXT_FACTORY,
17.          "com.sun.jndi.fscontext.RefFSContextFactory");
18.          env.put(Context.PROVIDER_URL, "file:/tmp/tutorial");
19.
20.
21.                   try {
22.                            // Create the initial context
23.                            Context ctx = new InitialContext(env);
24.
25.                            // Perform lookup and cast to target type
26.                            File f = (File) ctx.lookup("report.txt");
27.
28.                            System.out.println(f);
29.
30.                            ctx.close();
31.                   } catch (NamingException e) {
32.                            System.out.println("Lookup failed: " + e);
33.                            }
34.                   }
35. }

Context un' interfaccia che specifica un naming context cioè un insieme di associazioni nome-oggetto. Questa interfaccia fornisce i metodi per aggiungere cancellare associare e cercare gli oggetti. Uno di questi metodi è lookup
InitialContext è un'implementazione dell'interfaccia Context e rappresenta un punto di partenza per la risoluzione dei nomi.
static string INITIAL_CONTEXT_FACTORY costante che tiene il nome delle proprietà dell'ambiente per specificare l' initial context factory da usare.
static String PROVIDER_URL costante tiene il nome delle proprietà dell'ambiente per specificare informazioni che il service provider deve usare.
Righe 16-17: java.naming.factory.initial env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory")
;Seleziona il file system service provider specificando il nome della classe dell' initial context factory per il provider.

Riga 18: java.naming.provider.url env.put(Context.PROVIDER_URL, "file:/tmp/tutorial");Specifica il file che deve essere usato come root context, cioè un file URL che rappresenta una directory nel file system.

Risorse: The JNDI Tutorial



Username:
Password:
To sign up for an account, click register... Register
Hide





Powered By



Campagna Anti-IF


Skin


PARTNER
Zio Budda
HostingJava


LICENZA



Eccetto dove diversamente specificato, i contenuti di questo sito sono rilasciati sotto licenza Creative Commons

Sitemap  © 2002-2004 Copyright Information. Privacy . Today is domenica 1 agosto 2010