命名服务(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示例:
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