基於JNDI的應用開發
JNDI(The Java Naming and Directory InterfaceJava命名和目錄接口)是一組在Java應用中訪問命名和目錄服務的API命名服務將名稱和對象聯系起來使得我們可以用名稱訪問對象目錄服務是一種命名服務在這種服務裡對象不但有名稱還有屬性
命名或目錄服務使你可以集中存儲共有信息這一點在網絡應用中是重要的因為這使得這樣的應用更協調更容易管理例如可以將打印機設置存儲在目錄服務中以便被與打印機有關的應用使用
本文用代碼示例的方式給出了一個快速教程使你可以開始使用JNDI它
l 提供了JNDI概述 l 描述了JNDI的特點 l 體驗了一下用JNDI開發應用 l 表明了如何利用JNDI訪問LDAP服務器例如Sun ONE 目錄服務器 l 表明了如何利用JNDI訪問JEE服務 l 提供了示例代碼你可以將其改編為自己的應用
JNDI概述
我們大家每天都不知不覺地使用了命名服務例如當你在web浏覽器輸入URL時DNS(Domain Name System域名系統)將這個符號URL名轉換成通訊標識(IP地址)命名系統中的對象可以是DNS記錄中的名稱應用服務器中的EJB組件(Enterprise JavaBeans Component)LDAP(Lightweight Directory Access Protocol)中的用戶Profile
目錄服務是命名服務的自然擴展兩者之間的關鍵差別是目錄服務中對象可以有屬性(例如用戶有email地址)而命名服務中對象沒有屬性因此在目錄服務中你可以根據屬性搜索對象JNDI允許你訪問文件系統中的文件定位遠程RMI注冊的對象訪問象LDAP這樣的目錄服務定位網絡上的EJB組件
對於象LDAP 客戶端應用launcher類浏覽器網絡管理實用程序甚至地址薄這樣的應用來說JNDI是一個很好的選擇
JNDI架構
JNDI架構提供了一組標准的獨立於命名系統的API這些API構建在與命名系統有關的驅動之上這一層有助於將應用與實際數據源分離因此不管應用訪問的是LDAPRMIDNS還是其他的目錄服務換句話說JNDI獨立於目錄服務的具體實現只要你有目錄的服務提供接口(或驅動)你就可以使用目錄如圖所示 圖JNDI架構
關於JNDI要注意的重要一點是它提供了應用編程接口(application programming interfaceAPI)和服務提供者接口(service provider interfaceSPI)這一點的真正含義是要讓你的應用與命名服務或目錄服務交互必須有這個服務的JNDI服務提供者這正是JNDI SPI發揮作用的地方服務提供者基本上是一組類這些類為各種具體的命名和目錄服務實現了JNDI接口?很象JDBC驅動為各種具體的數據庫系統實現了JDBC接口一樣作為一個應用開發者你不必操心JNDI SPI你只需要確認你要使用的每一個命名或目錄服務都有服務提供者
JSE和JNDI
Java SDK 及以上的版本包含了JNDI對於JDK 和也有一個標准的擴展Java SDK x的最新版本包括了幾個增強和下面的命名/目錄服務提供者
l LDAP(Lightweight Directory Access Protocol)服務提供者 l CORBA COS(Common Object Request Broker Architecture Common Object Services)命名服務提供者 l RMI(Java Remote Method Invocation)注冊服務提供者 l DNS(Domain Name System)服務提供者
更多的服務提供者
可以在如下網址找到可以下載的服務提供者列表
特別有意思的或許是如下網址提供的Windows 注冊表JNDI服務提供者 這個服務提供者使你可以訪問Windows XP//NT/Me/x的windows注冊表
也可以在如下網址下載JNDI/LDAP Booster Pack 這個Booster Pack包含了對流行的LDAP控制的支持和擴展它代替了與LDAP 服務提供者捆綁在一起的booster pack關於控制和擴展的更多信息可以在如下網站看到 另一個有趣的服務提供者是Sun的支持DSML v(Directory Service Markup Language目錄服務標記語言)的服務提供者DSML的目的是在目錄服務和XML之間架起一座橋梁
JNDI API
JNDI API由個包組成
l Javaxnaming包含了訪問命名服務的類和接口例如它定義了Context接口這是命名服務執行查詢的入口 l Javaxnamingdirectory對命名包的擴充提供了訪問目錄服務的類和接口例如它為屬性增加了新的類提供了表示目錄上下文的DirContext接口定義了檢查和更新目錄對象的屬性的方法 l Javaxnamingevent提供了對訪問命名和目錄服務時的時間通知的支持例如定義了NamingEvent類這個類用來表示命名/目錄服務產生的事件定義了偵聽NamingEvents的NamingListener接口 l Javaxnamingldap這個包提供了對LDAP 版本擴充的操作和控制的支持通用包javaxnamingdirectory沒有包含這些操作和控制 l Javaxnamingspi這個包提供了一個方法通過javaxnaming和有關包動態增加對訪問命名和目錄服務的支持這個包是為有興趣創建服務提供者的開發者提供的
JNDI 上下文
正如在前面提到的命名服務將名稱和對象聯系起來這種聯系稱之為綁定(binding)一組這樣的綁定稱之為上下文(context)上下文提供了解析(即返回對象的查找操作)其他操作包括名稱的綁定和取消綁定列出綁定的名稱注意到一個上下文對象的名稱可以綁定到有同樣的命名約定的另一個上下文對象這稱之為子上下文例如如果UNIX中目錄/home是一個上下文那麼相對於這個目錄的子目錄就是子上下文?例如/home/guests中guests就是home的子上下文在JNDI中上下文用接口javaxnamingContext表示這個接口是與命名服務交互的關鍵接口在Context(或稍後討論的
DirContext)接口中的每一個命名方法都有兩種重載形式
l Lookup(String name)接受串名 l Lookup(javaxnamingName)接受結構名例如CompositeName(跨越了多個命名系統的名稱)或CompondName(單個命名系統中的名稱)它們都實現了Name接口Compound name的一個例子是cn=mydircn=Q Mahmoudou=Peoplecomposite name的一個例子是cn=mydircn=Q Mahmoudou=People/myfiles/maxtxt(這裡myfiles/maxtxt是表示第二部分的文件名) JavaxnamingInitialContext是實現了Context接口的類用這個類作為命名服務的入口為了創建InitialContext對象構造器以javautilHashtable或者是其子類(例如Properties)的形式設置一組屬性下面給出了一個例子
Hashtable env = new Hashtable() // select a service provider factory envput(ContextINITIAL_CONTEXT_FACTORY comsunjndifscontextRefFSContext) // create the initial context Context contxt = new InitialContext(env)
INITIAL_CONTEXT_FACTORY指定了JNDI服務提供者中工廠類(factory class)的名稱Factory負責為其服務創建適當的InitialContext對象在上面的代碼片斷中為文件系統服務提供者指定了工廠類表給出了所支持的服務提供者的工廠類要注意的是文件系統服務提供者的工廠類需要從Sun公司單獨下載JSE x沒有包含這些類
表上下文INITIAL_CONTEXT_FACTORY的值 Name Service Provider Factory File System comsunjndifscontextRefFSContextFactory LDAP comsunjndildapLdapCtxFactory RMI comsunjndirmiregistryRegistryContextFactory CORBA snamingCNCtxFactory DNS comsunjndidnsDnsContextFactory
為了用名稱從命名服務或目錄中取得或解析對象使用Context的lookup方法Object obj=contxtlookup(name)Lookup方法返回一個對象這個對象表示的是你想要找的上下文的兒子
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26774.html