命名服務(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

