Java教程是针对JDK 8编写的。本页面描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息,请参阅JDK发布说明。
类javax.naming.ldap.Rdn表示在RFC 2253中指定的相对可分辨名称(RDN)。 RDN代表DN的组成部分,如Manipulating LdapName中所解释的那样。 RDN由类型和值对组成。 RDN的示例包括:
Rdn类提供了访问RDN的名称/值对的方法,获取其字符串表示形式,检索Attributes视图,比较和确定RDN的相等性以及转义和反转义RDN的值部分的方法。
Rdn类是不可变的。
如果是单个名称/值对的RDN,则可以使用指定的名称和值对构造Rdn。对于多值RDN,应创建包含所有名称/值对的属性集,并使用以Attributes作为参数的构造函数。您还可以根据RFC 2253中指定的字符串表示形式创建Rdn。最后,您可以使用其副本构造函数克隆Rdn。这是一个使用不同类型构造函数创建RDN的示例。
Rdn rdn1 = new Rdn("ou= Juicy\\, Fruit");
System.out.println("rdn1:" + rdn1.toString());
Rdn rdn2 = new Rdn(rdn1);
System.out.println("rdn2:" + rdn2.toString());
Attributes attrs = new BasicAttributes();
attrs.put("ou", "Juicy, Fruit");
attrs.put("cn", "Mango");
Rdn rdn3 = new Rdn(attrs);
System.out.println("rdn3:" + rdn3.toString());
Rdn rdn4 = new Rdn("ou", "Juicy, Fruit");
System.out.println("rdn4:" + rdn4.toString());
可以使用以下方法获取RDN的类型/值:
getType()
getValue()
toAttributes()
对于由单个类型/值对组成的RDN,getType()方法返回类型,getValue()方法返回RDN的值。方法toAttributes()返回类型/值对的属性视图。下面的示例打印了RDN的类型/值对。
Attributes attrs = new BasicAttributes();
attrs.put("o", "Yellow");
attrs.put("cn", "Mango");
// create a binary value for the RDN
byte[] mangoJuice = new byte[6];
for (int i = 0; i < mangoJuice.length; i++) {
mangoJuice[i] = (byte) i;
}
attrs.put("ou", mangoJuice);
Rdn rdn = new Rdn(attrs);
System.out.println();
System.out.println("size:" + rdn.size());
System.out.println("getType(): " + rdn.getType());
System.out.println("getValue(): " + rdn.getValue());
// test toAttributes
System.out.println();
System.out.println("toAttributes(): " + rdn.toAttributes());
为了获取按照RFC 2253规定的语法格式化的RDN的字符串表示,您可以使用:
当您使用接受String参数的Rdn构造函数时,您提供了一个RDN的字符串表示,并获得一个Rdn实例。要做相反的操作,即获取Rdn实例的字符串表示,您可以使用toString()方法。toString()的结果可以传递给Rdn构造函数,以产生与原始Rdn实例相等的Rdn实例。
下面是一个示例:
Rdn rdn = new Rdn("cn=Juicy\\,Fruit");
String str = rdn.toString();
System.out.println(str);
Rdn rdn2 = new Rdn(str);
System.out.println(rdn.equals(rdn2)); // true
以下方法用于比较RDNs:
equals(Object Rdn)
compareTo(Object Rdn)
你可以使用compareTo()来对Rdn实例的列表进行排序。equals()方法可以判断两个Rdn是否在语法上相等。如果两个Rdn具有相同的(大小写匹配)类型/值对,则它们是相等的。在多值RDN中,组件的顺序是不重要的。
这是一个示例:
Rdn one = new Rdn("ou=Sales+cn=Bob");
Rdn two = new Rdn("cn=Bob+ou=Sales");
Rdn three = new Rdn("ou=Sales+cn=Bob+c=US");
Rdn four = new Rdn("cn=lowercase");
Rdn five = new Rdn("cn=LowerCASE");
System.out.println(one.equals(two)); // true
System.out.println(two.equals(three)); // false
System.out.println(one.equals(three)); // false
System.out.println(four.equals(five)); // true
Rdn类的一个最好的用途是处理由特殊字符组成的DN。它会自动处理特殊字符的转义和反转义。根据RFC 2253,字符'\'(反斜杠)、','(逗号)、+(加号)等具有特定的语义。在DN中将这些字符作为字面值使用时,必须使用'\'(反斜杠)进行转义。
例如,考虑一个RDN:cn=Juicy, Fruit 在Juicy和Fruit之间出现的逗号是一个特殊字符,需要使用'\'(反斜杠)进行转义。转义后的语法格式化的RDN如下:cn=Juicy\, Fruit 然而,'\'(反斜杠)字符本身是Java语言字符串语法中的特殊字符,需要再次使用'\'(反斜杠)进行转义。Java语言字符串格式和RFC 2253都使用'\'(反斜杠)来转义特殊字符。因此,Java格式化的RDN字符串如下:cn=Juicy\\, Fruit 注意,上述的格式化规则仅适用于Rdn的值组件。Rdn类提供了两个静态方法来处理RDN值的自动转义和反转义:
下面的示例展示了如何获取DN的字符串表示,而无需处理RFC 2253中定义的处理特殊字符的语法。
// 使用逗号分隔的DN
String unformatted = "Juicy, Fruit";
String formatted = Rdn.escapeValue(unformatted);
LdapName dn = new LdapName("cn=" + formatted);
System.out.println("dn:" + dn);
unformatted = "true+false";
formatted = Rdn.escapeValue(unformatted);
dn = new LdapName("cn=" + formatted);
System.out.println("dn:" + dn);
// DN中包含二进制值作为其中一个属性的值
byte[] bytes = new byte[] {1, 2, 3, 4};
formatted = Rdn.escapeValue(bytes);
System.out.println("Orig val: " + bytes + "Escaped val: " + formatted);
同样地,使用静态的 unescapeValue() 方法,可以从格式化的值中获取原始字符串。 这里 有一个检索原始值的示例。
// 使用逗号分隔的DN
String unformatted = "Juicy, Fruit";
String formatted = Rdn.escapeValue(unformatted);
System.out.println("Formatted:" + formatted);
Object original = Rdn.unescapeValue(formatted);
System.out.println("Original:" + original);
// DN中包含加号
unformatted = "true+false";
formatted = Rdn.escapeValue(unformatted);
System.out.println("Formatted:" + formatted);
original = Rdn.unescapeValue(formatted);
System.out.println("Original:" + original);
// DN中包含二进制值作为其中一个属性的值
byte[] bytes = new byte[] {1, 2, 3, 4};
formatted = Rdn.escapeValue(bytes);
System.out.println("Formatted:" + formatted);
original = Rdn.unescapeValue(formatted);
System.out.println("Original:" + original);