分页结果控件
BasicControl
实现javax\.naming\.ldap\.Control
的javax.naming.ldap.BasicControl作为扩展其他控件的基本实现。
分页结果控件
分页结果控件对于希望以受页面大小限制的受控方式接收搜索结果的 LDAPClient 端很有用。Client 端可以根据其资源的可用性(例如带宽和处理能力)来配置页面大小。
服务器使用 cookie(类似于 HTTP 会话 cookie 机制)来维护搜索请求的状态,以便跟踪发送到 Client 端的结果。分页结果控件在RFC 2696中指定。下面的类提供支持分页结果控件所需的功能。
如何使用分页结果控件?
下面的示例说明了进行请求一个页面大小限制为 5 的搜索的 Client 端之间的 Client 端-服务器交互。服务器返回的整个结果集包含 21 个条目。
- Client 端发送搜索请求,要求页面大小为 5 的分页结果。
// Activate paged results
int pageSize = 5; // 5 entries per page
byte[] cookie = null;
int total;
ctx.setRequestControls(new Control[]{
new PagedResultsControl(pageSize, Control.CRITICAL) });
// Perform the search
NamingEnumeration results = ctx.search("", "(objectclass=*)",
new SearchControls());
- 服务器以条 Object 响应加上搜索结果中总共 21 条条 Object 指示以及 Client 端在检索后续页面时使用的不透明 Cookie 来进行响应。
// Iterate over a batch of search results sent by the server
while (results != null && results.hasMore()) {
// Display an entry
SearchResult entry = (SearchResult)results.next();
System.out.println(entry.getName());
// Handle the entry's response controls (if any)
if (entry instanceof HasControls) {
// ((HasControls)entry).getControls();
}
}
// Examine the paged results control response
Control[] controls = ctx.getResponseControls();
if (controls != null) {
for (int i = 0; i < controls.length; i++) {
if (controls[i] instanceof PagedResultsResponseControl) {
PagedResultsResponseControl prrc =
(PagedResultsResponseControl)controls[i];
total = prrc.getResultSize();
cookie = prrc.getCookie();
} else {
// Handle other response controls (if any)
}
}
}
- Client 端发送相同的搜索请求,返回不透明的 cookie,请求下一页。
// Re-activate paged results
ctx.setRequestControls(new Control[]{
new PagedResultsControl(pageSize, cookie, Control.CRITICAL) });
- 服务器以五个条目加上一个指示表明还有更多条目作为响应。Client 端重复步骤 4 中执行的搜索,直到服务器返回空 cookie,这表明服务器不再发送任何条目。
完整的 JNDI 示例可以找到here。
注意: Windows Active Directory 服务器支持分页搜索控件。 Oracle Directory Server 5.2 版不支持它