您的位置:首页 > 其它

JNDI操作LDAP实现(二)

2013-07-15 17:36 369 查看

2.1 JNDI服务提供者

不使用服务提供者就不能用JNDI。一个服务提供者就是一组Java类的集合,它支持开发者同目录服务进行通信,其方式类似于JDBC驱动程序与数据库之间的通信方式。能够用于JNDI的服务提供者必须实现Context接口或Context的扩展接口Directory- Context。

在使用JNDI时,读者只需要了解JNDI,而服务提供者才关注实际的网络协议、编码/解码值等细节。

当下载SDK软件开发包时,同时就下载了Sun公司的一些现有的服务提供者。这些服务提供者包括LDAP、NIS、COS(CORBA对象服务)、RMI注册及文件系统的提供者。如:hashtableObj.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.ldapCtx- Fatory")就是表示使用Sun LDAP服务提供者。当然如果要使用IBM服务提供者时就可以用com.ibm.jndi.LDAPCtxFatory来代替com.sun.jndi.ldap.ldapCtxFatory。

2.2 JNDI的包

JNDI中包括5个包。

· javax.naming:主要用于命名操作,它包含了命名服务的类和接口,该包定义了Context接口和InitialContext类;

· javax.naming.directory:主要用于目录操作,它定义了DirContext接口和InitialDir- Context类;

· javax.naming.event:在命名目录服务器中请求事件通知;

· javax.naming.ldap:提供LDAP支持;

· javax.naming.spi:允许动态插入不同实现,为不同命名目录服务供应商的开发人员提供开发和实现的途径,以便应用程序通过JNDI可以访问相关服务。

2.3 常用的JNDI操作

常用的JNDI操作如下:

· void bind(String sName,Object object),绑定:把名称同对象关联的过程。

· void rebind(String sName,Object object),重新绑定:用来把对象同一个已经存在的名称重新绑定。一般使用rebind()而不使用bind(),因为当有重名的时候rebind()不会出现异常,而bind()会报异常。

· void unbind(String sName),释放:用来把对象从目录中释放出来。

· void lookup(String sName,Object object),查找:返回目录总的一个对象。

· void rename(String sOldName,String sNewName),重命名:用来修改对象名称绑定的名称。

· NamingEnumeration listBindings(String sName),清单:返回绑定在特定上下文中指定属性名对象的清单列表,它返回名字、类和对象本身,它用于那些需要对对象进行实际操作的应用。具体使用如下:

//得到初始目录环境的一个引用

Context cntxt = new InitialContext();

//返回绑定在特定上下文中指定属性名对象的清单列表

NamingEnumeration namEnumList = ctxt.listBinding("cntxtName");

//循环列出所有名字、类和对象

while ( namEnumList.hasMore() ) {

Binding bnd = (Binding) namEnumList.next();

String sObjName = bnd.getName();

String sClassName = bnd.getClassName();

//得到对象

SomeObject objLocal = (SomeObject) bnd.getObject();

}

· NamingEnumeration list(String sName)与listBindings(String sName)相似,只是它只返回一系列名字/类映射,它主要是用于上下文浏览应用。

2.4 JNDI操作步骤

使用JNDI来访问命名服务或者目录服务,操作步骤如下:

(1)建立一个散列表(hashtable),它包含定义所希望使用的JNDI服务的属性,所希望连接的LDAP服务器IP地址以及工作的端口。

(2)将与认证成为用户登录有关的任何信息添加到散列表中。

(3)创建初始context对象。如果访问命名服务,则使用InitialContext类,如果访问目录服务,则要使用InitialDirContext类。

(4)使用刚才得到的context对象执行所需的操作(如添加新的条目或者搜索条目)。

(5)完成操作后关闭context对象。

2.5 JNDI允许存储的对象类型

JNDI最大的功能是能使用LDAP来存储需要在不同应用之间共享或者留做备用的对象。JNDI允许将下面几种与Java相关的对象类型存储到LDAP服务器内。

(1)串行化的Java对象。这是存储和取回已经串行化的Java对象的能力。也就是说要存储的Java对象必须要实现Referenceable或Serializable接口类,否则该对象不能存储。

(2)标准的LDAP目录条目。它提供了操作标准目录数据的能力。标准目录数据的数据量比较小,可以在不同的语言之间共享它们。保持目录数据与编程语言的无关性对于要使用几种不同语言进行开发的大企业里是非常重要的。

(3)指向RMI Java对象的指针。RMI是用于分布式计算的,通过RMI,一个Java应用可以像本地一样调用一个远程类的方法。我们可以把一个可用的RMI类的引用存储在开发者的LDAP服务器中,而不必在每个装有RMI客户应用的计算机上都保持可用方法的注册。

2.6 JNDI存储查询串行化的Java对象

JNDI的主要目标是在网络上读/写Java对象。下面用具体实例来了解怎么使用JNDI。首先通过一个例子来讲解怎么样在LDAP中保存串行化的Java对象数据,再用一个例子来说明怎么对保存的对象数据进行查询、调用。

1.保存数据

在LDAP中保存数据就是在LDAP服务器中添加使用条目,也就是把条目绑定在服务器中。下面先建立一个基本类,再在另一个类中利用JNDI把这个基本类绑定在服务器中。

4 例6-1 在LDAP中保存数据。

(1)待绑定的基本类

package jndi;

import java.io.serializable;

public class persons
implements Serializable {

String Name =
"";

String Age ="" ;

public persons () {

}

//构造函数,用于给变量赋值

public persons (String namePara,String age) {

Name = namePara;

Age = age;

}

//用于返回变量Name的值

public String getName() {

return Name;

}

//用于返回变量Age的值


public
String getAge () {

return Age;

}

}

http://blog.sina.com.cn/s/blog_4b197bcb01009pr9.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: