文档

Java™教程
隐藏目录
搜索结果
路径:Java命名和目录接口
课程:高级LDAP用户主题
章节:更多LDAP操作

搜索结果

当您在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_SCOPESearchControls.OBJECT_SCOPE执行搜索,并且目标上下文本身满足搜索过滤器,则返回的名称将为""(空名称),因为这是相对于目标上下文的名称。

这还不是全部。如果搜索涉及引荐(参见JNDI教程)或解引用别名(参见JNDI教程),则相应的SearchResult的名称将不是相对于目标上下文的。而是直接引用条目的URL。要确定getName()返回的名称是相对路径还是绝对路径,请使用isRelative()。如果此方法返回true,则该名称相对于目标上下文;如果返回false,则该名称是一个URL。

如果名称是一个URL,并且您需要使用该URL,那么您可以将其传递给初始上下文,该上下文理解URL(请参阅JNDI教程)。

如果您需要获取条目的完整DN,可以使用NameClassPair.getNameInNamespace()

Object

如果搜索是以返回条目的对象为目的进行的(调用了SearchControls.setReturningObjFlag()并传入true),那么SearchResult将包含表示该条目的对象。要检索此对象,您需要调用getObject()。如果先前将一个java.io.SerializableReferenceable或者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教程中的控制和扩展课程。


上一页: LDAP比较
下一页: LDAP非请求通知