天若有情

          到教堂懺悔,愿主安撫我罪惡的心靈......
          posts - 4, comments - 35, trackbacks - 0, articles - 24

          關(guān)于JNDI——1

          Posted on 2008-07-31 23:54 freedoom 閱讀(158) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA技術(shù)(好文保存)

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

                   JNDI(The Java Naming and Directory Interface,Java命名和目錄接口)是一組在Java應(yīng)用中訪問(wèn)命名和目錄服務(wù)的API。命名服務(wù)將名稱和對(duì)象聯(lián)系起來(lái),使得我們可以用名稱訪問(wèn)對(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)用使用。

          JNDI概述

                 我們大家每天都不知不覺(jué)地使用了命名服務(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ì)象沒(méi)有屬性。因此,在目錄服務(wù)中,你可以根據(jù)屬性搜 索對(duì)象。JNDI允許你訪問(wèn)文件系統(tǒng)中的文件,定位遠(yuǎn)程RMI注冊(cè)的對(duì)象,訪問(wèn)象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)用訪問(wèn)的是 LDAP、RMI、DNS、還是其他的目錄服務(wù)。換句話說(shuō),JNDI獨(dú)立于目錄服務(wù)的具體實(shí)現(xiàn),只要你有目錄的服務(wù)提供接口(或驅(qū)動(dòng)),你就可以使用目錄。

          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ù)提供者:

          LDAP (Lightweight Directory Access Protocol)服務(wù)提供者CORBA COS (Common Object Request Broker Architecture Common Object Services)命名服務(wù)提供者RMI(Java Remote Method Invocation)注冊(cè)服務(wù)提供者 l DNS(Domain Name System)服務(wù)提供者。

          JNDI API

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

          Javax.naming: 包含了訪問(wèn)命名服務(wù)的類和接口。例如,它定義了Context接口,這是命名服務(wù)執(zhí)行查詢的入口。 Javax.naming.directory: 對(duì)命名包的擴(kuò)充,提供了訪問(wèn)目錄服務(wù)的類和接口。例如,它為屬性增加了新的類,提供了表示目錄上下文的DirContext接口,定義了檢查和更新目錄對(duì) 象的屬性的方法。Javax.naming.event:提供了對(duì)訪問(wèn)命名和目錄服務(wù)時(shí)的時(shí)間通知的支持。例如,定義了NamingEvent類, 這個(gè)類用來(lái)表示命名/目錄服務(wù)產(chǎn)生的事件,定義了偵聽(tīng)NamingEvents的NamingListener接口。 Javax.naming.ldap:這個(gè)包提供了對(duì)LDAP 版本3擴(kuò)充的操作和控制的支持,通用包 javax.naming.directory沒(méi)有包含這些操作和控制。Javax.naming.spi:這個(gè)包提供了一個(gè)方法,通過(guò) javax.naming和有關(guān)包動(dòng)態(tài)增加對(duì)訪問(wèn)命名和目錄服務(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è)命名方法都有兩種重載形式:

                 Lookup (String name):接受串名 l 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(); 
          factory env.put(Context.INITIAL_CONTEXT_FACTORY, 
          "com.sun.jndi.fscontext.RefFSContext");  
          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ù)提供者指定了工廠類。

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

           

          主站蜘蛛池模板: 施甸县| 方山县| 宁夏| 密山市| 黑山县| 浪卡子县| 上饶市| 华宁县| 扶余县| 克山县| 铁力市| 衡东县| 松滋市| 九龙县| 汤阴县| 崇信县| 门源| 三江| 永川市| 红原县| 邵东县| 珲春市| 辛集市| 临潭县| 吐鲁番市| 疏附县| 新泰市| 黄骅市| 临湘市| 台北市| 醴陵市| 木兰县| 南岸区| 镇安县| 克山县| 绥棱县| 利辛县| 亳州市| 新蔡县| 大渡口区| 宜川县|