# 分页结果控制

> 原文： [https://docs.oracle.com/javase/tutorial/jndi/newstuff/paged-results.html](https://docs.oracle.com/javase/tutorial/jndi/newstuff/paged-results.html)

## BasicControl

实现 `javax.naming.ldap.Control` 的 [`javax.naming.ldap.BasicControl`](https://docs.oracle.com/javase/8/docs/api/javax/naming/ldap/BasicControl.html)作为扩展其他控件的基础实现。

## 分页结果控制

分页结果控件对于希望以受页面大小限制的受控方式接收搜索结果的 LDAP 客户端非常有用。客户端可以根据其资源的可用性（如带宽和处理能力）配置页面大小。

服务器使用 cookie（类似于 HTTP 会话 cookie 机制）来维护搜索请求的状态，以便跟踪发送到客户端的结果。分页结果控制在 [RFC 2696](http://www.ietf.org/rfc/rfc2696.txt) 中指定。下面的类提供了支持分页结果控制所需的功能。

*   [`javax.naming.ldap.PagedResultsControl`](https://docs.oracle.com/javase/8/docs/api/javax/naming/ldap/PagedResultsControl.html)
*   [`javax.naming.ldap.PagedResultsResponseControl`](https://docs.oracle.com/javase/8/docs/api/javax/naming/ldap/PagedResultsResponseControl.html)

### 如何使用分页结果控制？

下面的示例说明了执行搜索请求页面大小限制为 5 的客户端之间的客户端 - 服务器交互。服务器返回的整个结果集包含 21 个条目。

1.  客户端发送搜索请求，询问页面大小为 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());

    ```

2.  服务器响应条目以及搜索结果中 21 个条目的指示以及客户端在检索后续页面时使用的不透明 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 &lt; 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)
                     }
                 }
             }   

    ```

3.  客户端发送相同的搜索请求，返回不透明的 cookie，要求下一页。

    ```
      // Re-activate paged results
             ctx.setRequestControls(new Control[]{
                 new PagedResultsControl(pageSize, cookie, Control.CRITICAL) });

    ```

4.  服务器响应五个条目以及指示有更多条目客户端重复执行步骤 4 中执行的搜索，直到服务器返回空 cookie，这表示服务器不再发送任何条目。

可以找到完整的 JNDI 示例 [`here`](examples/PagedSearch.java) 。

* * *

**注意：** Windows Active Directory 服务器支持分页搜索控件。 Oracle Directory Server 5.2 版不支持它

* * *