首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

SpringLDAP-Reference(汉语文档)(五)

2012-10-13 
SpringLDAP-Reference(中文文档)(五)第五章 DirContext配制5.1 自定义DirContext 前后处理?某些情况下,在

SpringLDAP-Reference(中文文档)(五)

第五章 DirContext配制

5.1 自定义DirContext 前后处理
?某些情况下,在搜索前后要调用DirContext进行操作,进行这种操作的接口为DirContextProcessor
?
?publicinterfaceDirContextProcessor{
?publicvoidpreProcess(DirContextctx)throwsNamingException;
?publicvoidpostProcess(DirContextctx)throwsNamingException;
?}
?LdapTemplate有一个查询方法提供了DirContextProcessor
?
?publicvoidsearch(SearchExecutorse,NameClassPairCallbackHandlerhandler,
?DirContextProcessorprocessor)throwsDataAccessException;
?
?在查询之前,前处理方法提供了一个DirContextProcessor的实例 ,当查询完成并处理后,调用后处理方法,这对于用户在查询中调用DirContext,查询完成后检查
?DirContext非常有用。例如在处理请求和响应控制

?也有一些并不需要自定义SearchExecutor的方法:
?
??publicvoidsearch(Namebase,Stringfilter,
??SearchControlscontrols,NameClassPairCallbackHandlerhandler,DirContextProcessorprocessor)
??publicvoidsearch(Stringbase,Stringfilter,
??SearchControlscontrols,NameClassPairCallbackHandlerhandler,DirContextProcessorprocessor)
??publicvoidsearch(Namebase,Stringfilter,
??SearchControlscontrols,AttributesMappermapper,DirContextProcessorprocessor)
??publicvoidsearch(Stringbase,Stringfilter,
??SearchControlscontrols,AttributesMappermapper,DirContextProcessorprocessor)
??publicvoidsearch(Namebase,Stringfilter,
??SearchControlscontrols,ContextMappermapper,DirContextProcessorprocessor)
??publicvoidsearch(Stringbase,Stringfilter,
??SearchControlscontrols,ContextMappermapper,DirContextProcessorprocessor)
?
?5.2 实现一个请求控制的DirContextProcessor
?LDAPv3标准使用控制器来发送和接收数据来影响一些预定义行为,为了简化一个请求控制DirContextProcessor的实现,spring ldap提供了一基类
?AbstractRequestControlDirContextProcessor,这个方法来处理LdapContext的当前请求,控制方法调用一个模板创建的请求,并添加到Ldapcontext中,你要做的是在类中实现createRequestControl,和postProcess方法来实现查询后你要完成的操作。
??publicabstractclassAbstractRequestControlDirContextProcessorimplements
??DirContextProcessor{
??publicvoidpreProcess(DirContextctx)throwsNamingException{
??...
??}
??publicabstractControlcreateRequestControl();
??}
???一个典型的DirContextProcessor,类似如下代码:
???
???例5.1 一个请求控制的实现
???packagecom.example.control;
???publicclassMyCoolRequestControlextendsAbstractRequestControlDirContextProcessor{
???privatestaticfinalbooleanCRITICAL_CONTROL=true;
???privateMyCoolCookiecookie;
???...
???publicMyCoolCookiegetCookie(){
???returncookie;
???}
???publicControlcreateRequestControl(){
???returnnewSomeCoolControl(cookie.getCookie(),CRITICAL_CONTROL);
???}
???publicvoidpostProcess(DirContextctx)throwsNamingException{
???LdapContextldapContext=(LdapContext)ctx;
???Control[]responseControls=ldapContext.getResponseControls();
???for(inti=0;i<responseControls.length;i++){
???if(responseControls[i]instanceofSomeCoolResponseControl){
???SomeCoolResponseControlcontrol=(SomeCoolResponseControl)responseControls[i];
???this.cookie=newMyCoolCookie(control.getCookie());
???}
???}
???}
???}
??
??注意:
??当前使用Controls时,一定要使用LdapContextSource,这个接口是特定的用来使用LdapContext代替DirContext的,如果一个AbstractRequestControlDirContextProcessor子类调用的不是一个LdapContext参数,它将抛出异常IllegalArgumentException
??
??5.3 查询结果分页
??
??某些查询可能返回大量结果集。当我们没有简便的方法去筛选出较小的数据量时,它将方便的让服务器返回一定数量结果集,这称为分页搜索。结果的每一页和上下页链接将被显示出来,如果没有这个功能,客户端需手动限制结果页或检索整个结果集截取一部分,前者比较麻烦,后者比较消耗内存。
??
??许多Ldap服务器都支持PagedResultsControl,它发送请求,服务器返回搜索结果特定页,用户控制返回页进度(Rate),简单称为进度搜索,但是用户必须保持跟踪调用中的会话,使服务器知道上一次搜索结果页及从哪开始搜索。SpringLdap提供了使用LdapContext对搜索结果前后处理的分页方法,这在前面有讨论。它通过两个类
??PagedResultsRequestControl和PagedResultsCookie,PagedResultsRequestControl类建立了一个PagedResultsControl来请求页面大小,并放入LdapContext中,搜索完成后,从PagedResultsResponseControl中得到两部分信息,预计总结果大小及cookie。cookie是一个字节数组,包含了通过PagedResultsControl下一次调用服务器时所需的信息,为了更好的存储这些信息,ldap提供了包装类PagedResultsCookie.
??
??下面的例子展示了如何分页搜索。
??例5.2 使用PagedResultsRequestControl返回分页结果
??
??publicPagedResultgetAllPersons(PagedResultsCookiecookie){
??PagedResultsRequestControlcontrol=newPagedResultsRequestControl(PAGE_SIZE,cookie);
??SearchControlssearchControls=newSearchControls();
??searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
??Listpersons=ldapTemplate.search("","objectclass=person",searchControls,control);
??returnnewPagedResult(persons,control.getCookie());
??}
???
??第一次调用此方法,cookie参数将为NULL,但在随后的每一次调用时都要提供上次的PagedResult包装的cookie信息,当 Cookie无效时
??(pagedResult.getCookie().getCookie() returns null),即表示最后一批结果已返回。

?

1 楼 xfei6868 2010-04-29   在spring-ldap 1.3的文档中也有同样的例子,没有找到此方法,遗憾中!

正在为分页的事情烦恼!

普通搜索 报出  ; nested exception is javax.naming.SizeLimitExceededException:

热点排行