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);