Общее понимание JNDI:
JNDI (интерфейс именования Java и каталог). Он предоставляет набор интерфейсов, которые используют службы именования и каталогов. Пользователи могут использовать услуги именования и каталогов через него. Так же, как JDBC. JNDI включает в себя две части: служба службы и каталога, где служба каталога содержит объект каталога объектов каталогов, который содержит несколько объектов атрибута. Обеспечивает много операций на свойствах.
Услуги именования и каталогов:
Мы использовали службы именования и каталогов, такие как файловая система операционной системы, которая предоставляет нам такие функции, как операции, запросы, добавление и удаление файлов. Служба DNS связывает URL и IP -адрес вместе. Наиболее важной функцией систем именования и каталогов является связывание имени и объекта. На основании этого он также предоставляет больше функций, таких как поиск и поиск. Более того, хранимые объекты имеют определенную иерархию. Используя такую услугу, мы можем более эффективно управлять и эксплуатировать объекты.
Служба именования отображает имя на объект. Реестр RMI и Служба именования CORBA - оба именованы услуги.
Служба каталогов также хранит объекты, но служба каталогов распознает соответствующие свойства этих объектов. Вы можете использовать свойства проекта для поиска каталогов.
В начале 1990 -х годов был разработан легкий протокол доступа к каталогам (LoolweightDireToryAccessProtocol) в качестве стандартного протокола каталогов, и JNDI смог получить доступ к LDAP.
J2SE предоставляет 5 пакетов расширения для JNDI:
Контекст: контекст-это набор привязков имени к объекту, которые можно понимать как иерархия или каталог. Это также может включать следующий слой субконтекса. Получение начального контекста при использовании служб именования и каталогов - это запись всей операции пространства имен. В службе каталога есть Dircontext.
JNDI (интерфейс именования Java и каталог)-это API, разработанный приложением, который предоставляет разработчикам общий и унифицированный интерфейс для поиска и доступа к различным именованным и каталогом. JDBC построен на слое абстракции.
Существующие каталоги и услуги, к которым может получить доступ JNDI:
DNS, XNAM, Novell Directory Service, LDAP (протокол доступа к легким каталогам), служба объектов CORBA, файловая система, Windows XP/2000/NT/ME/9X Реестр, RMI, DSML V1 & V2, NIS.
Преимущества JNDI:
Он содержит большое количество служб именования и каталогов, используя общий интерфейс для доступа к различным типам услуг; Он может быть подключен к нескольким службам именования или каталогами одновременно; Он устанавливает логические ассоциации, позволяя именам быть связаны с Java -объектами или ресурсами без необходимости направлять физический идентификатор объектов или ресурсов.
Пакет JNDI:
JNDI против JDBC:
JNDI предоставляет унифицированный способ поиска и доступа к услугам в сети. Указав имя ресурса, которое соответствует записи в базе данных или службе именования, он возвращает информацию, необходимую для создания подключения к базе данных.
Пример кода:
try {context cntxt = new initialContext (); dataSource ds = (dataSource) cntxt.lookup ("jdbc/dpt");} catch (namingexception ne) {...} JNDI и JMS:
Связь сообщений - это метод, используемый программными компонентами или приложениями для общения. JMS - это технология Java, которая позволяет приложениям создавать, отправлять, получать и читать сообщения.
Пример кода:
try {Properties env = new Properties (); initialContext inictxt = new initistercontext (env); tobyConnectionFactory contactory = (tomannectionFactory) inictxt.lookup ("ttopicConnectionFactory"); ...} catch (namingException ne) {...} Посетите конкретные каталоги: например, человек является объектом, и у него есть несколько атрибутов, таких как имя человека, номер телефона, адрес электронной почты, почтовый код и другие атрибуты. По методу getattributes ()
Attribute attr = directory.getattributes (personname) .get ("email"); string email = (string) attr.get (); Используя JNDI, позволяя клиентам использовать имя или атрибуты объекта, чтобы найти объекты:
foxes = directory.search ("o = wiz, c = us", "sn = fox", controls); Примеры поиска принтеров с использованием JNDI для поиска таких объектов, как принтеры и базы данных:
Принтер принтер = (принтер) пространство имен.
Просмотрите пространства имен:
NamingEnumeration list = namespace.list ("o = widget, c = us"); while (list.hasmore ()) {nameclasspair entry = (nameclasspair) list.next (); display (entry.getName (), entry.getClassname ());}Пример кода: повторно поместите имя, имя класса и связанный объект.
NamingEnumeration namenumList = ctxt.listBinding ("cntxtname"); ... while (namenumlist.hasmore ()) {связывание bnd = (связывание) namenumlist.next (); string sobjname = bnd.getname (); String sclassname = bnxgetclassname (); bnd.getObject ();} Понимание концепций служб имен и сервисов каталогов поможет лучше использовать JNDI. Служба службы службы именования определяет, как связать имя с объектом и как найти объект через имя. Типичными примерами являются: DNS Associates доменные имена с IP, и файловые системы ассоциируют имена файлов с файлами. В службе имени основные концепции:
- Имена (имена), кодовое имя фактического объекта в системе имен, таких как имена файлов, доменные имена и т. Д., Он будет использоваться для поиска связанного объекта. Различные системы будут иметь различные спецификации именования, такие как использующая файловая система «/» для представления иерархии, в то время как DNS использует ».
- Привязки, ассоциация имен и фактических объектов.
- Ссылки и адреса. Когда объект не может быть сохранен непосредственно в системе имен, необходимо использовать ссылку для поиска фактического объекта посредством ссылки. В системе содержание сохраненной ссылки называется адресом. Цитаты имеют другое использование: в системе имени не хватает концепции иностранных ключей в реляционных базах данных. Используя ссылки, его можно использовать в качестве альтернативы иностранным ключам.
-Контекст, это сборник имен-объект, предоставляющий основные операции для взаимодействия с системой имен, такими как поиск, привязка и дезакация. Взаимосвязь между дочерним контекстом (субконтекстом) аналогична взаимосвязи между каталогами и подкаталогами в файловой системе. Дочерний контекст содержится в контексте и связан с дочерним контекстом с помощью имени в родительском контексте.
- Системы именования и пространства имен. Система названия представляет собой коллекцию того же типа контекста и предоставляет услуги имен. Пространство имен представляет собой коллекцию имен в системе имен, таких как имена файлов и каталоги файловой системы.
Служба каталогов каталогов - это расширение имени Сервиса. В дополнение к ассоциации имен и объектов, это также позволяет объектам содержать атрибуты. Системы каталогов обычно организуют данные в иерархии. Основные концепции в службах каталогов:
- Атрибуты, которые принадлежат объекту каталога, это пара (имя, значение), а атрибут может иметь несколько значений.
- каталоги и службы каталогов, каталоги являются коллекциями объектов каталогов; Услуги каталогов предоставляют сервисы, связанные с каталогами, для создания, удаления и изменения свойств объектов, хранящихся в каталоге.
- Поиск и поисковые фильтры, операция получения объектов каталога является поиском; Фильтры - это объекты, похожие на условия поиска.
Базовое использование
² Регистрировать поставщика JNDI Перед использованием JNDI необходимо получить поставщика JNDI и зарегистрировать его в системе. Свойства системы, связанные с JNDI, определены в javax.naming.context, обычно используемые свойства:
- java.naming.factory.initial, имя класса, используемое поставщиком услуг для создания начального контекста.
- java.naming.provider.url, используется для настройки начального URL -адреса initycontext
-java.naming.factory.object, класс, используемый для создания карт имени к объекту, используемый для Nameclasspair и ссылок.
- java.naming.factory.state, класс, используемый для создания состояния JNDI. Для служб каталогов это обычно требует настройки безопасности и обычно используется:
- java.naming.security.authentication, тип безопасности, три значения: нет, простое или сильное.
- java.naming.security.principal, информация о аутентификации.
- java.naming.security.credentials, Информация о сертификате.
- java.naming.security.protocol, название протокола безопасности.
Зарегистрируйтесь в System.SetProperty. Если программа не отображает инструкции, Java будет искать файл jdni.properties в группе класса для завершения регистрации. jdni.properties Пример:
java.naming.factory.initial = com.codeline.db.mockinitialContextFactory
Служба соединения
После регистрации вы можете реализовать подключение к сервису. Для имен служб, начните с начального Context, сервисы каталогов используют initialdircontext. Они реализуют контекст и диртукс соответственно. Эти два интерфейса соответствуют интерфейсам служб имен и службах каталогов, а также являются двумя наиболее важными интерфейсами в 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_principal, "ldapuser"); // Вход в LDAP Пароль, требуемый сервером, является Env.Put (context.security_credentials, "mypassword"); InitiAldircontext ctx = new initialDircontext (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"); // Использовать разные конструкторы inityconcontext ctx = new initistrontext (env);
Найти объекты
Будь то служба имен или служба каталогов, поиск используется для поиска объектов. В дополнение к использованию строки в качестве параметра, поиск также может использовать интерфейс имени в качестве параметра.
Greeter Greeter = (Greeter) ctx.lookup ("sayhello"); Если вы хотите получить все имена объектов в контексте, используйте LIS, чтобы вернуть список NameClassPair. Nameclasspair содержит имя объекта и имя класса объекта. Если вы хотите получить фактический список экземпляров объектов, используйте списки Bists, что возвращает список привязки. Переплет является подклассом NameclassPair, который содержит экземпляры объектов.
- список
NamingEnumeration list = ctx.list ("awt"); while (list.hasmore ()) {nameclasspair nc = (nameclasspair) list.next (); System.out.println (NC); } - Списки
Привязки namingEnumeration = ctx.listbindings ("awt"); while (bindings.hasmore ()) {связывание bd = (связывание) bindings.next (); System.out.println (bd.getName () + ":" + bd.getObject ()); }
Объединение объекта
- Добавить привязку с помощью Bind
Фрукты = новые фрукты («апельсин»); ctx.bind («Любимый», фрукты);
- Используйте Repind для изменения привязки
Фрукты = новый фрукты ("лимон"); ctx.rebind ("Любимый", фрукты); - Используйте непредвзято, чтобы удалить привязки.
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); // Получить все атрибуты атрибуты attrs = user.getattributes (""); Атрибут test = attrs .get ("test"); Объект TestValue = test.get ();В приведенном выше примере получаются все атрибуты пользователя. В фактическом использовании, учитывая влияние пропускной способности сети, вы можете установить список полученных атрибутов:
String reqd_attrs = new String [] {"фамилия", "инициалы", "title", "rfc822mailalias"}; Attributes attrs = user.getattributes ("", reqd_attrs);
Найдите и фильтруют
Используйте метод поиска для завершения.
public dircontext [] finduser (строки инициалы, строковая фабрика, String Country, String Phone) {// Условия строительства basicattributes search_attrs = new basicattributes (); search_attrs.put ("инициалы", инициалы); search_attrs.put ("sn", инцидент); search_attrs.put ("c", страна); if (телефон! = null) search_attrs.put ("Phonenumber", телефон); Результаты namingEnumeration = initial_ctx.search ("ou = customer, o = exampleapp", search_attrs); LinkedList sud = new LinkedList (); while (Results.hasmore ()) {searchresults sr = (searchresults) results.next (); String name = sr.getName (); Объект ctx = sr.getObject (); if ((ctx == null) ||! (ctx ancessionof dircontext)) udd.add (initial_ctx.lookup (name)); иначе найдено. ADD (CTX); } Dircontext [] ret_val = new dircontext [sucted.size ()]; найдено.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 = exampleapp", "title =*java*", ctrls); Изменить свойства
Это делается с использованием методов ModifyAttributes of Dircontext и initialDircontext. Так называемый процесс модификации фактически должен сначала построить список атрибутов, которые будут изменены, а затем отправить с помощью приведенного выше метода. Когда свойство содержит несколько значений, необходимо включить немодифицированные значения свойства, в противном случае сервер удалит эти значения, если они больше не нужны.
public void updateAddress (String dn, строковый адрес, String страна, строка телефон) {basicattributes mod_attrs = new basicattributes (); if (адрес! = null) mod_attrs.put ("адрес", адрес); if (country! = null) mod_attrs.put ("c", страна); if (телефон! = null) mod_attrs.put ("Phonenumber", телефон); if (mod_attrs.size ()! = 0) initial_ctx.modifyattributes (dn, dircontext.replace_attribute, mod_attrs); } Используя ModificationItem, вы также можете выполнить несколько различных операций модификации одновременно:
ModificationItem [] mod_items = new ModiationItems [2]; Attribute email = new Basicattribute ("rfc822mailalias", new_email); ModificationItem email_mod = new ModiationItem (dircontext.add_attribute, email); Атрибут addr = new basicattribute ("адрес", адрес); ModificationItem addr_mod = new ModiationItem (dircontext.replace_attribute, addr); mod_items [0] = email_mod; mod_items [1] = addr_mod; initial_ctx.modifyattributes (dn, mod_items); Создать контекст
Используйте метод CreateSubcontext для завершения.
Basicattributes attrs = new Basicattributes (); attrs.put ("инициалы", инициалы); attrs.put ("sn", инцидент); attrs.put ("rfc822mailalias", электронная почта); if (адрес! = null) attrs.put ("адрес", адрес); if (country! = null) attrs.put ("c", страна); if (телефон! = null) attrs.put ("Phonenumber", телефон); initial_ctx.createsubcontext (dn, attrs);
Удалить контекст
Используйте метод DestrySubcontext для завершения.
initial_ctx.destroysubcontext (dn);
Пример
Вот еще один пример.
Настройка в conf/server.xml от Tomcat:
<Context path = "/jndi"> <resource name = "bean/mybeanfactory" auth = "container" type = "com.huawei.jndi.bean.mybean" factory = "org.apache.naming.factory.beanfactory" bar = "23"/> </context>
Компонент объявлен в Tomcat выше, и вы можете получить этот компонент в коде:
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 (Exception e) {e.printstackTrace (); }Резюме: Настройте компонент JNDI в Tomcat, а затем получите оборудованные компоненты в коде.
Классы реализации JNDI в каждом веб -контейнере разные. Например, в JBoss класс предоставления JNDI является org.jnp.interfaces.namingcontextfactory, который отличается от Tomcat.
С этой точки зрения, роль JNDI аналогична роли впрысной зависимости. Однако через JNDI можно получить компоненты между приложениями и даже между доменами. Компоненты, настроенные на сервере A, можно получить через JNDI на другом сервере B.
Spring также обеспечивает инкапсуляцию JNDI, которая удобнее использовать. Ниже приведен пример.
<!-шаблон jndi-> <bean id = "jnditemplate"> <name = "Environment"> <props> <prop key = "java.naming.factory.initial"> org.jnp.interfaces.namingcontextfactory </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> </property> </bean> <boss. id = "jmsconnectionFactory"> <name = "name =" jnditemplate "ref =" jnditemplate " /> <name =" jndiname "value =" tomannectionFactory " /> < /bean>
Сначала объявить Jnditemplate, настроить целевой адрес и классы предоставления услуг JNDI. Затем, через jndiobjectfactorybean, вы можете легко получить компоненты JNDI и выполнить преобразование типа.