Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用已不再可用的技术。
请参阅Java语言更改以获取Java SE 9及后续版本中更新的语言功能的摘要。
请参阅JDK发布说明以获取所有JDK版本的新功能、增强功能和已删除或弃用选项的信息。
当您在DirContext接口中使用搜索方法时,将返回一个NamingEnumeration。每个NamingEnumeration中的项都是一个包含以下信息的SearchResult:
每个SearchResult都包含满足搜索过滤器的LDAP条目的名称。您可以使用getName()方法获取条目的名称。该方法返回LDAP条目相对于目标上下文的复合名称。目标上下文是将name参数解析到的上下文。在LDAP术语中,目标上下文是搜索的基对象。以下是一个示例。
NamingEnumeration answer = ctx.search("ou=NewHires", "(&(mySpecialKey={0}) (cn=*{1}))", // 过滤器表达式 new Object[]{key, name}, // 过滤器参数 null); // 默认搜索控制
此示例中的目标上下文是"ou=NewHires"。在answer中的SearchResult中的名称是相对于"ou=NewHires"的。例如,如果getName()返回"cn=J. Duke",那么它相对于ctx的名称将是"cn=J. Duke, ou=NewHires"。
如果您使用SearchControls.SUBTREE_SCOPE或SearchControls.OBJECT_SCOPE执行搜索,并且目标上下文本身满足搜索过滤器,则返回的名称将为""(空名称),因为这是相对于目标上下文的名称。
这还不是全部。如果搜索涉及引荐(参见JNDI教程)或解引用别名(参见JNDI教程),则相应的SearchResult的名称将不是相对于目标上下文的。而是直接引用条目的URL。要确定getName()返回的名称是相对路径还是绝对路径,请使用isRelative()。如果此方法返回true,则该名称相对于目标上下文;如果返回false,则该名称是一个URL。
如果名称是一个URL,并且您需要使用该URL,那么您可以将其传递给初始上下文,该上下文理解URL(请参阅JNDI教程)。
如果您需要获取条目的完整DN,可以使用NameClassPair.getNameInNamespace()。
如果搜索是以返回条目的对象为目的进行的(调用了(SearchControls.setReturningObjFlag())并传入true),那么SearchResult将包含表示该条目的对象。要检索此对象,您需要调用getObject()。如果先前将一个java.io.Serializable、Referenceable或者Reference对象绑定到该LDAP名称,则使用条目的属性来重建该对象(请参阅JNDI教程中的示例)。否则,使用条目的属性创建表示LDAP条目的DirContext实例。在任何一种情况下,LDAP提供程序都会调用对象上的DirectoryManager.getObjectInstance()并返回结果。
如果搜索是以返回条目的对象为目的进行的,那么类名是从返回的对象中派生的。如果搜索请求的属性中包括检索LDAP条目的"javaClassName"属性,则类名为该属性的值。否则,类名为"javax.naming.directory.DirContext"。类名可以从getClassName()获取。
当进行搜索时,可以通过向search()方法之一提供参数,或者使用SearchControls.setReturningAttributes()来设置搜索控件来选择返回的属性。如果没有明确指定属性,则返回所有LDAP条目的属性。要指定不返回任何属性,必须传递一个空数组(new String[0])。
要检索LDAP条目的属性,您需要在SearchResult上调用getAttributes()。
有关如何检索搜索结果的响应控制的详细信息,请参阅JNDI教程中的控制和扩展课程。