文档

Java™教程
隐藏目录
操作LdapName(可分辨名称)
路径:Java命名和目录接口
课程:JDK 5.0和JDK 6中的新功能

操作LdapName(区别名称)

区分名称(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.CompoundNamejavax.naming.CompositeName类。

LdapName和Rdn类允许轻松操作DN和RDN。使用这些API,可以通过配对名称和值来轻松构造RDN。可以使用RDN列表构造DN。类似地,可以从其字符串表示中检索DN和RDN的各个组件。

LdapName

可以使用其在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的相等性的方法,以及获取名称的字符串表示的方法。

访问LDAP名称的组成部分:

以下是您可以用于访问名称组成部分的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名称

以下是您可以用于修改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名称

您可以使用以下方法来比较两个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名称的字符串表示:

toString()

当您使用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

LdapName作为Context方法的参数

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进行操作

上一页: 管理转诊控制
下一页: 操作相对专有名称 (RDN)