JNDI: The Java Naming and Directory Interface
什么是JNDI?
The Java Naming and Directory Interface是訪問不同名字和目錄服務的統一API接口。
不同的服務使用不同的名字格式。
Java程序需要以相同的格式訪問數據庫,文件,目錄,對象和網絡。
JNID有兩部分接口:應用程序接口和提供服務的接口。在應用程序中使用API來訪問名字或目錄服務,在一個新的服務中使用SPI來提供服務。
JNDI結構
名字服務(Naming Services)
名字服務提供一種方法,映射標識符到實體或對象。
你需要知道的幾條基本條款:
綁定:綁定是將一個不可分割的名字("原子"名字)與一個對象聯系起來。像DNS,我們用名字www.yahoo.com與IP地址216.32.74.53聯系起來,一個文件對象用文件名afile.txt聯系起來。
名字空間;名字空間包含一組名字,但名字空間內每個名字是唯一的。一個文件目錄就是一個簡單的名字空間,如目錄C:\temp,在這個目錄下,不能有兩個相同名字的文件,但是,不同目錄下的兩個文件可能有相同的名字。
復合名字:復合名字是用名字空間構成的唯一名字,有一個或多個"原子"名字構成,取決于所在的名字空間。文件路徑就是一個復合名字,比如我們用C:\temp\myfile.txt,我們可以看到,這個名字由根目錄名(C:\),臨時目錄名(temp)和一個文件名(myfile.txt)構成,這3個名字復合起來表示一個唯一的名字。
組合名字:組合名字能跨越多個名字空間。一個URL就是一個組合名字,如果你看見http://www.npu.edu/index.htm,你使用http服務連接到服務器,然后使用另一個名字空間/index.htm來訪問一個文件。
目錄服務
目錄服務提供一組分成等級的目錄對象,具有可搜索的能力。
在目錄服務中存儲的對象可以是任何能用一組屬性描述的對象,每個對象都可通過一組屬性來描述該對象的能力。例如,一個Person對象可能有height,hair color,age,sex等屬性。目錄服務還可提供根據要求來搜索的能力,如我們可以使用Person的age屬性,搜索20-25歲間的Person對象,目錄服務將返回符合條件的Persion對象。這通常被稱作基于內容的搜索。
在客戶端使用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);

以上所有方法都可能拋出NamingException。
一個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");

可能發生的NamingException:
AuthenticationException
CommunicationException
InvalidNameException
NameNotFoundException
NoInitialContextException
枚舉所有名字對象:
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

http://blog.csdn.net/asklxf/archive/2004/07/04/33534.aspx