JNDI(Java Naming Directory Interface)

命名服务(naming service)
命名服务是计算机系统中的一个基本功能。命名服务是将名字和计算机中的一个对象相关联,通过名字可以方便地找到对应的对象。例如,计算机中的文件系统就包含了一个命名服务,你可以通过文件名找到对应的文件对象。
目录服务(directory service)
目录服务是命名服务的延伸,目录服务不只保存对象和对象名的匹配,而且保存这个对象的各种属性,你可以对这些属性进行查询、修改、增加、删除操作。


JNDI(Java Naming Directory Interface)
JNDI是一些标准API接口,java程序通过这些API可以访问命名目录服务。JNDI的定义不依赖于任何独立的命名目录服务器,对于各种命名目录服务器,都可通过统一的JNDI接口调用。JNDI结构如下:





JNDI结构包括两组API:JNDI API(Application Programming Interface)和JNDI SPI(Service Provider Interface)。java应用程序通过JNDI API访问各种命名目录服务。JNDI SPI使得各种命名目录服务透明地加入到JNDI结构中,如上图中的LDAP、DNS、NIS等服务通过JNDI SPI加入到JNDI结构中,从而使java应用程序能够通过JNDI API访问这些服务。


JNDI Context
Context是一系列命名到对象绑定的集合,Context提供以下主要接口访问命名服务:


bind(Name name, Object obj) 建立一个命名到一个对象的匹配关系,也叫绑定
lookup(String name) 通过命名查找其对应的对象
rebind(Name name, Object obj) 重新绑定一个命名到对象,覆盖原来的绑定
unbind(Name name) 解除这个命名到其匹配对象的绑定关系
... ...


Apusic JNDI 应用举例
Apusic Application Server包含一个完全遵循JNDI标准的命名服务器,下面我们举例说明如何通过JNDI接口找到你需要调用的EJB Home接口。


Context ctx = null;
try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.apusic.jndi.InitialContextFactory");
env.put(Context.PROVIDER_URL, "rmi://localhost:6888");
env.put(Context.SECURITY_PRINCIPAL, null);
env.put(Context.SECURITY_CREDENTIALS, null);
ctx = new InitialContext(env);
} catch (Exception e) {
System.err.println("Cannot get initial context: " + e);
System.exit(1);
}


AccountHome home = null;
try {
home = (AccountHome) ctx.lookup("CMAccountHome");
} catch (Exception e) {
System.err.println("Cannot lookup CMAccountHome" + e);
System.exit(1);
}


首先,通过Hashtable env传递JNDI调用参数,取得JNDI Context ctx,各参数说明如下:
Context.INITIAL_CONTEXT_FACTORY: 指定jndi环境的工厂,在Apusic中必须为 com.apusic.jndi.InitialContextFactory
Context.PROVIDER_URL: 指定命名服务提供者的URL,格式为:rmi://localhost:6888
Context.SECURITY_PRINCIPAL: 指定用户身份,null为“匿名用户”
Context.SECURITY_CREDENTIALS: 指定用户密码,同上




然后,通过JNDI Context ctx 的lookup方法找到"CMAccountHome"绑定的CMAccountBean的Home接口。 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章