文档

Java™ 教程
隐藏目录
过滤器
路径: Java命名和目录接口
课程: 命名和目录操作
章节: 搜索

过滤器

除了使用一组属性来指定搜索外,还可以使用搜索过滤器来指定搜索。搜索过滤器是以逻辑表达式形式表示的搜索查询。通过DirContext.search()接受的搜索过滤器的语法在RFC 2254中有描述。

以下搜索过滤器指定限定的条目必须具有值为"Geisel""sn"属性和任意值的"mail"属性:

(&(sn=Geisel)(mail=*))

以下代码创建一个过滤器和默认的SearchControls,并使用它们进行搜索。该搜索与基本搜索示例中的搜索等效。

// 创建默认的搜索控件
SearchControls ctls = new SearchControls();

// 指定匹配的搜索过滤器
// 请求具有属性 "sn" == "Geisel" 和 "mail" 的对象
String filter = "(&(sn=Geisel)(mail=*))";

// 使用过滤器搜索对象
NamingEnumeration answer = ctx.search("ou=People", filter, ctls);

运行此示例将产生以下结果。

# java SearchWithFilterRetAll
>>>cn=Ted Geisel
attribute: sn
value: Geisel
attribute: objectclass
value: top
value: person
value: organizationalPerson
value: inetOrgPerson
attribute: jpegphoto
value: [B@1dacd75e
attribute: mail
value: Ted.Geisel@JNDITutorial.example.com
attribute: facsimiletelephonenumber
value: +1 408 555 2329
attribute: cn
value: Ted Geisel
attribute: telephonenumber
value: +1 408 555 5252

搜索过滤器语法快速概述

搜索过滤器语法基本上是前缀表达式的逻辑表达式(即,逻辑运算符出现在其参数之前)。以下表格列出了用于创建过滤器的符号。

符号 描述
& 合取(即, — 列表中的所有条件必须为真)
| 析取(即, — 一个或多个条件必须为真)
! 否定(即, — 被否定的项目必须为假)
= 相等(根据属性的匹配规则)
~= 近似相等(根据属性的匹配规则)
>= 大于(根据属性的匹配规则)
<= 小于(根据属性的匹配规则)
=* 存在(即,条目必须具有该属性,但其值不重要)
* 通配符(表示该位置可以出现零个或多个字符);用于指定要匹配的属性值
\ 转义(用于转义'*'、'('或')',当它们出现在属性值中时)

过滤器中的每个项目由属性标识符和属性值或表示属性值的符号组成。例如,项目"sn=Geisel"表示"sn"属性必须具有属性值"Geisel",而项目"mail=*"表示"mail"属性必须存在。

每个项目必须用一对括号括起来,如"(sn=Geisel)"。这些项目使用逻辑运算符(如"&"(合取))组合成逻辑表达式,如"(& (sn=Geisel) (mail=*))"

每个逻辑表达式还可以由其他作为逻辑表达式的项目进一步组合,如"(| (& (sn=Geisel) (mail=*)) (sn=L*))"。这个例子请求具有"sn"属性为"Geisel""mail"属性的条目或"sn"属性以字母"L"开头的条目。

有关语法的完整描述,请参见RFC 2254

返回选定的属性

前面的例子返回满足指定过滤器的条目关联的所有属性。您可以通过设置搜索控制参数来选择要返回的属性。创建一个包含您希望包含在结果中的属性标识符的数组,并将其传递给SearchControls.setReturningAttributes()。以下是一个示例。

// 指定要返回的属性的ID
String[] attrIDs = {"sn", "telephonenumber", "golfhandicap", "mail"};
SearchControls ctls = new SearchControls();
ctls.setReturningAttributes(attrIDs);

这个示例与基本搜索部分中的返回选定属性示例等效。运行this example将产生以下结果。(条目没有"golfhandicap"属性,因此不返回。)

# java SearchWithFilter
>>>cn=Ted Geisel
属性: sn
值: Geisel
属性: mail
值: Ted.Geisel@JNDITutorial.example.com
属性: telephonenumber
值: +1 408 555 5252

上一页: 基本搜索
下一页: 范围