【转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(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示例:
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();
//
Lookup an existing Bank object.
Bank myBank =
(Bank) initialContext.lookup(
"
theBank
");

枚举所有名字对象:
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
2060

被折叠的 条评论
为什么被折叠?



