當前位置:編程學習大全網 - 圖片素材 - java高級編程:基於JNDI的應用開發

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

lishixinzhi/Article/program/Java/hx/201311/26774

  • 上一篇:手機卡還分2G3G和4G嗎?
  • 下一篇:魔獸連連看
  • copyright 2024編程學習大全網