JDNI

JNDI全名為Java Naming and Directory Interface.JNDI主要提供應用程式所需要資源上命名目錄服務。在Java EE環境中,JNDI扮演了一個很重要的角色,它提供了一個接口讓用戶在不知道資源所在位置的情形下,取得該資源服務。就好比網路磁碟驅動器的功能一樣。如果有人事先將另一台機器上的磁碟驅動器接到用戶的機器上,用戶在使用的時候根本就分辨不出現在的驅動器是存在本端,還是在另一端的機器上,用戶只需取得資源來用,根本就不知道資源在什麼地方。

基本介紹

  • 中文名:JNDI
  • 外文名:Java Naming and Directory Interface.
  • 用途命名目錄服務
  • 接口:基本上是LDAP,LDAP
基本信息,優點,程式包,與JDBC,代碼示例,常用的操作,

基本信息

JNDI這個接口基本上是LDAP,LDAP全名為Lightweight Directory Access Protocol
JNDI(Java Naming and Directory Interface)是一個應用程式設計的API,
為開發人員提供了查找和訪問各種命名目錄服務的通用、統一的接口,類似JDBC都是構建在抽象層上。
JNDI可訪問的現有的目錄及服務有:
DNS、XNam 、Novell目錄服務、LDAP(Lightweight Directory Access Protocol 輕型目錄訪問協定)、 CORBA對象服務、檔案系統、Windows XP/2000/NT/Me/9x的註冊表、RMI、DSML v1&v2、NIS。

優點

包含了大量的命名目錄服務,使用通用接口來訪問不同種類的服務;
可以同時連線到多個命名目錄服務上;
建立起邏輯關聯,允許把名稱同Java對象或資源關聯起來,而不必知道對象或資源的物理ID。

程式包

javax.naming:命名操作;
javax.naming.directory:目錄操作;
javax.naming.event:在命名目錄伺服器中請求事件通知;
javax.naming.ldap:提供LDAP支持;
javax.naming.spi:允許動態插入不同實現。
利用JNDI的命名與服務功能來滿足企業級APIs對命名與服務的訪問,
諸如EJBs、JMS、JDBC 2.0以及IIOP上的RMI通過JNDI來使用CORBA的命名服務。

與JDBC

JNDI提供了一種統一的方式,可以用在網路上查找和訪問服務。通過指定一個資源名稱,該名稱對應於資料庫或命名服務中的一個紀錄,同時返回資料庫連線建立所必須的信息。

代碼示例

try{
Context cntxt = new InitialContext();
DataSource ds = (DataSource) cntxt.lookup("jdbc/dpt");
}
catch(NamingException ne){
...
}
JNDI與JMS:
訊息通信是軟體組件或應用程式用來通信的一種方法。
JMS就是一種允許應用程式創建、傳送、接收、和讀取訊息的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讓客戶使用對象的名稱或屬性來查找對象:
foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls);
通過使用JNDI來查找諸如印表機、資料庫這樣的對象,查找印表機的例子:
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());
}

常用的操作

void bind(String sName,Object object);――綁定:把名稱同對象關聯的過程
void rebind(String sName,Object object);――重新綁定:用來把對象同一個已經存在的名稱重新綁定
void unbind(String sName);――釋放:用來把對象從目錄中釋放出來
void lookup(String sName,Object object);――查找:返回目錄總的一個對象
void rename(String sOldName,String sNewName);――
重命名:用來修改對象名稱綁定的名稱
NamingEnumeration listBinding(String sName);――清單:返回綁定在特定上下文中對象的清單列表
NamingEnumeration list(String sName);
代碼示例:重新得到了名稱、類名和綁定對象。
NamingEnumeration namEnumList = ctxt.listBinding("cntxtName");
...
while ( namEnumList.hasMore() ) {
Binding bnd = (Binding) namEnumList.next();
String sObjName = bnd.getName();
String sClassName = bnd.getClassName();
SomeObject objLocal = (SomeObject) bnd.getObject();
}

相關詞條

熱門詞條

聯絡我們