【转http://www.blogjava.net/baoyaer/articles/84309.html】
命名服务(naming service)
命名服务是计算机系统中的一个基本功能。命名服务是将名字和计算机中的一个对象相关联,通过名字可以方便地找到对应的对象。例如,计算机中的文件系统就包含了一个命名服务,你可以通过文件名找到对应的文件对象。
目录服务(directory service)
目录服务是命名服务的延伸,目录服务不只保存对象和对象名的匹配,而且保存这个对象的各种属性,你可以对这些属性进行查询、修改、增加、删除操作。
JNDI(Java Naming Directory Interface)
JNDI是一些标准API接口,Java程序通过这些API可以访问命名目录服务。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提供以下主要接口访问命名服务,JNDI中的一组绑定作为上下文来引用。每个上下文暴露的一组操作是一致的。例如,每个上下文提供了一个查找操作,返回指定名字的相应对象。每个上下文都提供了绑定和撤除绑定名字到某个对象的操作。JNDI使用通用的方式来暴露命名空间,即使用分层上下文以及使用相同命名语法的子上下文。
bind(Name name, Object obj) 建立一个命名到一个对象的匹配关系,也叫绑定
lookup(String name) 通过命名查找其对应的对象
rebind(Name name, Object obj) 重新绑定一个命名到对象,覆盖原来的绑定
unbind(Name name) 解除这个命名到其匹配对象的绑定关系
在客户端使用JNDI:
u 创建一个java.util.Hashtable或者java.util.Properties的实例。
u 添加变量到Hashtable或Properties对象:
由naming server提供的JNDI class类名。
包含aming server位置的URL。
安全信任书。
u 通过Hashtable或Properites或jndi属性文件创建一个InitialContext对象。
示例:
import
java.util.
*
;

import
javax.naming.
*
;

…

env.put(Context.INITIAL_CONTEXT_FACTORY,
"
weblogic.jndi.WLInitialContextFactory
"
);

env.put(Context.PROVIDER_URL,
"
t3://localhost:7001
"
);

InitialContext ctx
=
new
InitialContext(env);
环境变量 | 相应的常量 | 说明 |
java.naming.factory.initial | Context.INITIAL_CONTEXT_FACTORY | Context Factory 类名,由服务提供商给出。 |
java.naming.provider.url | Context.PROVIDE_URL | 初始化地址。 |
java.naming.security. principal | Context.SECURITY_PRINCIPAL | 服务使用者信息。 |
java.naming.security. credentials | Context.SECURITY_CREDENTIAL | 口令。 |
更多的配置示例:
Hashtable env
=
new
Hashtable();

env.put (Context.INITIAL_CONTEXT_FACTORY,

"
weblogic.jndi.WLInitialContextFactory
"
);

env.put(Context.PROVIDER_URL,
"
t3://localhost:7001
"
);

env.put(Context.SECURITY_PRINCIPAL,
"
system
"
);

env.put(Context.SECURITY_CREDENTIALS,
"
password here
"
);


Properties env
=
new
Properties();

env.setProperties (
"
java.naming.factory.initial
"
,

"
weblogic.jndi.WLInitialContextFactory
"
);

env.setProperties(
"
java.naming.provider.url
"
,
"
t3://localhost:7001
"
);

env.setProperties(
"
java.naming.security.principal
"
,
"
tommy
"
);

env.setProperties(
"
java.naming.security.credentials
"
,
"
password here
"
);
创建InitialContext:
Class Name: javax.naming.InitialContext
Interfaces that it implements: javax.naming.Context
Constructors:
public
InitialContext();
public
InitialContext(Hashtable configuration);
public
InitialContext(Properties configuration);
一个Binding示例:
public
static
InitialContext getInitialContext()
throws
NamingException
{

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"weblogic.jndi.WLInitialContextFactory");

env.put(Context.PROVIDER_URL,"t3://localhost:7001");

InitialContext context = new InitialContext(env);

return context;

}

//
Obtain the initial context
InitialContext initialContext
=
getInitialContext();

//
Create a Bank object.
Bank myBank
=
new
Bank();

//
Bind the object into the JNDI tree.
initialContext.rebind(
"
theBank
"
,myBank);

一个Lookup示例:
枚举所有名字对象:
NamingEnumeration Declaration:
public
interface
NamingEnumeration
extends
Enumeration
{
public boolean hashMore() throws NamingException;
public Object next() throws NamingException;
public void close() throws NamingException; //jndi 1.2

}

try
{
…
NamingEnumeration enum = ctx.list("");


while (enum.hasMore())
{

NameClassPair ncp = (NameClassPair) enum.next();

System.out.println("JNDI name is:" + ncp.getName());
}
}

catch
(NamingException e)
{…}
最后的示例:
import
java.util.
*
;

import
javax.naming.
*
;

import
javax.naming.directory.
*
;

import
java.io.
*
;


public
class
ListAll
{


public static void main(java.lang.String[] args)
{

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"weblogic.jndi.WLInitialContextFactory");

env.put(Context.PROVIDER_URL, "t3://localhost:7001");


try
{

InitialContext ctx = new InitialContext(env);

NamingEnumeration enum = ctx.listBindings("");


while(enum.hasMore())
{

Binding binding = (Binding) enum.next();

Object obj = (Object) binding.getObject();

System.out.println(obj);

}


} catch (NamingException e)
{

System.out.println(e);

}

} // end main

}
//
end List