Ein allgemeines Verständnis von JNDI:
JNDI (Java -Namens- und Verzeichnisschnittstelle) Es bietet eine Reihe von Schnittstellen, die Benennungs- und Verzeichnisdienste verwenden. Benutzer können Benennungs- und Verzeichnisdienste dadurch verwenden. Genau wie JDBC. JNDI enthält zwei Teile: den benannten Dienst und den Verzeichnisdienst, in dem das Verzeichnisdienst das Verzeichnisobjektverzeichnisobjekt enthält, das mehrere Attributobjekte enthält. Bietet viele Vorgänge für Eigenschaften.
Namens- und Verzeichnisdienste:
Wir haben Benennungs- und Verzeichnisdienste verwendet, wie das Dateisystem des Betriebssystems, das uns Funktionen wie Vorgänge, Abfragen, Addition und Löschen von Dateien bietet. Der DNS -Dienst bindet die URL und die IP -Adresse zusammen. Die wichtigste Funktion von Namens- und Verzeichnissystemen besteht darin, Namen und Objekt zu binden. Auf der Grundlage davon bietet es auch mehr Funktionen wie Such- und Suche. Darüber hinaus haben die gespeicherten Objekte eine bestimmte Hierarchie. Mit einem solchen Dienst können wir Objekte effektiver verwalten und bedienen.
Der Namensnamens Service ordnet einen Namen einem Objekt ab. RMI Registry und CORBA -Namensdienst sind beide Benennungsdienste.
Der Verzeichnisdienst speichert auch Objekte, aber der Verzeichnisdienst erkennt die relevanten Eigenschaften dieser Objekte an. Sie können Projekteigenschaften verwenden, um nach Verzeichnissen zu suchen.
In den frühen neunziger Jahren wurde das Lightweight Directory Access Protocol (LightweightDiretoryAccessProtocol) als Standardverzeichnisprotokoll entwickelt, und JNDI konnte auf LDAP zugreifen.
J2SE bietet 5 Erweiterungspakete für JNDI:
Kontext: Kontext ist eine Reihe von Namen zu Objektbindungen, die als Hierarchie oder Verzeichnis verstanden werden können. Es kann auch die nächste Schicht des Subkontextes enthalten. Der anfängliche Kontext bei der Verwendung von Benennungs- und Verzeichnisdiensten ist der Eintrag zum gesamten Namespace -Betrieb. Im Verzeichnis ist Dircontext.
JNDI (Java-Namens- und Verzeichnisschnittstelle) ist eine von Applicen entworfene API, die Entwicklern eine gemeinsame und einheitliche Schnittstelle bietet, um verschiedene benannte und Verzeichnisdienste zu finden und zugreifen zu können. JDBC basiert auf der Abstraktionsschicht.
Die vorhandenen Verzeichnisse und Dienste, auf die JNDI zugreifen kann, sind:
DNS, XNAM, Novell Directory Service, LDAP (Lightweight Directory Access Protocol), CORBA -Objektdienst, Dateisystem, Windows XP/2000/NT/ME/9x Registrierung, RMI, DSML V1 & V2, NIS.
Vorteile von JNDI:
Es enthält eine große Anzahl von Namens- und Verzeichnisdiensten, die eine gemeinsame Schnittstelle verwenden, um auf verschiedene Arten von Diensten zuzugreifen. Es kann gleichzeitig mit mehreren Namens- oder Verzeichnisdiensten verbunden werden. Es stellt logische Assoziationen fest, sodass Namen Java -Objekte oder Ressourcen zugeordnet werden können, ohne die physische ID der Objekte oder Ressourcen leiten zu müssen.
JNDI -Paket:
JNDI gegen JDBC:
JNDI bietet eine einheitliche Möglichkeit, Dienste im Netzwerk zu finden und zuzugreifen. Durch Angeben eines Ressourcennamens, der einem Datensatz in der Datenbank- oder Benennungsdienst entspricht, wird die für die Datenbankverbindungsanlage erforderlichen Informationen zurückgegeben.
Codebeispiel:
try {context cntxt = new initialContext (); dataSource ds = (dataSource) cntxt.lookup ("jdbc/dpt");} catch (namingException ne) {...} JNDI und JMS:
Nachrichtenkommunikation ist eine Methode, die von Softwarekomponenten oder Anwendungen zur Kommunikation verwendet wird. JMS ist eine Java -Technologie, mit der Anwendungen Nachrichten erstellen, senden, empfangen und lesen können.
Codebeispiel:
try {properties env = new Properties (); InitialContext Inictxt = New initialContext (env); topicConnectionFactory connfactory = (topicConnectionFactory) Inictxt.lookup ("TtopicConnectionFactory"); Besuchen Sie spezifische Verzeichnisse: Beispielsweise ist eine Person ein Objekt, und sie verfügt über mehrere Attribute, wie den Namen der Person, die Telefonnummer, die E -Mail -Adresse, die Postleitzahl und andere Attribute. Durch GetatTributes () -Methode
Attribut attr = Verzeichnis.GetAttributes (PersonName) .get ("E -Mail"); String mail = (String) attr.get (); Durch die Verwendung von JNDI können Kunden den Namen oder die Attribute des Objekts verwenden, um Objekte zu finden:
Foxes = Directory.Search ("O = Wiz, c = us", "sn = fox", kontrolliert); Beispiele für die Suche nach Druckern, indem JNDI verwendet wird, um Objekte wie Drucker und Datenbanken zu finden:
Drucker drucker = (drucker) Namespace.lookup (Printername); Drucker.print (Dokument);
Durchsuchen Sie Namespaces:
Namingenumeration list = namespace.list ("o = widget, c = us"); while (list.hasmore ()) {nameclassspaireintrag = (nameclassspair) list.next (); display (Entry.getName (), Entry.getClassName ());}CODE-Beispiel: Nehmen Sie den Namen, den Klassennamen und das gebundene Objekt erneut ab.
Namingenumeration namenumlist = ctxt.listbinding ("cntxtName"); Bnd.getObject ();} Das Verständnis der Konzepte von Namensdiensten und Verzeichnisdiensten wird dazu beitragen, JNDI besser zu nutzen. Der Namensnamen des Namensnamens definiert, wie Sie einen Namen mit einem Objekt verknüpfen und wie ein Objekt über einen Namen findet. Typische Beispiele sind: DNS Associates -Domain -Namen mit IP und Dateisysteme Associates Dateinamen mit Dateien. Im Namensdienst die Hauptkonzepte:
- Namen (Namen), der Codename des tatsächlichen Objekts im Namenssystem, z. B. Dateinamen, Domain -Namen usw., wird verwendet, um das zugehörige Objekt zu finden. Unterschiedliche Systeme haben unterschiedliche Namensschwerpunkte, z. B. das Dateisystem "/", um die Hierarchie darzustellen, während DNS "verwendet".
- Bindungen, die Assoziation von Namen und tatsächlichen Objekten.
- Referenzen und Adressen. Wenn ein Objekt nicht direkt im Namenssystem gespeichert werden kann, muss eine Referenz verwendet werden, um das tatsächliche Objekt durch Referenz zu finden. Im System wird der Inhalt der gespeicherten Referenz als Adresse bezeichnet. Zitate haben eine weitere Verwendung: Im Namenssystem fehlt das Konzept der Fremdschlüssel in relationalen Datenbanken. Durch die Verwendung von Referenzen kann es als Alternative zu Fremdschlüssel verwendet werden.
-Kontext, es handelt sich um eine Sammlung des Namensobjekts, die die Hauptvorgänge zur Interaktion mit dem Namenssystem wie Suche, Bindung und Entbindung bereitstellt. Die Beziehung zwischen dem untergeordneten Kontext (Subcontext) ähnelt der Beziehung zwischen Verzeichnissen und Unterverzeichnissen in einem Dateisystem. Der untergeordnete Kontext ist in einem Kontext enthalten und ist mit dem untergeordneten Kontext durch einen Namen im übergeordneten Kontext verbunden.
- Namenssysteme und Namespaces. Das Namenssystem ist eine Sammlung desselben Kontextyps und bietet Namensdienste. Der Namensraum ist eine Sammlung von Namen im Namenssystem, z. B. Dateinamen und Verzeichnisse des Dateisystems.
Directory Service Directory Service ist eine Erweiterung des Namensdienstes. Zusätzlich zum Zusammenhang mit Namen und Objekten können Objekte Attribute enthalten. Verzeichnissysteme organisieren normalerweise Daten in einer Hierarchie. Die Hauptkonzepte in Verzeichnisdiensten:
- Attribute, die zu einem Verzeichnisobjekt gehört, handelt es sich um ein (Name, Wert), und das Attribut kann mehrere Werte haben.
- Verzeichnisse und Verzeichnisdienste, Verzeichnisse sind Sammlungen von Verzeichnisobjekten; Verzeichnisdienste bieten Verzeichnisdienste zur Erstellung, Löschung und Änderung der Eigenschaften von im Verzeichnis gespeicherten Objekten.
- Suchanfragen und Suchfilter, der Betrieb des Erhalts von Verzeichnisobjekten ist die Suche. Filter sind Objekte, die den Suchbedingungen ähneln.
Grundnutzung
² Registrieren eines JNDI -Anbieters Bevor Sie JNDI verwenden, müssen Sie den JNDI -Anbieter erhalten und beim System registrieren. Systemeigenschaften im Zusammenhang mit JNDI sind in javax.naming.context definiert, häufig verwendete Eigenschaften:
- java.naming.factory.initial, der vom Dienstanbieter zum Erstellen des InitialContext verwendete Klassenname.
- java.naming.provider.url, verwendet, um die anfängliche URL von InitialContext zu konfigurieren
-Java.naming.Factory.Object, eine Klasse, die zum Erstellen von Namen zu Objektkarten verwendet wird, die für Nameclassspair und Referenzen verwendet werden.
- java.naming.factory.state, die Klasse, die zum Erstellen von JNDI -Staat verwendet wird. Für Verzeichnisdienste sind in der Regel Sicherheitseinstellungen erforderlich und wird normalerweise verwendet:
- java.naming.security.authentication, Sicherheitstyp, drei Werte: Keine, einfach oder stark.
- java.naming.security.principal, Authentifizierungsinformationen.
- java.naming.security.credentials, Zertifikatsinformationen.
- java.naming.security.protocol, Sicherheitsprotokoll Name.
Registrieren Sie sich bei System.setProperty. Wenn das Programm die Anweisungen nicht anzeigt, wird Java nach der Datei jdni.properties im Klassenpfad suchen, um die Registrierung abzuschließen. Jdni.Properties Beispiel:
java.naming.factory.initial = com.codeline.db.MockinitialContextFactory
Verbindungsdienst
Nach der Registrierung können Sie die Serviceverbindung implementieren. Beginnen Sie für Namensdienste mit dem InitialContext. Directory Services verwenden Initialdircontext. Sie implementieren Kontext bzw. Dircontext. Diese beiden Schnittstellen entsprechen den Schnittstellen von Namensdiensten und Verzeichnisdiensten und sind auch die beiden wichtigsten Schnittstellen in JNDI.
Namensdienst anschließen:
System.setProperty (context.initial_context_factory, "com.sun.jndi.fscontext.fscontextFactory"); InitialContext ctx = new initialContext ();
Verbindung zu Verzeichnisdiensten herstellen:
Hashtable env = neuer Hashtable (); env.put (context.initial_context_factory, "com.sun.jndi.ldap.ldapctxfactory"); env.put (context.provider_url, "ldap: //myserver.com/"); env.put (context.security_authentication, "einfach"); // Der Benutzername, der zum Anmelden beim LDAP -Server erforderlich ist, ist Env.put (context.security_principal, "ldapuser"); // Melden Sie sich bei LDAP an, das vom Server erforderliche Kennwort ist Env.put (context.security_credentials, "myPassword"); Initialdircontext ctx = new initialdircontext (env);
Multi-Service-Anbieter: Wenn die Anwendung mehrere Dienstanbieter enthält, unterscheidet sich sie beim Anschließen geringfügig. Nehmen Sie den Namensdienst als Beispiel
Hashtable env = neuer Hashtable (); env.put (context.initial_context_factory, "com.sun.jndi.rmi.registry.registryContextFactory"); env.put (context.provider_url, "rmi: //myserver.com: 1099"); // Verwenden Sie verschiedene Konstruktoren initialContext ctx = new initialContext (env);
Objekte finden
Unabhängig davon, ob es sich um einen Namensdienst oder ein Verzeichnisdienst handelt, wird die Suche verwendet, um Objekte zu finden. Zusätzlich zur Verwendung von String als Parameter kann die Suche auch die Namensschnittstelle als Parameter verwenden.
Begrüßer Begrüßer = (Begrüßer) ctx.lookup ("Sayhello"); Wenn Sie alle Objektnamen im Kontext erhalten möchten, verwenden Sie LIS, um die Liste der Namensklasspair -Liste zurückzugeben. Nameclassspair enthält Objektnamen und Objektklassenname. Wenn Sie die tatsächliche Liste der Objektinstanzen erhalten möchten, verwenden Sie Listbindings, die die Bindungsliste zurückgibt. Die Bindung ist eine Unterklasse von Nameclassspair, die Instanzen von Objekten enthält.
- Liste
Namingenumeration list = ctx.list ("awt"); while (list.hasmore ()) {nameclassspair nc = (nameclassspair) list.next (); System.out.println (NC); } - Listbindings
Namingenumerationsbindungen = ctx.listbindings ("awt"); while (bindungen.hasmore ()) {Bindung bd = (Bindung) Bindungen.Next (); System.out.println (bd.getName () + ":" + bd.getObject ()); }
Objektbindung
- Bindung mit BIND hinzufügen
Fruchtfrucht = neue Frucht ("Orange"); ctx.bind ("Favorit", Frucht); - Verwenden Sie Rebind, um die Bindung zu ändern
Fruchtfrucht = neue Frucht ("Zitrone"); Ctx.Rebind ("Favorit", Frucht); - Entfernen Sie die Bindungen nicht.
Ctx.unbind ("Favorit");
Benennen Sie das Objekt um
Verwenden Sie umbenannt, um ein Objekt im Kontext umzubenennen
ctx.rename ("report.txt", "old_report.txt");- Die Schnittstellen, die sich auf das Erhalten von Attributattributen beziehen, sind Attribut und Attribute, die sich beide im Paket von Javax.naming.Directory befinden. Sie können das Attribut des Objekts über die GetAtTRibutes -Methode des Dircontext einstellen, dann die GET -Methode der Attribute verwenden, um die entsprechenden Attribute zu erhalten, und schließlich können Sie den Attributwert über die GET -Methode des Attributs erhalten.
String dn = "uid = me, dc = myCompany, dc = com, ou = customer, o = exampleApp"; Context user = (context) ctx.lookup (dn); // Alle Attributattribute abrufen attrs = user.getAttributes (""); Attribut test = attrs .get ("test"); Objekt testValue = test.get ();Im obigen Beispiel werden alle Attribute des Benutzers erhalten. In der tatsächlichen Verwendung können Sie unter Berücksichtigung der Auswirkungen der Netzwerkbandbreite die Liste der zu erhaltenen Attribute festlegen:
String reqd_attrs = new String [] {"Nachname", "Initialen", "Titel", "rfc822Mailalias"}; Attribute attrs = user.getAttributes ("", reqd_attrs);
Finden und filtern
Verwenden Sie die Suchmethode, um abzuschließen.
public dircontext [] findUser (String -Initiale, String -Nachname, String Country, String -Telefon) {// BAUSE -Bedingungen BasicAttributes search_attrs = new BasicAttributes (); Search_attrs.put ("Initialen", Initialen); Search_attrs.put ("sn", Vorfall); Search_attrs.put ("C", Land); if (Telefon! = NULL) Search_attrs.put ("PhoneNumber", Telefon); Namingenumeration results = initial_ctx.search ("ou = customer, o = exampleApp", search_attrs); LinkedList found = new LinkedList (); while (results.hasmore ()) {SearchResults sr = (SearchResults) results.Next (); String name = sr.getName (); Objekt ctx = sr.getObject (); if ((ctx == null) ||! (ctx instanceof dircontext)) found.add (initial_ctx.lookup (name)); sonst gefunden.add (ctx); } Dircontext [] ret_val = new DirContext [found.size ()]; found.toArray (ret_val); ret_val zurückgeben; }
Die Hauptfiltermethoden der Dircontext -Schnittstelle:
1. Verwenden Sie Filterketten
String reqd_attrs = new String [] {"cn", "uid", "rfc822Mailalias"}; Namingenumeration resultes = initial_ctx.search ("ou = customer, o = exampleApp", search_attrs, reqd_attrs);
2. Verwenden Sie SearchControls, um mehr Kontrolle zu erhalten
SearchControls ctrls = new SearchControls (); Strls.setCountLimit (20); Strls.settimelimit (5000); ctrls.setSearchScope (SearchControls.subtree_Scope); Namingenumerationsergebnisse = initial_ctx.search ("cat = books, ou = products, o = exampleApp", "title =*java*", Strgs); Eigenschaften ändern
Es geschieht mit den ModifyAttributes -Methoden von DirContext und initialdircontext. Der sogenannte Änderungsprozess besteht darin, zuerst die Liste der zu ändernden Attribute zu erstellen und dann mit der oben genannten Methode einzureichen. Wenn eine Eigenschaft mehrere Werte enthält, müssen die nicht modifizierten Werte der Eigenschaft einbezogen werden, da der Server diese Werte ansonsten löscht, wenn sie nicht mehr benötigt werden.
public void updateaddress (String DN, String -Adresse, String Country, String -Telefon) {BasicAttributes mod_attrs = new BasicAttributes (); if (Adresse! = null) mod_attrs.put ("Adresse", Adresse); if (Land! = null) mod_attrs.put ("C", Land); if (Telefon! = null) mod_attrs.put ("PhoneNumber", Telefon); if (mod_attrs.size ()! } Mit ModificationItem können Sie auch mehrere verschiedene Modifikationsvorgänge gleichzeitig ausführen:
ModificationItem [] mod_items = new ModificationItems [2]; Attribut -E -Mail = new BasicAttribute ("RFC822Mailalias", new_email); ModificationItem E -Mail_MOD = new ModificationItem (Dircontext.add_attribute, E -Mail); Attribut addr = new BasicAttribute ("Adresse", Adresse); ModificationItem adDr_mod = new ModificationItem (DirContext.Replace_attribute, adDr); mod_items [0] = E -Mail_MOD; mod_items [1] = addr_mod; initial_ctx.modifyAttributes (dn, mod_items); Erstellen Sie einen Kontext
Verwenden Sie die erstellige Methode für die Erzeugung.
BasicAttributes attrs = new BasicAttributes (); attr.put ("Initialen", Initialen); attr.put ("sn", Vorfall); attr.put ("RFC822Mailalias", E -Mail); if (Adresse! = null) attr.put ("Adresse", Adresse); if (Land! = null) attr.put ("C", Land); if (Telefon! = null) attr.put ("PhoneNumber", Telefon); initial_ctx.createSubContext (dn, attrs);
Löschen Sie den Kontext
Verwenden Sie die Zerstörungs -SubContext -Methode, um zu vervollständigen.
initial_ctx.destroySubContext (dn);
Beispiel
Hier ist ein weiteres Beispiel.
Konfigurieren Sie in Tomcats conf/server.xml:
<Context path = "/jndi"> <ressourcenname = "bean/mybeanfactory" auth = "container" type = "com.huawei
Eine Komponente wird oben in Tomcat deklariert, und Sie können diese Komponente im Code erhalten:
try {context initcontext = new initialContext (); Context envctx = (context) initcontext.lookup ("java: comp/env"); Mybean bean = (mybean) envctx.lookup ("Bean/mybeanfactory"); System.out.println (Bean.getBar ()); } catch (Ausnahme e) {e.printstacktrace (); }Zusammenfassung: Konfigurieren Sie die JNDI -Komponente in Tomcat und erhalten Sie dann die ausgestatteten Komponenten im Code.
Die JNDI -Implementierungsklassen jedes Webcontainers sind unterschiedlich. In JBoss ist die JNDI -Provisionsklasse beispielsweise org.jnp.interfaces.namingContextFactory, das sich von Tomcat unterscheidet.
Aus dieser Sicht ähnelt die Rolle von JNDI der der Abhängigkeitsinjektion des Frühlings. Durch JNDI ist es jedoch möglich, Komponenten über Anwendungen und sogar über Bereiche hinweg zu erhalten. Auf dem Server A konfigurierte Komponenten A können über JNDI auf einem anderen Server B erhalten werden. B.
Die Spring bietet auch eine Kapselung von JNDI, die bequemer zu verwenden ist. Das Folgende ist ein Beispiel.
<!-JNDI-Vorlage-> <bean id = "jndItemplate"> <Eigenschaft name = "Umgebung"> <props> <prop key = "java.naming.factory.initial"> org.jnp.Interfaces.NamingContextFactory </props> <propa.propa key="java.naming.provider.url">10.137.96.212:18199</prop> <prop key="java.naming.factory.url.pkgs">org.jnp.interfaces:org.jboss.naming</prop> </props> </property> </bean> <!-- Create a connection factory --> <bean id = "jmsConnectionFactory"> <Eigenschaft name = "jndItemplate" ref = "jndItemplate" /> <Eigenschaft name = "jndiname" value = "topicConnectionFactory" /> < /bean>
Deklarieren Sie zuerst JNDItemplate, konfigurieren Sie die Zieladresse und die JNDI -Dienstbereitungsklassen. Durch JNDIObjectFactoryBean können Sie dann problemlos JNDI -Komponenten erhalten und die Typumwandlung durchführen.