【摘 要】JNDI(Java Naming and Directory Interface)是一個應用程序設計的API,為開發(fā)人員提供了查找和訪問各種命名和目錄服務的通用、統(tǒng)一的接口,類似JDBC都是構建在抽象層上。分布式計算環(huán)境通常使用命名和目錄服務來獲取共享的組件和資源。命名和目錄服務將名稱與位置、服務、信息和資源關聯(lián)起來。命名服務提供名稱—對象的映射。目錄服務提供有關對象的信息,并提供定位這些對象所需的搜索工具。有許多命名和目錄服務實現(xiàn),并且到它們的接口是不同的。Java命名和目錄接口或JNDI提供了一個用于訪問不同的命名和目錄服務的公共接口。因此,了解JNDI在開發(fā)一個EJB應用程序中是至關重要的。另外,JDBC可以用JNDI來訪問一個關系數(shù)據(jù)庫。
【關鍵詞】JNDI;Java EE
中圖分類號:TP18 文獻標識碼:A 文章編號:1009-8283(2009)03-0105-01
1 JNDI的由來
說到JNDI的由來就要先提下Java EE。Java EE是一種利用Java平臺來簡化企業(yè)解決方案的開發(fā)、部署和管理相關的復雜問題的體系結構。Java EE最終目的就是成為一個能夠使企業(yè)開發(fā)者大幅縮短投放市場時間的體系結構。Java EE原名為J2EE,是Sun公司在1997年度Java One大會上發(fā)布的。其目的是未開發(fā)和部署企業(yè)級Web應用制定標準。通過Java EE,Java語言與工具得以延伸到那些復雜的、多層的電子商務和企業(yè)級應用當中。
由于Java EE應用的組件可以獨立運行,而且經(jīng)常是在不同設備上運行,因此客戶端和應用服務器層代碼必須以某種方式查找和參考其他代碼和資源。而實現(xiàn)這點就需要JNDI的幫助了。JNDI可以用于當前各種類型的命名系統(tǒng)。JNDI也可以用于命名和引用位于一個特定的命名系統(tǒng)之外的對象。在一個命名服務可以被利用之前,客戶需要獲取初始JNDI上下文的句柄。名字現(xiàn)在可以綁定到對象,對象可以利用標準的JNDI接口相對于這個上下文進行查找。
2 JNDI程序包
javax.naming:命名操作;
javax.naming.directory:目錄操作;
javax.naming.event:在命名目錄服務器中請求事件通知;
javax.naming.ldap:提供LDAP支持;
javax.naming.spi:允許動態(tài)插入不同實現(xiàn)。
利用JNDI的命名與服務功能來滿足企業(yè)級APIs對命名與服務的訪問,諸如EJBs、JMS、JDBC 2.0以及IIOP上的RMI通過JNDI來使用CORBA的命名服務。
3 常用的JNDI操作
void bind(String sName,Object object);――綁定:把名稱同對象關聯(lián)的過程
void rebind(String sName,Object object);――重新綁定:用來把對象同一個已經(jīng)存在的名稱重新綁定
void unbind(String sName);――釋放:用來把對象從目錄中釋放出來
void lookup(String sName,Object object);――查找:返回目錄總的一個對象
void rename(String sOldName,String sNewName);――重命名:用來修改對象名稱綁定的名稱
NamingEnumeration listBinding(String sName);――清單:返回綁定在特定上下文中對象的清單列表
4 JNDI與JDBC
JNDI提供了一種統(tǒng)一的方式,可以用在網(wǎng)絡上查找和訪問服務。通過指定一個資源名稱,該名稱對應于數(shù)據(jù)庫或命名服務中的一個紀錄,同時返回數(shù)據(jù)庫連接建立所必須的信息。
代碼示例:
try{
Context cntxt = new InitialContext();
DataSource ds = (DataSource) cntxt.lookup(\"jdbc/dpt\");
}
catch(NamingException ne){
...
}
5 JNDI與JMS
消息通信是軟件組件或應用程序用來通信的一種方法。JMS就是一種允許應用程序創(chuàng)建、發(fā)送、接收、和讀取消息的JAVA技術。
代碼示例:
try{
Properties env = new Properties();
InitialContext inictxt = new InitialContext(env);
TopicConnectionFactory connFactory = (TopicConnectionFactory) inictxt.lookup(\"TTopicConnectionFactory\");
...
}
catch(NamingException ne){
...
}
訪問特定目錄:舉個例子,人是個對象,他有好幾個屬性,諸如這個人的姓名、電話號碼、電子郵件地址、郵政編碼等屬性。通過getAttributes()方法
Attribute attr =directory.getAttributes(personName).get(\"email\");
String email = (String)attr.get();
通過使用JNDI讓客戶使用對象的名稱或?qū)傩詠聿檎覍ο螅?/p>
foxes = directory.search(\"o=Wiz,c=US\",\"sn=Fox\",controls);
通過使用JNDI來查找諸如打印機、數(shù)據(jù)庫這樣的對象,查找打印機的例子:
Printer printer = (Printer)namespace.lookup(printerName);
printer.print(document);
瀏覽命名空間:
NamingEnumeration list = namespace.list(\"o=Widget,c=US\");
while (list.hasMore()) {
NameClassPair entry = (NameClassPair)list.next();
display(entry.getName(),entry.getClassName());
}
參考文獻:
[1] http://java.sun.com/products/jndi/examples.html
[2] http://java.sun.com/products/jndi/serviceproviders.html