此 Java 教程是为 JDK 8 编写的。本页面中描述的示例和实践不利用后续版本引入的改进,并且可能使用不再可用的技术。
请参阅 Java 语言更改,了解 Java SE 9 及后续版本中更新的语言特性的概述。
请参阅 JDK 发行说明,了解有关所有 JDK 发布的新功能、增强功能以及已删除或弃用选项的信息。
在命名示例中,我们讨论了如何使用bind()、rebind()等方法。DirContext接口包含了这些方法的重载版本,可以接受属性作为参数。您可以使用这些DirContext方法,在将绑定或子上下文添加到命名空间时,将属性与对象关联起来。例如,您可以创建一个Person对象,并将其绑定到命名空间,同时关联有关该Person对象的属性。
DirContext.bind()用于向上下文中添加具有属性的绑定。它的参数包括对象的名称、要绑定的对象和一组属性。
// 创建要绑定的对象 Fruit fruit = new Fruit("orange"); // 创建要与对象关联的属性 Attributes attrs = new BasicAttributes(true); // 忽略大小写 Attribute objclass = new BasicAttribute("objectclass"); objclass.add("top"); objclass.add("organizationalUnit"); attrs.put(objclass); // 执行绑定 ctx.bind("ou=favorite, ou=Fruits", fruit, attrs);
此示例
创建了一个Fruit类的对象,并将其绑定到"ou=favorite"的名称,相对于ctx的"ou=Fruits"上下文中。此绑定具有"objectclass"属性。如果您随后在ctx中查找"ou=favorite, ou=Fruits",您将获得fruit对象。如果您随后获取"ou=favorite, ou=Fruits"的属性,您将得到创建对象时使用的这些属性。以下是此示例的输出。
# java Bind orange attribute: objectclass value: top value: organizationalUnit value: javaObject value: javaNamingReference attribute: javaclassname value: Fruit attribute: javafactory value: FruitFactory attribute: javareferenceaddress value: #0#fruit#orange attribute: ou value: favorite
显示的额外属性和属性值用于存储有关对象(fruit)的信息。有关这些额外属性的详细讨论将在本教程中进行。
如果您运行此示例两次,第二次尝试将失败,并出现NameAlreadyBoundException异常。这是因为"ou=favorite"名称已经在"ou=Fruits"上下文中绑定。要使第二次尝试成功,您需要使用rebind()方法。
DirContext.rebind() 用于添加或替换绑定及其属性。它接受与 bind() 相同的参数。然而,rebind() 的语义要求如果名称已经被绑定,则会解绑它并绑定新给定的对象和属性。
// 创建要绑定的对象 Fruit fruit = new Fruit("柠檬"); // 创建要与对象关联的属性 Attributes attrs = new BasicAttributes(true); // 忽略大小写 Attribute objclass = new BasicAttribute("objectclass"); objclass.add("top"); objclass.add("organizationalUnit"); attrs.put(objclass); // 执行绑定 ctx.rebind("ou=favorite, ou=Fruits", fruit, attrs);
# java Rebind 柠檬 属性: objectclass 值: top 值: organizationalUnit 值: javaObject 值: javaNamingReference 属性: javaclassname 值: Fruit 属性: javafactory 值: FruitFactory 属性: javareferenceaddress 值: #0#fruit#lemon 属性: ou 值: favorite