فهم عام لـ JNDI:
JNDI (Java Naming and Directory Interface) يوفر مجموعة من الواجهات التي تستخدم خدمات التسمية والدليل. يمكن للمستخدمين استخدام خدمات التسمية والدليل من خلالها. تماما مثل JDBC. يتضمن JNDI جزأين: خدمة اسم وخدمة الدليل المسماة ، حيث تحتوي خدمة الدليل على كائن دليل كائن الدليل ، والذي يحتوي على العديد من كائنات السمات. يوفر العديد من العمليات على العقارات.
خدمات التسمية والدليل:
نحن نستخدم خدمات التسمية والدليل ، مثل نظام ملفات نظام التشغيل ، والذي يوفر لنا وظائف مثل العمليات والاستعلامات وإضافة وحذف الملفات. تربط خدمة DNS عنوان URL وعنوان IP معًا. إن أهم وظيفة أنظمة التسمية والدليل هي ربط الاسم والكائن. على أساس ذلك ، فإنه يوفر أيضًا المزيد من الوظائف مثل البحث والبحث. علاوة على ذلك ، فإن الأشياء المخزنة لها تسلسل هرمي معين. باستخدام مثل هذه الخدمة ، يمكننا إدارة وتشغيل الكائنات بشكل أكثر فعالية.
تقوم خدمة التسمية بتعيين اسم لكائن. RMI Registry و Corba Dampying Service هي خدمات التسمية.
تقوم خدمة الدليل أيضًا بتخزين الكائنات ، لكن خدمة الدليل تتعرف على الخصائص ذات الصلة لهذه الكائنات. يمكنك استخدام خصائص المشروع للبحث عن الدلائل.
في أوائل التسعينيات ، تم تطوير بروتوكول الوصول إلى الدليل الخفيف (LightweightDiretoryAccessProtocol) كبروتوكول دليل قياسي ، وتمكنت JNDI من الوصول إلى LDAP.
يوفر J2SE 5 حزم تمديد لـ JNDI:
السياق: السياق عبارة عن مجموعة من روابط الاسم إلى الكائن ، والتي يمكن فهمها على أنها تسلسل هرمي أو دليل. يمكن أن يشمل أيضًا الطبقة التالية من subcontext. الحصول على سياق أولي عند استخدام خدمات التسمية والدليل هو الإدخال إلى عملية مساحة الاسم بأكملها. في خدمة الدليل هي dirContext.
JNDI (Java Camping and Directory Interface) هي واجهة برمجة تطبيقات مصممة من تصميم التطبيقات التي توفر للمطورين واجهة مشتركة وموحدة للعثور على خدمات مختلفة وخدمة الدليل والوصول إليها. تم بناء JDBC على طبقة التجريد.
الدلائل والخدمات الحالية التي يمكن لـ JNDI الوصول إليها هي:
DNS ، Xnam ، Novell Directory Service ، LDAP (بروتوكول الوصول إلى الدليل الخفيف) ، خدمة كائن Corba ، نظام الملفات ، سجل Windows XP/2000/NT/ME/9X ، RMI ، DSML V1 و V2 ، NIS.
مزايا JNDI:
أنه يحتوي على عدد كبير من خدمات التسمية والدليل ، باستخدام واجهة مشتركة للوصول إلى أنواع مختلفة من الخدمات ؛ يمكن توصيله بخدمات التسمية أو الدليل المتعددة في نفس الوقت ؛ إنه يحدد ارتباطات منطقية ، مما يسمح لترابط الأسماء بكائنات أو موارد Java دون الحاجة إلى توجيه المعرف المادي للكائنات أو الموارد.
حزمة Jndi:
Jndi vs. JDBC:
يوفر JNDI طريقة موحدة للعثور على الخدمات والوصول إليها على الشبكة. من خلال تحديد اسم مورد يتوافق مع سجل في قاعدة البيانات أو خدمة التسمية ، فإنه يعيد المعلومات اللازمة لتأسيس اتصال قاعدة البيانات.
مثال رمز:
جرب {context cntxt = جديد initialContext () ؛ datasource ds = (dataSource) cntxt.lookup ("jdbc/dpt") ؛} catch (namingexception ne) {...} Jndi و JMS:
اتصال الرسائل هو طريقة تستخدمها مكونات البرنامج أو التطبيقات للتواصل. JMS هي تقنية Java تسمح للتطبيقات بإنشاء الرسائل وإرسالها وتلقيها وقراءتها.
مثال رمز:
جرب {properties env = new properties () ؛ initialContext inictxt = new initialContext (env) ؛ topicConnectionFactory connfactory = (topiconconnectionfactory) inictxt.lookup ( قم بزيارة أدلة محددة: على سبيل المثال ، الشخص هو كائن ، ولديه عدة سمات ، مثل اسم الشخص ورقم الهاتف وعنوان البريد الإلكتروني والرمز البريدي والسمات الأخرى. بواسطة طريقة getAttributes ()
Attribute attr = directory.getAttributes (personname) .get ("البريد الإلكتروني") ؛ سلسلة البريد الإلكتروني = (سلسلة) attr.get () ؛ باستخدام JNDI ، السماح للعملاء باستخدام اسم الكائن أو سمات الكائن للعثور على كائنات:
foxes = directory.search ("o = wiz ، c = us" ، "sn = fox" ، عناصر التحكم) ؛ أمثلة على العثور على الطابعات باستخدام JNDI للعثور على كائنات مثل الطابعات وقواعد البيانات:
Printer Printer = (Printer) Pace.lookup (printername) ؛ printer.print (document) ؛
تصفح مساحات الأسماء:
قائمة namingenumeration = namepace.list ("o = widget ، c = us") ؛ بينما (list.hasmore ()) {nameclasspair entry = (nameClassPair) list.next () ؛ display (intplic.getName () ، under.getClassName ()) ؛}مثال رمز: أعد الحصول على الاسم واسم الفئة والكائن المربوطة.
namingenumeration namenumList = ctxt.listBinding ("cntxtName") ؛ ... بينما (namenumlist.hasmore ()) {binding bnd = (binding) namenumlist.next () ؛ string sobjname = bnd.getname () ؛ bnd.getObject () ؛} سيساعد فهم مفاهيم خدمات الأسماء وخدمات الدليل على استخدام JNDI بشكل أفضل. تحدد خدمة اسم خدمة التسمية كيفية ربط اسم بكائن وكيفية العثور على كائن من خلال اسم. الأمثلة النموذجية هي: أسماء المجال DNS Associates مع IP ، و File Systems Associates أسماء الملفات بالملفات. في خدمة الاسم ، المفاهيم الرئيسية:
- الأسماء (الأسماء) ، اسم رمز الكائن الفعلي في نظام الأسماء ، مثل أسماء الملفات ، وأسماء النطاق ، وما إلى ذلك ، سيتم استخدامه للعثور على الكائن المرتبط. سيكون للأنظمة المختلفة مواصفات تسمية مختلفة ، مثل استخدام نظام الملفات "/" لتمثيل التسلسل الهرمي ، بينما تستخدم DNS ".".
- الارتباطات ، ارتباط الأسماء والأشياء الفعلية.
- المراجع والعناوين. عندما لا يمكن تخزين كائن مباشرة في نظام الاسم ، يجب استخدام مرجع للعثور على الكائن الفعلي من خلال المرجع. في النظام ، يسمى محتوى المرجع المحفوظ عنوانًا. الاقتباسات لها استخدام آخر: في نظام الاسم ، يفتقر مفهوم المفاتيح الأجنبية في قواعد البيانات العلائقية. باستخدام المراجع ، يمكن استخدامه كبديل للمفاتيح الأجنبية.
-السياق ، إنها مجموعة من الأسماء ، توفر العمليات الرئيسية للتفاعل مع نظام الأسماء ، مثل البحث والربط وإزالة الارتباط. تشبه العلاقة بين سياق الطفل (SubContext) العلاقة بين الدلائل والمدافع الفرعي في نظام الملفات. يضم سياق الطفل في سياق ويرتبط بسياق الطفل من خلال اسم في سياق الأصل.
- أنظمة التسمية ومساحات الأسماء. نظام الأسماء عبارة عن مجموعة من نفس النوع من السياق ويوفر خدمات الاسم. مساحة الاسم هي مجموعة من الأسماء في نظام الأسماء ، مثل أسماء الملفات وأدلة نظام الملفات.
خدمة دليل الدليل هي امتداد لخدمة الاسم. بالإضافة إلى ربط الأسماء والكائنات ، فإنه يتيح أيضًا للكائنات احتواء سمات. عادة ما تنظم أنظمة الدليل البيانات في التسلسل الهرمي. المفاهيم الرئيسية في خدمات الدليل:
- السمات ، التي تنتمي إلى كائن الدليل ، هو زوج (اسم ، قيمة) ، ويمكن أن يكون للسباحة قيم متعددة.
- الدلائل وخدمات الدليل ، الدلائل هي مجموعات من كائنات الدليل ؛ توفر خدمات الدليل خدمات متعلقة بالدليل لإنشاء وحذف وتعديل خصائص الكائنات المخزنة في الدليل.
- عمليات البحث ومرشحات البحث ، تشغيل كائنات الدليل هو البحث ؛ المرشحات هي كائنات مماثلة لظروف البحث.
الاستخدام الأساسي
² تسجيل مزود JNDI قبل استخدام JNDI ، تحتاج إلى الحصول على مزود JNDI وتسجيله في النظام. يتم تعريف خصائص النظام المتعلقة بـ JNDI في javax.naming.context ، الخصائص الشائعة الاستخدام:
- java.naming.factory.initial ، اسم الفصل المستخدم من قبل مزود الخدمة لإنشاء initialContext.
- java.naming.provider.url ، يستخدم لتكوين عنوان URL الأولي لـ initialContext
-java.naming.factory.Object ، فئة تستخدم لإنشاء خرائط اسم إلى كائن ، تستخدم في nameclasspair والمراجع.
- java.naming.factory.state ، الفئة المستخدمة لإنشاء حالة JNDI. بالنسبة لخدمات الدليل ، يتطلب عادة إعدادات أمان وعادة ما تستخدم:
- java.naming.security.Auphentication ، نوع الأمان ، ثلاث قيم: لا شيء ، بسيط أو قوي.
- java.naming.security.principal ، معلومات المصادقة.
- java.naming.security.credentials ، معلومات الشهادة.
- java.naming.security.protocol ، اسم بروتوكول الأمان.
سجل مع System.SetProperty. إذا لم يعرض البرنامج الإرشادات ، فسيبحث Java عن ملف JDNI.Properties في ClassPath لإكمال التسجيل. jdni.properties مثال:
java.naming.factory.initial = com.codeline.db.mockinitialContextFactory
خدمة الاتصال
بعد التسجيل ، يمكنك تنفيذ اتصال الخدمة. لخدمات الأسماء ، ابدأ مع initialContext ، تستخدم خدمات الدليل initialDircOntext. أنها تنفذ السياق و dirContext على التوالي. تتوافق هاتان الواجهتان مع واجهات خدمات الأسماء وخدمات الدليل ، وهما أيضًا أهم واجهتين في JNDI.
توصيل خدمة الاسم:
System.SetProperty (context.initial_context_factory ، "com.sun.jndi.fscontext.fscontextfactory") ؛ initialContext ctx = new initialContext () ؛
الاتصال بخدمات الدليل:
hashtable env = new 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 ، "Simple") ؛ . // تسجيل الدخول إلى LDAP كلمة المرور المطلوبة من قبل الخادم هي env.put (context.security_credentials ، "MyPassword") ؛ initialDircOntext ctx = newDirconText (env) ؛
مزود متعدد الخدمات: إذا كان التطبيق يحتوي على مقدمي خدمات متعددة ، فسيكون الأمر مختلفًا قليلاً عند الاتصال. خذ خدمة الاسم كمثال
hashtable env = new hashtable () ؛ env.put (context.initial_context_factory ، "com.sun.jndi.rmi.registry.registryContextFactory") ؛ env.put (context.provider_url ، "rmi: //myserver.com: 1099") ؛ // استخدم منشئات مختلفة initialContext ctx = new inialContext (env) ؛
ابحث عن الأشياء
سواء كانت خدمة اسم أو خدمة دليل ، يتم استخدام البحث للعثور على الكائنات. بالإضافة إلى استخدام السلسلة كمعلمة ، يمكن لبحث أيضًا استخدام واجهة الاسم كمعلمة.
Greeter Greeter = (Greeter) ctx.lookup ("sayhello") ؛ إذا كنت ترغب في الحصول على جميع أسماء الكائنات في السياق ، فاستخدم LIS لإرجاع قائمة nameclasspair. يحتوي NameClassPair على اسم الكائن واسم فئة الكائن. إذا كنت ترغب في الحصول على القائمة الفعلية لمثيلات الكائن ، فاستخدم ListBindings ، والتي تُرجع قائمة الربط. الربط هو فئة فرعية من nameclasspair ، والتي تحتوي على حالات من الكائنات.
- قائمة
قائمة namingenumeration = ctx.list ("awt") ؛ بينما (list.hasmore ()) {nameclasspair nc = (nameclasspair) list.next () ؛ System.out.println (NC) ؛ } - listbindings
namingenumeration bindings = ctx.listbindings ("awt") ؛ بينما (bindings.hasmore ()) {binding bd = (binding) bindings.next () ؛ System.out.println (bd.getName () + ":" + bd.getObject ()) ؛ }
كائن الربط
- أضف الربط باستخدام الربط
فاكهة الفاكهة = فاكهة جديدة ("برتقالية") ؛ ctx.bind ("المفضل" ، الفاكهة) ؛ - استخدم Rebind لتعديل الربط
فاكهة الفاكهة = فاكهة جديدة ("الليمون") ؛ ctx.rebind ("المفضل" ، الفاكهة) ؛ - استخدم Undind لإزالة الروابط.
ctx.unbind ("المفضل") ؛
إعادة تسمية الكائن
استخدم إعادة تسمية لإعادة تسمية كائن في السياق
ctx.rename ("report.txt" ، "old_report.txt") ؛- الواجهات المتعلقة بالحصول على سمات السمات هي سمات وسمات ، وكلاهما موجود في حزمة javax.naming.directory. يمكنك الحصول على تعيين سمة الكائن من خلال طريقة getAttributes لـ dirContext ، ثم استخدم طريقة الحصول على السمات للحصول على السمات المقابلة ، وأخيراً يمكنك الحصول على قيمة السمة من خلال طريقة الحصول على السمة.
string dn = "uid = me ، dc = mycompany ، dc = com ، ou = customer ، o = exampleapp" ؛ مستخدم سياق = (سياق) ctx.lookup (DN) ؛ // الحصول على جميع سمات السمات attributes = user.getAttributes ("") ؛ اختبار السمة = attrs .get ("اختبار") ؛ كائن testValue = test.get () ؛في المثال أعلاه ، يتم الحصول على جميع سمات المستخدم. في الاستخدام الفعلي ، بالنظر إلى تأثير عرض النطاق الترددي للشبكة ، يمكنك تعيين قائمة السمات المراد الحصول عليها:
String reqd_attrs = new string [] {"surname" ، "الأحرف الأولى" ، "العنوان" ، "rfc822mailalias"} ؛ سمات السمات = user.getattributes ("" ، reqd_attrs) ؛
البحث والتصفية
استخدم طريقة البحث لإكمالها.
public dirContext [] FindUser (الأحرف الأولى من السلسلة ، اللقب السلسلة ، سلسلة السلسلة ، هاتف السلسلة) {// ظروف البناء الأساسية search_attrs = new basicattributes () ؛ Search_attrs.put ("الأحرف الأولى" ، الأحرف الأولى) ؛ Search_attrs.put ("sn" ، حادث) ؛ Search_attrs.put ("C" ، البلد) ؛ إذا (الهاتف! = null) search_attrs.put ("phonenumber" ، الهاتف) ؛ نتائج namingenumeration = initial_ctx.search ("ou = customer ، o = exampleapp" ، search_attrs) ؛ تم العثور على LinkedList = New LinkedList () ؛ بينما (results.hasmore ()) {searchResults sr = (searchResults) results.next () ؛ اسم السلسلة = sr.getName () ؛ كائن ctx = sr.getObject () ؛ if ((ctx == null) ||! (ctx مثيل dirContext)) found.add (initial_ctx.lookup (name)) ؛ وجدت أخرى. Add (CTX) ؛ } dirContext [] ret_val = new dirContext [found.size ()] ؛ Found.Toarray (Ret_val) ؛ إرجاع ret_val ؛ }
طرق التصفية الرئيسية لواجهة dirContext:
1. استخدم سلاسل المرشح
String reqd_attrs = new string [] {"cn" ، "uid" ، "rfc822mailalias"} ؛ نتائج namingenumeration = initial_ctx.search ("ou = customer ، o = exampleapp" ، search_attrs ، reqd_attrs) ؛
2. استخدم SearchControls للحصول على مزيد من التحكم
SearchControls ctrls = new SearchControls () ؛ ctrls.setCountlimit (20) ؛ ctrls.settimelimit (5000) ؛ ctrls.setsearchScope (SearchControls.Subtree_Scope) ؛ نتائج NamingEnumeration = initial_ctx.search ("cat = books ، ou = products ، o = examplepap" ، "title =*java*" ، ctrls) ؛ تعديل الخصائص
يتم ذلك باستخدام طرق modifyattributes من dirContext و initialDircOntext. تتمثل عملية التعديل المزعومة في الواقع في إنشاء قائمة السمات المراد تعديلها أولاً ثم إرسالها باستخدام الطريقة أعلاه. عندما تحتوي خاصية على قيم متعددة ، من الضروري تضمين القيم غير المعدلة للخاصية ، وإلا فإن الخادم سيحذف هذه القيم إذا لم تعد هناك حاجة إليها.
public void updateaddress (سلسلة DN ، عنوان السلسلة ، سلسلة السلسلة ، سلسلة سلسلة) {basicattributes mod_attrs = new basicattributes () ؛ إذا (العنوان! = null) mod_attrs.put ("العنوان" ، العنوان) ؛ if (Country! = null) mod_attrs.put ("c" ، البلد) ؛ if (phone! = null) mod_attrs.put ("phonenumber" ، phone) ؛ if (mod_attrs.size ()! = 0) initial_ctx.modifyattributes (dn ، dirContext.replace_attribute ، mod_attrs) ؛ } باستخدام ModificationItem ، يمكنك أيضًا إجراء عمليات تعديل مختلفة متعددة في وقت واحد:
ModificationItem [] mod_items = new ModificationItems [2] ؛ السمة البريد الإلكتروني = جديد basicattribute ("rfc822mailalias" ، new_email) ؛ ModificationItem email_mod = new ModificationItem (dirContext.add_attribute ، email) ؛ Attribute addr = new BasicAttribute ("العنوان" ، العنوان) ؛ ModificationItem addr_mod = new ModificationItem (dirContext.replace_attribute ، addr) ؛ mod_items [0] = email_mod ؛ mod_items [1] = addr_mod ؛ initial_ctx.modifyattributes (DN ، mod_items) ؛ إنشاء سياق
استخدم طريقة CreateSubContext لإكمالها.
pasicattributes attrs = new basicattributes () ؛ attrs.put ("الأحرف الأولى" ، الأحرف الأولى) ؛ attrs.put ("sn" ، حادث) ؛ ATTRS.PUT ("RFC822Mailalias" ، البريد الإلكتروني) ؛ إذا (العنوان! = null) attrs.put ("العنوان" ، العنوان) ؛ if (Country! = null) attrs.put ("C" ، البلد) ؛ إذا (الهاتف! = null) attrs.put ("phonenumber" ، الهاتف) ؛ initial_ctx.createsubcontext (dn ، attrs) ؛
حذف السياق
استخدام طريقة تدمير ubcontext لإكمال.
initial_ctx.destroysubcontext (DN) ؛
مثال
هنا مثال آخر.
تكوين في tomcat's conf/server.xml:
<context path = "/jndi"> <resource name = "bean/mybeanfactory" auth = "container" type = "com.huawei.jndi.bean.mybean" factory = "org.apache.naming.factory.beanfactory" bar = "23"/>
يتم الإعلان عن مكون في Tomcat أعلاه ، ويمكنك الحصول على هذا المكون في الكود:
حاول {context initContext = جديد initialContext () ؛ context envctx = (context) initContext.lookup ("java: comp/env") ؛ MyBean Bean = (MyBean) envctx.lookup ("Bean/MyBeanfactory") ؛ System.out.println (Bean.getBar ()) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }ملخص: قم بتكوين مكون JNDI في Tomcat ، ثم احصل على المكونات المجهزة في الكود.
تختلف فئات تنفيذ JNDI لكل حاوية ويب. على سبيل المثال ، في JBOSS ، فئة توفير JNDI هي org.jnp.interfaces.namingContextFactory ، والتي تختلف عن tomcat.
من وجهة النظر هذه ، يشبه دور JNDI دور حقن التبعية في الربيع. ومع ذلك ، من خلال JNDI ، من الممكن الحصول على مكونات عبر التطبيقات وحتى عبر المجالات. يمكن الحصول على المكونات التي تم تكوينها على الخادم A من خلال JNDI على خادم آخر B.
يوفر Spring أيضًا تغليف JNDI ، وهو أكثر ملاءمة للاستخدام. فيما يلي مثال.
<!-قالب jndi-> <bean id = "jnditemplate"> <property name = "eversion"> <bors> <prop key = "java.naming.factory.initial"> org.jnp.interfaces.namingContextor key = "java.naming.provider.url"> 10.137.96.212:18199 </prop> <prop key = "java.naming.factory.url.pkgs"> org.jnp.interfaces: org.jboss id = "jmsconnectionfactory"> <property name = "jnditemplate" ref = "jnditemplate" /> <property name = "jndiname" value = "topicConnectionFactory" /> </bean>
أول إعلان Jnditemplate ، قم بتكوين عنوان الهدف ودروس توفير خدمة JNDI. بعد ذلك ، من خلال JndiObjectFactoryBean ، يمكنك بسهولة الحصول على مكونات JNDI وإجراء تحويل النوع.