Pemahaman umum JNDI:
JNDI (Java Naming and Directory Interface) Ini menyediakan satu set antarmuka yang menggunakan layanan penamaan dan direktori. Pengguna dapat menggunakan layanan penamaan dan direktori melalui itu. Sama seperti JDBC. JNDI mencakup dua bagian: layanan bernama dan layanan direktori, di mana layanan direktori berisi objek objek direktori, yang berisi beberapa objek atribut. Memberikan banyak operasi pada properti.
Layanan Penamaan dan Direktori:
Kami telah menggunakan layanan penamaan dan direktori, seperti sistem file sistem operasi, yang memberi kami fungsi seperti operasi, kueri, penambahan dan penghapusan file. Layanan DNS mengikat URL dan alamat IP bersama -sama. Fungsi terpenting dari sistem penamaan dan direktori adalah mengikat nama dan objek. Atas dasar itu, ia juga menyediakan lebih banyak fungsi seperti pencarian dan pencarian. Selain itu, benda -benda yang disimpan memiliki hierarki tertentu. Menggunakan layanan seperti itu, kami dapat mengelola dan mengoperasikan objek secara lebih efektif.
Layanan penamaan memetakan nama ke objek. Registry RMI dan Layanan Penamaan Corba keduanya adalah layanan penamaan.
Layanan Direktori juga menyimpan objek, tetapi layanan direktori mengenali sifat -sifat yang relevan dari objek -objek ini. Anda dapat menggunakan properti proyek untuk mencari direktori.
Pada awal 1990 -an, protokol akses direktori ringan (LightWeightDiretoryAccessProtocol) dikembangkan sebagai protokol direktori standar, dan JNDI dapat mengakses LDAP.
J2SE menyediakan 5 paket ekstensi untuk JNDI:
Konteks: Konteks adalah serangkaian ikatan nama-ke-objek, yang dapat dipahami sebagai hierarki atau direktori. Ini juga dapat menyertakan lapisan subkonteks berikutnya. Mendapatkan konteks awal saat menggunakan layanan penamaan dan direktori adalah entri ke seluruh operasi namespace. Dalam layanan direktori adalah Dircontext.
JNDI (Java Naming and Directory Interface) adalah API yang dirancang oleh aplikasi yang memberi pengembang antarmuka umum dan terpadu untuk menemukan dan mengakses berbagai layanan namanya dan direktori. JDBC dibangun di atas lapisan abstraksi.
Direktori dan layanan yang ada yang dapat diakses JNDI adalah:
DNS, XNAM, Layanan Direktori Novell, LDAP (Protokol Akses Direktori Ringan), Layanan Objek CORBA, Sistem File, Windows XP/2000/NT/ME/9X Registry, RMI, DSML V1 & V2, NIS.
Keuntungan JNDI:
Ini berisi sejumlah besar layanan penamaan dan direktori, menggunakan antarmuka umum untuk mengakses berbagai jenis layanan; Ini dapat dihubungkan ke beberapa penamaan atau layanan direktori secara bersamaan; Ini menetapkan asosiasi logis, memungkinkan nama dikaitkan dengan objek atau sumber daya Java tanpa harus memandu ID fisik objek atau sumber daya.
Paket Jndi:
JNDI vs. JDBC:
JNDI menyediakan cara terpadu untuk menemukan dan mengakses layanan di jaringan. Dengan menentukan nama sumber daya yang sesuai dengan catatan dalam layanan database atau penamaan, ia mengembalikan informasi yang diperlukan untuk pembentukan koneksi basis data.
Contoh kode:
coba {konteks cntxt = initialcontext baru (); DataSource ds = (DataSource) cntxt.lookup ("jdbc/dpt");} catch (namingException ne) {...} Jndi dan JMS:
Komunikasi pesan adalah metode yang digunakan oleh komponen perangkat lunak atau aplikasi untuk berkomunikasi. JMS adalah teknologi Java yang memungkinkan aplikasi untuk membuat, mengirim, menerima, dan membaca pesan.
Contoh kode:
coba {properties env = new properties (); initialContext inictxt = new InitialContext (env); TopicConnectionFactory connFactory = (TopicConnectionFactory) inictxt.lookup ("ttopicConnectionFactory"); ...} catch (NamingException ne) {...} Kunjungi Direktori Khusus: Misalnya, seseorang adalah objek, dan ia memiliki beberapa atribut, seperti nama orang tersebut, nomor telepon, alamat email, kode pos, dan atribut lainnya. Dengan metode getattributes ()
Attribute attr = directory.getAttributes (personname) .get ("email"); string email = (string) attr.get (); Dengan menggunakan JNDI, membiarkan pelanggan menggunakan nama atau atribut objek untuk menemukan objek:
rubah = direktori.search ("o = wiz, c = us", "sn = fox", kontrol); Contoh menemukan printer dengan menggunakan JNDI untuk menemukan objek seperti printer dan database:
Printer printer = (printer) namespace.lookup (printername); printer.print (dokumen);
Jelajahi Namespaces:
Daftar NamingEnumeration = namespace.list ("o = widget, c = us"); while (list.hasmore ()) {nameClassPair entri = (nameClassPair) list.next (); display (entry.getName (), entri.getClassName ());}Contoh Kode: Getikan kembali nama, nama kelas, dan objek terikat.
Namingenumeration namenumlist = ctxt.listBinding ("cntxtName"); ... while (namenumlist.hasmore ()) {binding bnd = (pengikat) namenumlist.next (); string sobjname = bnd.getName (); string sclass (); string sobjname = bnd.getName (); string sclass (); string sobjname = bnd.getName (); string sclass (); string sobjname = bnd.getName (); string sclass (); string sobjname = bnd.getName (); string sclass (); string sobjname = bnd.getname (); string sclass (); = (SomeObject) bnd.getObject ();} Memahami konsep layanan nama dan layanan direktori akan membantu untuk menggunakan JNDI dengan lebih baik. Layanan Nama Layanan Penamaan mendefinisikan cara mengaitkan nama dengan objek dan cara menemukan objek melalui nama. Contoh tipikal adalah: nama domain DNS Associates dengan IP, dan nama file sistem file dengan file. Dalam layanan nama, konsep utama:
- Nama (Nama), Nama kode dari objek aktual dalam sistem nama, seperti nama file, nama domain, dll., Ini akan digunakan untuk menemukan objek yang terkait. Sistem yang berbeda akan memiliki spesifikasi penamaan yang berbeda, seperti menggunakan sistem file "/" untuk mewakili hierarki, sedangkan DNS menggunakan ".".
- Binding, Asosiasi Nama dan Objek Aktual.
- Referensi dan alamat. Ketika suatu objek tidak dapat disimpan secara langsung dalam sistem nama, referensi harus digunakan untuk menemukan objek yang sebenarnya melalui referensi. Dalam sistem, konten referensi yang disimpan disebut alamat. Kutipan memiliki penggunaan lain: dalam sistem nama, konsep kunci asing dalam database relasional masih kurang. Dengan menggunakan referensi, ini dapat digunakan sebagai alternatif untuk kunci asing.
-Konteks, ini adalah koleksi objek nama, menyediakan operasi utama untuk berinteraksi dengan sistem nama, seperti pencarian, pengikatan, dan de-binding. Hubungan antara konteks anak (subkonteks) mirip dengan hubungan antara direktori dan subdirektori dalam sistem file. Konteks anak terkandung dalam konteks dan dikaitkan dengan konteks anak melalui nama dalam konteks induk.
- Sistem penamaan dan ruang nama. Sistem Nama adalah kumpulan jenis konteks yang sama dan menyediakan layanan nama. Ruang nama adalah kumpulan nama dalam sistem nama, seperti nama file dan direktori sistem file.
Layanan Direktori Direktori adalah perpanjangan dari layanan nama. Selain mengaitkan nama dan objek, itu juga memungkinkan objek berisi atribut. Sistem direktori biasanya mengatur data dalam hierarki. Konsep utama dalam layanan direktori:
- Atribut, yang termasuk dalam objek direktori, itu adalah pasangan (nama, nilai), dan atribut dapat memiliki beberapa nilai.
- Direktori dan layanan direktori, direktori adalah koleksi objek direktori; Layanan Direktori menyediakan layanan terkait direktori untuk membuat, menghapus, dan memodifikasi properti objek yang disimpan di direktori.
- Pencarian dan pencarian filter, operasi memperoleh objek direktori adalah pencarian; Filter adalah objek yang mirip dengan kondisi pencarian.
Penggunaan Dasar
² Mendaftarkan penyedia JNDI sebelum menggunakan JNDI, Anda perlu mendapatkan penyedia JNDI dan mendaftarkannya dengan sistem. Properti sistem yang terkait dengan JNDI didefinisikan dalam javax.naming.context, properti yang umum digunakan:
- java.naming.factory.initial, nama kelas yang digunakan oleh penyedia layanan untuk membuat inisialcontext.
- java.naming.provider.url, digunakan untuk mengonfigurasi URL awal dari inisialcontext
-java.naming.factory.object, kelas yang digunakan untuk membuat peta nama-ke-objek, digunakan untuk nameclassPair dan referensi.
- java.naming.factory.state, kelas yang digunakan untuk membuat status jndi. Untuk layanan direktori, biasanya memerlukan pengaturan keamanan dan biasanya digunakan:
- java.naming.security.Authentication, Tipe Keamanan, Tiga Nilai: Tidak Ada, Sederhana atau Kuat.
- java.naming.security.principal, informasi otentikasi.
- java.naming.security.credentials, informasi sertifikat.
- java.naming.security.protocol, nama protokol keamanan.
Daftar dengan System.setProperty. Jika program tidak menampilkan instruksi, Java akan mencari file JDNI.Properties di ClassPath untuk menyelesaikan pendaftaran. JDNI.PROPERTIES Contoh:
java.naming.factory.initial = com.codeline.db.mockinitialcontextFactory
Layanan Koneksi
Setelah mendaftar, Anda dapat mengimplementasikan koneksi layanan. Untuk layanan nama, mulailah dengan InitialContext, Layanan Direktori Gunakan InitialDircontext. Mereka masing -masing menerapkan konteks dan dircontext. Dua antarmuka ini sesuai dengan antarmuka layanan nama dan layanan direktori, dan juga dua antarmuka terpenting dalam JNDI.
Hubungkan Layanan Nama:
System.setProperty (context.initial_context_factory, "com.sun.jndi.fscontext.fscontextFactory"); InitialContext ctx = new InitialContext ();
Terhubung ke layanan direktori:
Hashtable env = hashtable baru (); env.put (context.initial_context_factory, "com.sun.jndi.ldap.ldapctxfactory"); env.put (context.provider_url, "ldap: //myserver.com/"); env.put (context.security_authentication, "sederhana"); // Nama pengguna yang diperlukan untuk masuk ke server LDAP adalah env.put (context.security_principal, "ldapuser"); // Masuk ke LDAP kata sandi yang diperlukan oleh server adalah env.put (context.security_credentials, "mypassword"); InitialDircontext ctx = initialDircontext baru (env);
Penyedia layanan multi-layanan: Jika aplikasi berisi beberapa penyedia layanan, itu sedikit berbeda saat menghubungkan. Ambil Layanan Nama sebagai contoh
Hashtable env = hashtable baru (); env.put (context.initial_context_factory, "com.sun.jndi.rmi.registry.registryContextFactory"); env.put (context.provider_url, "rmi: //myserver.com: 1099"); // Gunakan konstruktor yang berbeda inisialContext ctx = new InitialContext (env);
Temukan benda
Apakah itu layanan nama atau layanan direktori, pencarian digunakan untuk menemukan objek. Selain menggunakan string sebagai parameter, pencarian juga dapat menggunakan antarmuka nama sebagai parameter.
Penyambut penyambut = (penyambut) ctx.lookup ("sayhello"); Jika Anda ingin mendapatkan semua nama objek dalam konteks, gunakan LIS untuk mengembalikan daftar NameClassPair. NameclassPair berisi nama objek dan nama kelas objek. Jika Anda ingin mendapatkan daftar instance objek yang sebenarnya, gunakan ListBindings, yang mengembalikan daftar mengikat. Ikatan adalah subclass dari NameClassPair, yang berisi contoh objek.
- daftar
Daftar NamingEnumeration = ctx.list ("awt"); while (list.hasmore ()) {nameClassPair nc = (nameClassPair) list.next (); System.out.println (NC); } - Listbindings
Namingenumeration binding = ctx.listBindings ("awt"); while (binding.hasmore ()) {binding bd = (binding) binding.next (); System.out.println (bd.getName () + ":" + bd.getObject ()); }
Mengikat objek
- Tambahkan Ikatan Menggunakan Bind
Buah buah = buah baru ("jeruk"); ctx.bind ("favorit", buah); - Gunakan rebind untuk memodifikasi pengikatan
Buah buah = buah baru ("lemon"); ctx.rebind ("favorit", buah); - Gunakan unbind untuk menghapus binding.
ctx.unbind ("favorit");
Ubah nama objek
Gunakan ganti nama untuk mengubah nama objek dalam konteks
ctx.rename ("Report.txt", "old_report.txt");- Antarmuka yang terkait dengan memperoleh atribut atribut adalah atribut dan atribut, yang keduanya ada dalam paket javax.naming.directory. Anda bisa mendapatkan atribut objek yang ditetapkan melalui metode GetAttributes dari DirContext, kemudian menggunakan metode GET atribut untuk mendapatkan atribut yang sesuai, dan akhirnya Anda bisa mendapatkan nilai atribut melalui metode GET Atribut.
String dn = "uid = saya, dc = myCompany, dc = com, ou = customer, o = exampleApp"; Konteks pengguna = (konteks) ctx.lookup (dn); // Dapatkan semua atribut atribut attrs = user.getattributes (""); Atribut test = attrs .get ("test"); Objek testValue = test.get ();Dalam contoh di atas, semua atribut pengguna diperoleh. Dalam penggunaan aktual, mengingat dampak bandwidth jaringan, Anda dapat menetapkan daftar atribut yang akan diperoleh:
String reqd_attrs = string baru [] {"nama keluarga", "inisial", "judul", "rfc822mailAlalias"}; Atribut attrs = user.getAttributes ("", reqd_attrs);
Temukan dan filter
Gunakan metode pencarian untuk menyelesaikan.
Dircontext publik [] findUser (inisial string, nama string, string country, string phone) {// Kondisi konstruksi BasicAttributes search_attrs = new BasicAttributes (); search_attrs.put ("inisial", inisial); search_attrs.put ("sn", insiden); search_attrs.put ("c", negara); if (phone! = null) search_attrs.put ("phoneNumber", telepon); Namingenumeration hasil = initial_ctx.search ("ou = customer, o = exampleApp", search_attrs); LinkedList Found = new LinkedList (); while (results.hasmore ()) {searchResults sr = (searchResults) results.next (); Name string = sr.getName (); Objek ctx = sr.getObject (); if ((ctx == null) ||! (CTX instance dari dircontext)) found.add (initial_ctx.lookup (name)); lain Found.Add (CTX); } Dircontext [] ret_val = dircontext baru [found.size ()]; found.toArray (ret_val); return ret_val; }
Metode pemfilteran utama antarmuka dircontext:
1. Gunakan string filter
String reqd_attrs = string baru [] {"cn", "uid", "rfc822mailalias"}; Namingenumeration hasil = initial_ctx.search ("ou = customer, o = exampleApp", search_attrs, reqd_attrs);
2. Gunakan Pencarian Kontrol untuk mendapatkan lebih banyak kontrol
Pencarian ctrls = new SearchControls (); ctrls.setCountLimit (20); ctrls.settimelimit (5000); ctrls.setsearchscope (SearchControls.subtree_scope); Namingenumeration hasil = initial_ctx.search ("cat = buku, ou = produk, o = exampleApp", "title =*java*", ctrls); Ubah Properti
Ini dilakukan dengan menggunakan metode ModifyAttributes dari DirContext dan InitialDircontext. Proses modifikasi yang disebut sebenarnya untuk pertama kali membangun daftar atribut yang akan dimodifikasi dan kemudian mengirimkan menggunakan metode di atas. Ketika suatu properti berisi beberapa nilai, perlu untuk memasukkan nilai properti yang tidak dimodifikasi, jika tidak, server akan menghapus nilai -nilai tersebut jika tidak lagi diperlukan.
public void updateAddress (String dn, string address, string country, string phone) {BasicAttributes mod_attrs = new BasicAttributes (); if (alamat! = null) mod_attrs.put ("alamat", alamat); if (country! = null) mod_attrs.put ("c", country); if (phone! = null) mod_attrs.put ("phoneNumber", telepon); if (mod_attrs.size ()! = 0) initial_ctx.modifyattributes (dn, dircontext.replace_attribute, mod_attrs); } Menggunakan ModificationItem, Anda juga dapat melakukan beberapa operasi modifikasi yang berbeda sekaligus:
ModificationItem [] mod_items = ModificationItems baru [2]; Atribut Email = BasicAttribute baru ("RFC822MailAlalias", new_email); ModificationItem email_mod = modificationItem baru (dircontext.add_attribute, email); Atribut addr = new BasicAttribute ("alamat", alamat); ModificationItem addr_mod = ModificationItem baru (dircontext.replace_attribute, addr); mod_items [0] = email_mod; mod_items [1] = addr_mod; initial_ctx.modifyattributes (dn, mod_items); Buat konteks
Gunakan metode CreateSubContext untuk menyelesaikannya.
BasicAttributes attrs = BasicAttributes baru (); attrs.put ("inisial", inisial); attrs.put ("sn", insiden); attrs.put ("rfc822mailalias", email); if (alamat! = null) attrs.put ("alamat", alamat); if (country! = null) attrs.put ("c", country); if (phone! = null) attrs.put ("phonenumber", telepon); initial_ctx.createSubContext (dn, attrs);
Hapus konteksnya
Gunakan Metode CrashySubContext untuk menyelesaikannya.
initial_ctx.destroysubcontext (dn);
Contoh
Ini contoh lain.
Konfigurasi di tomcat's conf/server.xml:
<Context Path = "/jndi"> <name sumber daya = "bean/mybeanfactory" auth = "container" type = "com.huawei.jndi.bean.mybean" factory = "org.apache.naming.factory.beanfactory" bar = "23"/</Context>
Komponen dinyatakan dalam tomcat di atas, dan Anda bisa mendapatkan komponen ini dalam kode:
coba {context initContext = new InitialContext (); Konteks envctx = (konteks) initcontext.lookup ("java: comp/env"); Mybean bean = (mybean) quids.lookup ("bean/mybeanfactory"); System.out.println (bean.getBar ()); } catch (Exception e) {E.PrintStackTrace (); }Ringkasan: Konfigurasikan komponen JNDI di Tomcat, dan kemudian dapatkan komponen yang dilengkapi dalam kode.
Kelas implementasi JNDI dari setiap wadah web berbeda. Misalnya, di JBoss, kelas penyediaan JNDI adalah org.jnp.interfaces.namingContextFactory, yang berbeda dari Tomcat.
Dari sudut pandang ini, peran JNDI mirip dengan injeksi ketergantungan musim semi. Namun, melalui JNDI, dimungkinkan untuk mendapatkan komponen di seluruh aplikasi dan bahkan lintas domain. Komponen yang dikonfigurasi di server A dapat diperoleh melalui JNDI di server lain B.
Spring juga menyediakan enkapsulasi JNDI, yang lebih nyaman digunakan. Berikut ini adalah contoh.
<!-Template Jndi-> <bean id = "jnditemplate"> <name properti = "lingkungan"> <sops> <prop key = "java.naming.factory.initial"> org.jnp.interfaces.namingcontextFactory </prop> <prop> <prop> <prop> <prop> <prop> <prop> <prop> 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> props>-org.jboss.naming </prop> </props> </props> id = "JMSConnectionFactory"> <name properti = "jnditemplate" ref = "jnditemplate" /> <name properti = "jndiname" value = "TopicConnectionFactory" /> </ bean>
Deklarasikan JNDItemplate pertama, konfigurasikan alamat target dan kelas penyediaan layanan JNDI. Kemudian, melalui JNDiObjectFactoryBean, Anda dapat dengan mudah mendapatkan komponen JNDI dan melakukan konversi jenis.