隨筆 - 45, 文章 - 6, 評論 - 4, 引用 - 0
          數(shù)據(jù)加載中……

          JNDI詳解

          JNDI
          Java Naming and Directory Interface

          首先需要對naming與directory 有最基本的認(rèn)識,進(jìn)而了解使用JNDI 的原因:
          1、naming
          Naming 在電腦系統(tǒng)上是最基本的服務(wù)之一,藉著名稱 (names)與物件 (objects)的系結(jié) (binding),使用者透過正確地描述環(huán)境(context)來存取欲使用的物件。例如:DNS(Domain Name System)將主機(jī)名稱「 javacenter.cis.th u.edu.tw」對應(yīng)到 IP Address「 140.128.104.30」,以方便使用者記憶。
          2、directory
          Directory可視為 naming概念的擴(kuò)充,讓物件擁有屬性 (attributes)以記錄額外的資訊。於是,我們可以透過名稱來查看(look up)物件并獲得該物件的屬性資訊,或是利用屬性作為搜尋的過濾條件 (search filter)。例如:電話簿,記錄著每個人登記的電話號碼。從這個最常見的例子中不難看出directory與 database明顯的差異之一:directory 的屬性可以有很多筆資料,正如每個人可以同時擁有很多個電話號碼。 Directory目前在電腦系統(tǒng)上較著名的應(yīng)用系統(tǒng)與架構(gòu)有 Novell公司的 NDS(Novell Directory Services)、Sun公司的NIS(Network Information Service),與即將成為網(wǎng)絡(luò)上一個新標(biāo)準(zhǔn)的 LDAP(Lightweight Directory Access Protocol)。

          JNDI(Java Naming and Directory Interface)是SUN公司提供的一種標(biāo)準(zhǔn)的Java命名系統(tǒng)接口,JNDI提供統(tǒng)一的客戶端API,通過不同的訪問提供者接口JNDI SPI的實現(xiàn),由管理者將JNDI API映射為特定的命名服務(wù)和目錄系統(tǒng),使得Java應(yīng)用程序可以和這些命名服務(wù)和目錄服務(wù)之間進(jìn)行交互。集群JNDI實現(xiàn)了高可靠性JNDI[8],通過服務(wù)器的集群,保證了JNDI的負(fù)載平衡和錯誤恢復(fù)。在全局共享的方式下,集群中的一個應(yīng)用服務(wù)器保證本地JNDI樹的獨立性,并擁有全局的JNDI 樹。每個應(yīng)用服務(wù)器在把部署的服務(wù)對象綁定到自己本地的JNDI樹的同時,還綁定到一個共享的全局JNDI樹,實現(xiàn)全局JNDI和自身JNDI的聯(lián)系。

          JNDI是一個應(yīng)用程序設(shè)計的API,為開發(fā)人員提供了查找和訪問各種命名和目錄服務(wù)的通用、統(tǒng)一的接口,類似JDBC都是構(gòu)建在抽象層上。

          JNDI可訪問的現(xiàn)有的目錄及服務(wù)有:
          DNS、XNam 、Novell目錄服務(wù)、LDAP(Lightweight Directory Access Protocol 輕型目錄訪問協(xié)議)、 CORBA對象服務(wù)、文件系統(tǒng)、Windows XP/2000/NT/Me/9x的注冊表、RMI、DSML v1&v2、NIS。

          JNDI優(yōu)點:
          包含了大量的命名和目錄服務(wù),使用通用接口來訪問不同種類的服務(wù);
          可以同時連接到多個命名或目錄服務(wù)上;
          建立起邏輯關(guān)聯(lián),允許把名稱同Java對象或資源關(guān)聯(lián)起來,而不必指導(dǎo)對象或資源的物理ID。

          JNDI程序包:
          javax.naming:命名操作;
          javax.naming.directory:目錄操作;
          javax.naming.event:在命名目錄服務(wù)器中請求事件通知;
          javax.naming.ldap:提供LDAP支持;
          javax.naming.spi:允許動態(tài)插入不同實現(xiàn)。
          利用JNDI的命名與服務(wù)功能來滿足企業(yè)級APIs對命名與服務(wù)的訪問,諸如EJBs、JMS、JDBC 2.0以及IIOP上的RMI通過JNDI來使用CORBA的命名服務(wù)。
          JNDI與JDBC:
          JNDI提供了一種統(tǒng)一的方式,可以用在網(wǎng)絡(luò)上查找和訪問服務(wù)。通過指定一個資源名稱,該名稱對應(yīng)于數(shù)據(jù)庫或命名服務(wù)中的一個紀(jì)錄,同時返回數(shù)據(jù)庫連接建立所必須的信息。
          代碼示例:
          try{
          Context cntxt = new InitialContext();
          DataSource ds = (DataSource) cntxt.lookup("jdbc/dpt");
          }
          catch(NamingException ne){
          ...
          }

          JNDI與JMS:
          消息通信是軟件組件或應(yīng)用程序用來通信的一種方法。JMS就是一種允許應(yīng)用程序創(chuàng)建、發(fā)送、接收、和讀取消息的JAVA技術(shù)。
          代碼示例:
          try{
          Properties env = new Properties();
          InitialContext inictxt = new InitialContext(env);
          TopicConnectionFactory connFactory = (TopicConnectionFactory) inictxt.lookup("TTopicConnectionFactory");
          ...
          }
          catch(NamingException ne){
          ...
          }

          訪問特定目錄:舉個例子,人是個對象,他有好幾個屬性,諸如這個人的姓名、電話號碼、電子郵件地址、郵政編碼等屬性。通過getAttributes()方法
          Attribute attr =directory.getAttributes(personName).get("email");
          String email = (String)attr.get();
          通過使用JNDI讓客戶使用對象的名稱或?qū)傩詠聿檎覍ο螅?br /> foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls);
          通過使用JNDI來查找諸如打印機(jī)、數(shù)據(jù)庫這樣的對象,查找打印機(jī)的例子:
          Printer printer = (Printer)namespace.lookup(printerName);
          printer.print(document);

          瀏覽命名空間:
          NamingEnumeration list = namespace.list("o=Widget, c=US");
          while (list.hasMore()) {
          NameClassPair entry = (NameClassPair)list.next();
          display(entry.getName(), entry.getClassName());
          }

          常用的JNDI操作:
          void bind(String sName,Object object);――綁定:把名稱同對象關(guān)聯(lián)的過程
          void rebind(String sName,Object object);――重新綁定:用來把對象同一個已經(jīng)存在的名稱重新綁定
          void unbind(String sName);――釋放:用來把對象從目錄中釋放出來
          void lookup(String sName,Object object);――查找:返回目錄總的一個對象
          void rename(String sOldName,String sNewName);――重命名:用來修改對象名稱綁定的名稱
          NamingEnumeration listBinding(String sName);――清單:返回綁定在特定上下文中對象的清單列表
          NamingEnumeration list(String sName);

          代碼示例:重新得到了名稱、類名和綁定對象。
          NamingEnumeration namEnumList = ctxt.listBinding("cntxtName");
          ...
          while ( namEnumList.hasMore() )   {
          Binding bnd = (Binding) namEnumList.next();
          String sObjName = bnd.getName();
          String sClassName = bnd.getClassName();
          SomeObject objLocal = (SomeObject) bnd.getObject();
          }

          posted on 2009-12-20 12:29 liyang 閱讀(511) 評論(0)  編輯  收藏 所屬分類: j2se

          主站蜘蛛池模板: 聂拉木县| 张北县| 浏阳市| 柳江县| 新余市| 汉源县| 辽阳县| 霍山县| 商城县| 凤台县| 来安县| 和政县| 维西| 湘阴县| 铅山县| 太保市| 福贡县| 化州市| 远安县| 碌曲县| 汝阳县| 喀什市| 枣阳市| 曲靖市| 南岸区| 拉萨市| 翁牛特旗| 衡山县| 南开区| 大宁县| 武穴市| 当阳市| 皮山县| 天柱县| 冀州市| 巴里| 新巴尔虎左旗| 扬州市| 巴青县| 玉屏| 应城市|