明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

<>


標(biāo)簽:基于JNDI的應(yīng)用程序開發(fā) 

基于JNDI的應(yīng)用程序開發(fā)

[摘要]JNDI(The Java Naming and Directory Interface,Java命名和目錄接口)是一組在Java應(yīng)用中訪問命名和目錄服務(wù)的API。命名服務(wù)將名稱和對(duì)象聯(lián)系起來(lái),使得我們可以用名稱訪問對(duì)象。目錄服務(wù)是一種命名服務(wù),在這種服務(wù)里,對(duì)象不但有名稱,還有屬性。   命名或...
JNDI(The Java Naming and Directory Interface,Java命名和目錄接口)是一組在Java應(yīng)用中訪問命名和目錄服務(wù)的API。命名服務(wù)將名稱和對(duì)象聯(lián)系起來(lái),使得我們可以用名稱訪問對(duì)象。目錄服務(wù)是一種命名服務(wù),在這種服務(wù)里,對(duì)象不但有名稱,還有屬性。

  命名或目錄服務(wù)使你可以集中存儲(chǔ)共有信息,這一點(diǎn)在網(wǎng)絡(luò)應(yīng)用中是重要的,因?yàn)檫@使得這樣的應(yīng)用更協(xié)調(diào)、更容易管理。例如,可以將打印機(jī)設(shè)置存儲(chǔ)在目錄服務(wù)中,以便被與打印機(jī)有關(guān)的應(yīng)用使用。

  本文用代碼示例的方式給出了一個(gè)快速教程,使你可以開始使用JNDI。它:

  1、提供了JNDI概述

  2、描述了JNDI的特點(diǎn)

  3、體驗(yàn)了一下用JNDI開發(fā)應(yīng)用

  4、表明了如何利用JNDI訪問LDAP服務(wù)器,例如,Sun ONE 目錄服務(wù)器

  5、表明了如何利用JNDI訪問J2EE服務(wù)

  6、提供了示例代碼,你可以將其改編為自己的應(yīng)用

  JNDI概述

  我們大家每天都不知不覺地使用了命名服務(wù)。例如,當(dāng)你在web瀏覽器輸入U(xiǎn)RL,http://java.sun.com時(shí),DNS(Domain Name System,域名系統(tǒng))將這個(gè)符號(hào)URL名轉(zhuǎn)換成通訊標(biāo)識(shí)(IP地址)。命名系統(tǒng)中的對(duì)象可以是DNS記錄中的名稱、應(yīng)用服務(wù)器中的EJB組件(Enterprise JavaBeans Component)、LDAP(Lightweight Directory Access Protocol)中的用戶Profile。

  目錄服務(wù)是命名服務(wù)的自然擴(kuò)展。兩者之間的關(guān)鍵差別是目錄服務(wù)中對(duì)象可以有屬性(例如,用戶有email地址),而命名服務(wù)中對(duì)象沒有屬性。因此,在目錄服務(wù)中,你可以根據(jù)屬性搜索對(duì)象。JNDI允許你訪問文件系統(tǒng)中的文件,定位遠(yuǎn)程RMI注冊(cè)的對(duì)象,訪問象LDAP這樣的目錄服務(wù),定位網(wǎng)絡(luò)上的EJB組件。

  對(duì)于象LDAP 客戶端、應(yīng)用launcher、類瀏覽器、網(wǎng)絡(luò)管理實(shí)用程序,甚至地址薄這樣的應(yīng)用來(lái)說(shuō),JNDI是一個(gè)很好的選擇。

  JNDI架構(gòu)

  JNDI架構(gòu)提供了一組標(biāo)準(zhǔn)的獨(dú)立于命名系統(tǒng)的API,這些API構(gòu)建在與命名系統(tǒng)有關(guān)的驅(qū)動(dòng)之上。這一層有助于將應(yīng)用與實(shí)際數(shù)據(jù)源分離,因此不管應(yīng)用訪問的是LDAP、RMI、DNS、還是其他的目錄服務(wù)。換句話說(shuō),JNDI獨(dú)立于目錄服務(wù)的具體實(shí)現(xiàn),只要你有目錄的服務(wù)提供接口(或驅(qū)動(dòng)),你就可以使用目錄。如圖1所示。 圖1:JNDI架構(gòu)

  關(guān)于JNDI要注意的重要一點(diǎn)是,它提供了應(yīng)用編程接口(application programming interface,API)和服務(wù)提供者接口(service provider interface,SPI)。這一點(diǎn)的真正含義是,要讓你的應(yīng)用與命名服務(wù)或目錄服務(wù)交互,必須有這個(gè)服務(wù)的JNDI服務(wù)提供者,這正是JNDI SPI發(fā)揮作用的地方。服務(wù)提供者基本上是一組類,這些類為各種具體的命名和目錄服務(wù)實(shí)現(xiàn)了JNDI接口—很象JDBC驅(qū)動(dòng)為各種具體的數(shù)據(jù)庫(kù)系統(tǒng)實(shí)現(xiàn)了JDBC接口一樣。作為一個(gè)應(yīng)用開發(fā)者,你不必操心JNDI SPI。你只需要確認(rèn)你要使用的每一個(gè)命名或目錄服務(wù)都有服務(wù)提供者。

  J2SE和JNDI

  Java 2 SDK 1.3及以上的版本包含了JNDI。對(duì)于JDK 1.1和1.2也有一個(gè)標(biāo)準(zhǔn)的擴(kuò)展。Java 2 SDK 1.4.x的最新版本包括了幾個(gè)增強(qiáng)和下面的命名/目錄服務(wù)提供者:

  1、LDAP(Lightweight Directory Access Protocol)服務(wù)提供者

  2、CORBA COS(Common Object Request Broker Architecture Common Object Services)命名服務(wù)提供者

  3、RMI(Java Remote Method Invocation)注冊(cè)服務(wù)提供者 l DNS(Domain Name System)服務(wù)提供者

  更多的服務(wù)提供者

  可以在如下網(wǎng)址找到可以下載的服務(wù)提供者列表:http://java.sun.com/products/jndi/serviceproviders.html 特別有意思的或許是如下網(wǎng)址提供的Windows 注冊(cè)表JNDI服務(wù)提供者:http://cogentlogic.com/cocoon/CogentLogicCorporation/JNDI.xml 這個(gè)服務(wù)提供者使你可以訪問Windows XP/2000/NT/Me/9x的windows注冊(cè)表。也可以在如下網(wǎng)址下載JNDI/LDAP Booster Pack:http://java.sun.com/products/jndi/ 這個(gè)Booster Pack包含了對(duì)流行的LDAP控制的支持和擴(kuò)展。它代替了與LDAP 1.2.1服務(wù)提供者捆綁在一起的booster pack。關(guān)于控制和擴(kuò)展的更多信息可以在如下網(wǎng)站看到: http://java.sun.com/products/jndi/tutorial/ldap/ext/index.html 另一個(gè)有趣的服務(wù)提供者是Sun的支持DSML v2.0(Directory Service Markup Language,目錄服務(wù)標(biāo)記語(yǔ)言)的服務(wù)提供者。DSML的目的是在目錄服務(wù)和XML之間架起一座橋梁。

  JNDI API

  JNDI API由5個(gè)包組成:

  1、Javax.naming:包含了訪問命名服務(wù)的類和接口。例如,它定義了Context接口,這是命名服務(wù)執(zhí)行查詢的入口。

  2、Javax.naming.directory:對(duì)命名包的擴(kuò)充,提供了訪問目錄服務(wù)的類和接口。例如,它為屬性增加了新的類,提供了表示目錄上下文的DirContext接口,定義了檢查和更新目錄對(duì)象的屬性的方法。

  3、Javax.naming.event:提供了對(duì)訪問命名和目錄服務(wù)時(shí)的時(shí)間通知的支持。例如,定義了NamingEvent類,這個(gè)類用來(lái)表示命名/目錄服務(wù)產(chǎn)生的事件,定義了偵聽NamingEvents的NamingListener接口。

  4、Javax.naming.ldap:這個(gè)包提供了對(duì)LDAP 版本3擴(kuò)充的操作和控制的支持,通用包javax.naming.directory沒有包含這些操作和控制。

  5、Javax.naming.spi:這個(gè)包提供了一個(gè)方法,通過(guò)javax.naming和有關(guān)包動(dòng)態(tài)增加對(duì)訪問命名和目錄服務(wù)的支持。這個(gè)包是為有興趣創(chuàng)建服務(wù)提供者的開發(fā)者提供的。

  JNDI 上下文

  正如在前面提到的,命名服務(wù)將名稱和對(duì)象聯(lián)系起來(lái)。這種聯(lián)系稱之為綁定(binding)。一組這樣的綁定稱之為上下文(context),上下文提供了解析(即返回對(duì)象的查找操作)。其他操作包括:名稱的綁定和取消綁定,列出綁定的名稱。注意到一個(gè)上下文對(duì)象的名稱可以綁定到有同樣的命名約定的另一個(gè)上下文對(duì)象。這稱之為子上下文。例如,如果UNIX中目錄/home是一個(gè)上下文,那么相對(duì)于這個(gè)目錄的子目錄就是子上下文—例如,/home/guests中g(shù)uests就是home的子上下文。在JNDI中,上下文用接口javax.naming.Context表示,這個(gè)接口是與命名服務(wù)交互的關(guān)鍵接口。在Context(或稍后討論的

  DirContext)接口中的每一個(gè)命名方法都有兩種重載形式:

  1、Lookup(String name):接受串名

  2、Lookup(javax.naming.Name):接受結(jié)構(gòu)名,例如,CompositeName(跨越了多個(gè)命名系統(tǒng)的名稱)或CompondName(單個(gè)命名系統(tǒng)中的名稱);它們都實(shí)現(xiàn)了Name接口。Compound name的一個(gè)例子是:cn=mydir,cn=Q Mahmoud,ou=People,composite name的一個(gè)例子是:cn=mydir,cn=Q Mahmoud,ou=People/myfiles/max.txt(這里,myfiles/max.txt是表示第二部分的文件名) Javax.naming.InitialContext是實(shí)現(xiàn)了Context接口的類。用這個(gè)類作為命名服務(wù)的入口。為了創(chuàng)建InitialContext對(duì)象,構(gòu)造器以java.util.Hashtable或者是其子類(例如,Properties)的形式設(shè)置一組屬性。下面給出了一個(gè)例子:

  Hashtable env = new Hashtable(); // select a service provider factory env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContext"); // create the initial context Context contxt = new InitialContext(env);

  INITIAL_CONTEXT_FACTORY指定了JNDI服務(wù)提供者中工廠類(factory class)的名稱。Factory負(fù)責(zé)為其服務(wù)創(chuàng)建適當(dāng)?shù)腎nitialContext對(duì)象。在上面的代碼片斷中,為文件系統(tǒng)服務(wù)提供者指定了工廠類。表1給出了所支持的服務(wù)提供者的工廠類。要注意的是文件系統(tǒng)服務(wù)提供者的工廠類需要從Sun公司單獨(dú)下載,J2SE 1.4.x沒有包含這些類。

  表1:上下文INITIAL_CONTEXT_FACTORY的值

  Name Service Provider Factory File System com.sun.jndi.fscontext.RefFSContextFactory LDAP com.sun.jndi.ldap.LdapCtxFactory RMI com.sun.jndi.rmi.registry.RegistryContextFactory CORBA com.sun.jndi.cosnaming.CNCtxFactory DNS com.sun.jndi.dns.DnsContextFactory

  為了用名稱從命名服務(wù)或目錄中取得或解析對(duì)象,使用Context的lookup方法:Object obj=contxt.lookup(name)。Lookup方法返回一個(gè)對(duì)象,這個(gè)對(duì)象表示的是你想要找的上下文的兒子。