Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言变更,了解Java SE 9及后续版本中更新的语言特性的概述。
请参阅JDK发行说明,了解所有JDK发行版本的新功能、增强功能以及已删除或弃用的选项的信息。
区分名称(DN)是LDAP在其字符串表示中使用的。表示DN的字符串格式在RFC 2253中指定。DN由称为相对区分名称(RDN)的组件组成。以下是DN的示例:
"CN=John Smith, O=Isode Limited, C=GB"
它由以下RDN组成:
下面的类分别表示DN和RDN:
LdapName类实现了javax.naming.Name接口,类似于javax.naming.CompoundName和javax.naming.CompositeName类。
LdapName和Rdn类允许轻松操作DN和RDN。使用这些API,可以通过配对名称和值来轻松构造RDN。可以使用RDN列表构造DN。类似地,可以从其字符串表示中检索DN和RDN的各个组件。
可以使用其在RFC 2253中定义的字符串表示或使用Rdn列表创建LdapName。当使用前一种方式时,将按照RFC2253中定义的规则解析指定的字符串。如果字符串不是有效的DN,则会抛出InvalidNameException。以下是使用构造函数解析LDAP名称并打印其组件的示例:
String name = "cn=Mango,ou=Fruits,o=Food"; try { LdapName dn = new LdapName(name); System.out.println(dn + " has " + dn.size() + " RDNs: "); for (int i = 0; i < dn.size(); i++) { System.out.println(dn.get(i)); } } catch (InvalidNameException e) { System.out.println("Cannot parse name: " + name); }
使用"cn=Mango,ou=Fruits,o=Food"作为输入运行此示例将产生以下结果:
cn=Mango,ou=Fruits,o=Food has 3 RDNs: o=Food ou=Fruits cn=Mango
LdapName类包含访问其组件作为RDN和字符串的方法,修改LdapName的方法,比较两个LdapName的相等性的方法,以及获取名称的字符串表示的方法。
以下是您可以用于访问名称组成部分的RDN和字符串的方法:
getRdn(int posn)
get(int posn)
getRdns()
getAll()
getPrefix(int posn)
getSuffix(int posn)
clone()
要检索LdapName中特定位置的组件,您可以使用getRdn()或get()方法。前面的构造函数示例显示了其用法。getRdns()返回所有RDN的列表,getAll()将LdapName的所有组件作为枚举返回。
最右边的RDN位于索引0,最左边的RDN位于索引n-1。例如,可分辨名称:"cn=Mango, ou=Fruits, o=Food"按照以下顺序编号,范围从0到2:{o=Food, ou=Fruits, cn=Mango}
您还可以将LdapName的后缀或前缀作为LdapName实例获取。以下是获取LDAP名称后缀和前缀的示例
。
LdapName dn = new LdapName("cn=Mango, ou=Fruits, o=Food"); Name suffix = dn.getSuffix(1); // 1 <= index < cn.size() Name prefix = dn.getPrefix(1); // 0 <= index < 1
运行此程序时,会生成以下输出:
cn=Mango ou=Fruits o=Food
要创建LdapName的副本,您可以使用clone()方法。
以下是您可以用于修改LDAP名称的方法:
add(Rdn rdn)
add(String comp)
add(int posn, String comp)
addAll(List suffixRdns)
addAll(Name suffix)
addAll(int posn, List suffixRdns)
addAll(int posn, Name suffix)
remove(int posn)
创建LdapName实例后,可以向其添加和删除组件。下面是一个示例,将LdapName附加到现有的LdapName,添加组件到前面和末尾,并删除第二个组件。
LdapName dn = new LdapName("ou=Fruits,o=Food"); LdapName dn2 = new LdapName("ou=Summer"); System.out.println(dn.addAll(dn2)); // ou=Summer,ou=Fruits,o=Food System.out.println(dn.add(0, "o=Resources")); // ou=Summer,ou=Fruits,o=Food,o=Resources System.out.println(dn.add("cn=WaterMelon")); // cn=WaterMelon,ou=Summer,ou=Fruits,o=Food,o=Resources System.out.println(dn.remove(1)); // o=Food System.out.println(dn); // cn=WaterMelon,ou=Summer,ou=Fruits,o=Resources
您可以使用以下方法来比较两个LDAP名称:
compareTo(Object name)
equals(Object name)
endsWith(List)
endWith(Name name)
startsWith(List rdns)
startsWith(Name name)
isEmpty()
你可以使用compareTo()对LdapName实例列表进行排序。通过equals()方法,您可以确定两个LdapNames是否在语法上相等。如果两个LdapNames在相同的顺序中具有相同的(区分大小写匹配的)组件,则它们是相等的。
使用startsWith()和endsWith(),您可以了解一个LdapName是否以另一个LdapName开头或结尾;也就是说,一个LdapName是否是另一个LdapName的后缀或前缀。
方便的方法isEmpty()可以让您确定一个LdapName是否有零个组件。您还可以使用表达式size() == 0来执行相同的检查。
下面是一个示例,CompareLdapNames
,它使用了其中一些比较方法。
LdapName one = new LdapName("cn=Vincent Ryan, ou=People, o=JNDITutorial"); LdapName two = new LdapName("cn=Vincent Ryan"); LdapName three = new LdapName("o=JNDITutorial"); LdapName four = new LdapName(""); System.out.println(one.equals(two)); // false System.out.println(one.startsWith(three)); // true System.out.println(one.endsWith(two)); // true System.out.println(one.startsWith(four)); // true System.out.println(one.endsWith(four)); // true System.out.println(one.endsWith(three)); // false System.out.println(one.isEmpty()); // false System.out.println(four.isEmpty()); // true System.out.println(four.size() == 0); // true
下面的方法可让您获取根据RFC 2253中指定的语法格式化的LDAP名称的字符串表示:
当您使用LdapName构造函数时,您提供LDAP名称的字符串表示,并返回一个LdapName实例。要进行反向操作,即获取LdapName实例的字符串表示,您可以使用toString()。 toString()的结果可以作为构造函数的参数,以生成与原始LdapName实例相等的LdapName实例。这是一个示例,LdapNametoString
:
LdapName dn = new LdapName(name); String str = dn.toString(); System.out.println(str); LdapName dn2 = new LdapName(str); System.out.println(dn.equals(dn2)); // true
Context方法要求将复合名称或复合名称作为参数传递给其方法。因此,可以直接将LdapName作为参数传递给上下文方法,如LookupLdapName
中所示:
// 创建初始上下文 Context ctx = new InitialContext(env); // 一个LDAP名称 LdapName dn = new LdapName("ou=People,o=JNDITutorial"); // 使用dn执行查找 Object obj = ctx.lookup(dn);
类似地,当Context方法从list()、listBindings()或search()操作返回结果时,可以通过调用getNameInNamespace()来检索DN。可以直接从DN构建LdapName,如示例中所示,RetrievingLdapName
:
while (answer.hasMore()) { SearchResult sr = (SearchResult) answer.next(); String name = sr.getNameInNamespace(); System.out.println(name); LdapName dn = new LdapName(name); // 对dn进行操作