此Java教程是针对JDK 8编写的。本页面描述的示例和实践未利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改了解Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK发行说明了解所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息。
除了使用一组属性来指定搜索外,还可以使用搜索过滤器来指定搜索。搜索过滤器是以逻辑表达式形式表示的搜索查询。通过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