1. java高級編程:基於JNDI的應用開發
基於JNDI的應用開發
JNDI(The Java Naming and Directory Interface Java命名和目錄介面)是一組在Java應用中訪問命名和目錄服務的API 命名服務將名稱和對象聯系起來 使得我們可以用名稱訪問對象 目錄服務是知指兄一種命名服務 在這種服務里 對象不但有名稱 還有屬性
命名或目錄服務使你可以集中存儲共有信息 這一點在網路應用中是重要的 因為這使得這樣的應用更協調 更容易管理 例如 可以將列印機設置存儲在目錄服務中 以便被與列印機有關的應用使用
本文用代碼示例的方式給出了一個快速教程 使你可以開始使用JNDI 它
l 提供了JNDI概述 l 描述了JNDI的特點 l 體驗了一下用JNDI開發應用 l 表明了如何利用JNDI訪問LDAP伺服器 例如 Sun ONE 目錄伺服器 l 表明了如何利用JNDI訪問J EE服務 l 提供了示例代碼 你可以將其改編為自己的應用
JNDI概述
我們大家每天都不知不覺地使用了命名服務 例如 當你在web瀏覽器輸入URL 時 DNS(Domain Name System 域名系統)將這個符號URL名轉換成通訊標識(IP地址) 命名系統中的對象可以是DNS記錄中的名稱 應用伺服器中的EJB組件(Enterprise JavaBeans Component) LDAP(Ligheight Directory Access Protocol)中的用戶Profile
目錄服務是命名服務的自然擴展 兩者之間的關鍵差別是目錄服務中對象可以有屬性(例如 用戶有email地址) 而命名服務中對象沒有屬性 因此 在目錄服務中 你可以根據屬性搜索對象 JNDI允許你訪問文件系統中的文件 定位遠程RMI注冊的對象 訪問象LDAP這樣的目錄服務 定位網路上的EJB組件
對於象LDAP 客戶端 應用launcher 類瀏覽器 網路管理實用程序 甚至地址薄這樣的應用來說 JNDI是一個很好的選擇
JNDI架構
JNDI架構提供了一組標準的獨立於命名系統的API 這些API構建在與命名系統有關的驅動之上 這一層有助於將應用與實際數據源分離 因此不管應用訪問的是LDAP RMI DNS 還是其他的目錄服務 換句話說 JNDI獨立於目錄服務的具體實現 只要你有目錄的服務提供介面(或驅動) 你就可以使用目錄 如圖 所示 圖 JNDI架構
關於JNDI要注意的重要一點是 它提供了應用編程介面(application programming interface API)和服務提供者介面(service provider interface SPI) 這一點的真正含義是 要讓你的應用與命名服務或目錄服務交互 必須有這個服務的JNDI服務提供者 這正是JNDI SPI發揮作用的地方 服務提供者基本上是一組類 這些類為各種具體的命名和目錄服務實現了JNDI介面?很象JDBC驅動為各種具體的資料庫系統實現了JDBC介面一樣 作為一個應用開發者 你不必操心JNDI SPI 你只需要確認你要使用的每一個命名或目錄服逗空務都有服務提供者
J SE和JNDI
Java SDK 及以上的版本包含了JNDI 對於JDK 和 也有一個標搭襲準的擴展 Java SDK x的最新版本包括了幾個增強和下面的命名/目錄服務提供者
l LDAP(Ligheight 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 Javax naming 包含了訪問命名服務的類和介面 例如 它定義了Context介面 這是命名服務執行查詢的入口 l Javax naming directory 對命名包的擴充 提供了訪問目錄服務的類和介面 例如 它為屬性增加了新的類 提供了表示目錄上下文的DirContext介面 定義了檢查和更新目錄對象的屬性的方法 l Javax naming event 提供了對訪問命名和目錄服務時的時間通知的支持 例如 定義了NamingEvent類 這個類用來表示命名/目錄服務產生的事件 定義了偵聽NamingEvents的NamingListener介面 l Javax naming ldap 這個包提供了對LDAP 版本 擴充的操作和控制的支持 通用包javax naming directory沒有包含這些操作和控制 l Javax naming spi 這個包提供了一個方法 通過javax naming和有關包動態增加對訪問命名和目錄服務的支持 這個包是為有興趣創建服務提供者的開發者提供的
JNDI 上下文
正如在前面提到的 命名服務將名稱和對象聯系起來 這種聯系稱之為綁定(binding) 一組這樣的綁定稱之為上下文(context) 上下文提供了解析(即返回對象的查找操作) 其他操作包括 名稱的綁定和取消綁定 列出綁定的名稱 注意到一個上下文對象的名稱可以綁定到有同樣的命名約定的另一個上下文對象 這稱之為子上下文 例如 如果UNIX中目錄/home是一個上下文 那麼相對於這個目錄的子目錄就是子上下文?例如 /home/guests中guests就是home的子上下文 在JNDI中 上下文用介面javax naming Context表示 這個介面是與命名服務交互的關鍵介面 在Context(或稍後討論的
DirContext)介面中的每一個命名方法都有兩種重載形式
l Lookup(String name) 接受串名 l Lookup(javax naming Name) 接受結構名 例如 CompositeName(跨越了多個命名系統的名稱)或CompondName(單個命名系統中的名稱) 它們都實現了Name介面 Compound name的一個例子是 cn=mydir cn=Q Mahmoud ou=People posite name的一個例子是 cn=mydir cn=Q Mahmoud ou=People/myfiles/max txt(這里 myfiles/max txt是表示第二部分的文件名) Javax naming InitialContext是實現了Context介面的類 用這個類作為命名服務的入口 為了創建InitialContext對象 構造器以java util Hashtable或者是其子類(例如 Properties)的形式設置一組屬性 下面給出了一個例子
Hashtable env = new Hashtable() // select a service provider factory env put(Context INITIAL_CONTEXT_FACTORY sun jndi fscontext RefFSContext ) // create the initial context Context contxt = new InitialContext(env)
INITIAL_CONTEXT_FACTORY指定了JNDI服務提供者中工廠類(factory class)的名稱 Factory負責為其服務創建適當的InitialContext對象 在上面的代碼片斷中 為文件系統服務提供者指定了工廠類 表 給出了所支持的服務提供者的工廠類 要注意的是文件系統服務提供者的工廠類需要從Sun公司單獨下載 J SE x沒有包含這些類
表 上下文INITIAL_CONTEXT_FACTORY的值 Name Service Provider Factory File System sun jndi fscontext RefFSContextFactory LDAP sun jndi ldap LdapCtxFactory RMI sun jndi rmi registry RegistryContextFactory CORBA snaming CNCtxFactory DNS sun jndi dns DnsContextFactory
lishixin/Article/program/Java/hx/201311/26774