列出上下文
您不必像Context.lookup()那样一次获取单个对象,而是可以使用单个操作列出整个上下文。有两种列出上下文的方法:一种返回绑定,另一种仅返回名称-对象类名称对。
Context.List()方法
Context.list()返回NameClassPair的枚举。每个NameClassPair
均包含对象的名称及其类名称。以下代码段列出了"ou=People"
目录的内容(即在"ou=People"
目录中找到的文件和目录)。
NamingEnumeration list = ctx.list("ou=People");
while (list.hasMore()) {
NameClassPair nc = (NameClassPair)list.next();
System.out.println(nc);
}
运行this example将产生以下输出。
# java List
cn=Jon Ruiz: javax.naming.directory.DirContext
cn=Scott Seligman: javax.naming.directory.DirContext
cn=Samuel Clemens: javax.naming.directory.DirContext
cn=Rosanna Lee: javax.naming.directory.DirContext
cn=Maxine Erlund: javax.naming.directory.DirContext
cn=Niels Bohr: javax.naming.directory.DirContext
cn=Uri Geller: javax.naming.directory.DirContext
cn=Colleen Sullivan: javax.naming.directory.DirContext
cn=Vinnie Ryan: javax.naming.directory.DirContext
cn=Rod Serling: javax.naming.directory.DirContext
cn=Jonathan Wood: javax.naming.directory.DirContext
cn=Aravindan Ranganathan: javax.naming.directory.DirContext
cn=Ian Anderson: javax.naming.directory.DirContext
cn=Lao Tzu: javax.naming.directory.DirContext
cn=Don Knuth: javax.naming.directory.DirContext
cn=Roger Waters: javax.naming.directory.DirContext
cn=Ben Dubin: javax.naming.directory.DirContext
cn=Spuds Mackenzie: javax.naming.directory.DirContext
cn=John Fowler: javax.naming.directory.DirContext
cn=Londo Mollari: javax.naming.directory.DirContext
cn=Ted Geisel: javax.naming.directory.DirContext
Context.listBindings()方法
Context.listBindings()返回Binding的枚举。 Binding
是NameClassPair
的子类。绑定不仅包含对象的名称和类名称,还包含对象。以下代码枚举"ou=People"
上下文,打印出每个绑定的名称和对象。
NamingEnumeration bindings = ctx.listBindings("ou=People");
while (bindings.hasMore()) {
Binding bd = (Binding)bindings.next();
System.out.println(bd.getName() + ": " + bd.getObject());
}
运行this example将产生以下输出。
# java ListBindings
cn=Jon Ruiz: com.sun.jndi.ldap.LdapCtx@1d4c61c
cn=Scott Seligman: com.sun.jndi.ldap.LdapCtx@1a626f
cn=Samuel Clemens: com.sun.jndi.ldap.LdapCtx@34a1fc
cn=Rosanna Lee: com.sun.jndi.ldap.LdapCtx@176c74b
cn=Maxine Erlund: com.sun.jndi.ldap.LdapCtx@11b9fb1
cn=Niels Bohr: com.sun.jndi.ldap.LdapCtx@913fe2
cn=Uri Geller: com.sun.jndi.ldap.LdapCtx@12558d6
cn=Colleen Sullivan: com.sun.jndi.ldap.LdapCtx@eb7859
cn=Vinnie Ryan: com.sun.jndi.ldap.LdapCtx@12a54f9
cn=Rod Serling: com.sun.jndi.ldap.LdapCtx@30e280
cn=Jonathan Wood: com.sun.jndi.ldap.LdapCtx@16672d6
cn=Aravindan Ranganathan: com.sun.jndi.ldap.LdapCtx@fd54d6
cn=Ian Anderson: com.sun.jndi.ldap.LdapCtx@1415de6
cn=Lao Tzu: com.sun.jndi.ldap.LdapCtx@7bd9f2
cn=Don Knuth: com.sun.jndi.ldap.LdapCtx@121cc40
cn=Roger Waters: com.sun.jndi.ldap.LdapCtx@443226
cn=Ben Dubin: com.sun.jndi.ldap.LdapCtx@1386000
cn=Spuds Mackenzie: com.sun.jndi.ldap.LdapCtx@26d4f1
cn=John Fowler: com.sun.jndi.ldap.LdapCtx@1662dc8
cn=Londo Mollari: com.sun.jndi.ldap.LdapCtx@147c5fc
cn=Ted Geisel: com.sun.jndi.ldap.LdapCtx@3eca90
终止命名枚举
NamingEnumeration可用以下三种方式之一终止:自然,显式或意外终止。
-
当NamingEnumeration.hasMore()返回
false
时,枚举完成并有效终止。 -
您可以通过调用NamingEnumeration.close()显式终止枚举。这样做为底层实现提供了一个提示,以释放与枚举关联的所有资源。
-
如果
hasMore\(\)
或next()抛出NamingException,则枚举有效终止。
无论枚举如何终止,终止后都无法使用。在终止的枚举上调用方法会产生不确定的结果。
为什么使用两种不同的列表方法?
list\(\)
用于仅希望在上下文中显示对象名称的浏览器样式的应用程序。例如,浏览器可能会在上下文中列出名称,并 await 用户选择显示的一个或几个名称来执行进一步的操作。此类应用程序通常不需要访问上下文中的所有对象。
listBindings\(\)
适用于需要在上下文中对对象进行整体操作的应用程序。例如,备份应用程序可能需要对文件目录中的所有对象执行“文件统计”操作。或者,打印机 管理 程序可能想重新启动构建中的所有打印机。为了执行此类操作,这些应用程序需要获取绑定在上下文中的所有对象。因此,更方便的方法是将对象作为枚举的一部分返回。
应用程序可以使用list\(\)
或可能更昂贵的listBindings\(\)
,具体取决于它所需的信息类型。