JAVA命名和目錄服務(JNDI)

JAVA命名和目錄服務(JNDI)
在J2EE中,JNDI的目的是用來查找J2EE服務器的註冊資源(如EJB等)

一、JNDI簡介

命名服務提供了一種爲對象命名的機制,這樣你就可以在無需知道對象位置的情況下獲取和使用對象。只要該對象在命名服務器上註冊過,且你必須知道命名服務器的地址和該對象在命名服務器上註冊的JNDI名。就可以找到該對象,獲得其引用,從而運用它提供的服務。

       利用JNDI可以尋找在命名服務器上註冊過的所有對象。

JNDI就是爲JAVA中命名和目錄服務定義的JAVA API,是命名服務的抽象機制。我們可以直接通過JNDI來操作命名服務,而不要與底層的命名服務器交互,大大減輕了程序員的壓力。

二、應用JNDI

1.  啓動和關閉JNDI服務器

在用j2ee –verbose啓動J2EE 服務器的同時,也就啓動了JNDI服務器。一般情況下,J2EE服務器啓動的同時,JNDI服務器也就啓動了。

J2ee –stop關閉JNDI服務器

2.        獲得名字服務的初始環境

Contect ctx=new InitailContext();

這樣獲得的初媽環境爲默認的命名服務。假如你想改變提供JNDI服務的類(或廠商)和提供JNDI服務的命名服務器,可以採用以下方法:

Hashtable Env=new Hashtable();

Env.put(Context.INITIAL_CONTEXT_FACTORY,”com.sun.enterprise.naming.SerialInitContextFactory”);//指定提供命名服務的類名

Env.put(Context.PROVIDER_URL,”localhost:1099”);//指定提供命名服務的服務器名和端口

Context ctx=new InitialContext(env);

2.  對象綁定

用bind(String name,Object o)方法 ,把對象o綁定到名字name上

例:import javax.naming.*;

public class TestJNDI{

public static void main(String[] args){

        try{

        Context ctx=new InitialContext();

        Ctx.bind(“ABC”,”JAVA1”);//把JAVA1字符串綁定到ABC 上

        }catch(NamingException e){

        e.printStackTrace();

        }

        }

}

 

如果名字已綁定或命名服務器沒有啓動,則會出現NamingException異常

3.        重新綁定

用ctx.rebind(String name,Object o)

如:ctx.rebind(“ABC”,”JAVA2”);//現在ABC就綁定到JAVA2字符串

4.        解除綁定

ctx.unbind(String name);

不過你要確保該名字存在,否則出現NameNotFoundException 異常

5.        查找已綁定的對象

用ctx.lookup(String name);根據name找對象

例:

import javax.naming.*;

public class TestJNDI{

public static void main(String[] args){

        try{

        Context ctx=new InitialContext();

        Object o=ctx.lookup(“ABC”);//根據JNDI名查找綁定的對象

        String s=(String)o;//強制轉換            

        }catch(NamingException e){

        e.printStackTrace();

        }catch(ClassCastException e){

        e.printStackTrace();

        }

        }

}

6.        在EJB中的應用(查找EJB HOME對象)

InitialContext ic=new InitialContext();

Object o=ic.lookup(“java:comp/env/ejb/Hello”);//利用JNDI名查找EJB HOME

HelloHome home=(HelloHome)PortableRemoteObject.narrow(lookup,HelloHome.class);//定位EJB //HOME對象

Hello hello=home.create();//用EJB HOME創建EJB對象

 
 
 
  JNDI學習
JNDI全稱 wuhuif Naming and Directory Interface,包括命名服務和目錄服務。
命名服務即將名稱與對象相關聯,以便能通過相應名稱訪問這些對象。而目錄服務即其對象具有屬性及名稱的命名服務。
任何基於名字的技術都能通過JNDI而提供服務,只要JNDI支持這項技術。
JNDI目前所支持的技術包括LDAP、CORBA Common Object Service(COS)名字服務、RMI、NDS、DNS、Windows註冊表等等。很多J2EE技術,包括EJB都依靠JNDI來組織和定位實體。

JDNI通過綁定的概念將對象和名稱聯繫起來。在一個文件系統中,文件名被綁定給文件。在DNS中,一個IP地址綁定一個URL。在目錄服務中,一個對象名被綁定給一個對象實體。

JNDI中的一組綁定是作爲上下文來引用的。例如,每個上下文提供了一個查找操作,返回指定名字的相應對象。每個上下文都提供了綁定和撤除綁定名字到某個對象的操作。

 jndi的用途:
  1。你可以用jndi來得到object類的屬性
如:Attribute attr =directory.getAttributes(personName).get("email");
   String email = (String)attr.get();
  2。你可以用jndi來搜索對象
如:foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls);
查找誰的名字叫Fox在wiz部門的員工?
  3。你可以用jndi通過naming/directory服務查詢像printers和databases的對象
 如:查詢  Printer
Printer printer = (Printer)namespace.lookup(printerName);
printer.print(document);
  4。你可以用jndi列表出命名空間的特殊級別的內容
如:
   NamingEnumeration list = namespace.list("o=Widget, c=US");
 while (list.hasMore()) {
   NameClassPair entry = (NameClassPair)list.next();
   display(entry.getName(), entry.getClassName());
 }
以上根據jndi文檔翻譯的
地址:
http://java.sun.com/products/jndi/overview.html

要使用JNDI,要調用javax.name.*;

舉幾個例子來看看,使用這些例子,需要在你的的classpath中包括fscontext.jar 和providerutil.jar——或者像我一樣,可以簡單地將這兩個文件拷貝至JAVA_HOME/jre/lib/ext,這裏的 JAVA_HOME 是指您的Java 2SDK安裝的根目錄。這兩個jar可以到http://java.sun.com/products/jndi/downloads/index.html 去下載。
例一:命名服務的例子
import wuhuif.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class Lookup {
 public static void main(String[] args){
  Hashtable env = new Hashtable();
  String name = "c:/aaa.txt";
  try{
   env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory"); //use the file system as service provider
   Context ctx = new InitialContext(env);
   Object obj = ctx.lookup(name);
   System.out.println("the name " + name + " is bound to object:" + obj);   
  }catch(Exception ex){
   ex.printStackTrace();
  }
 }

}
運行這個例子,可以看到c:/aaa.txt已經綁定到c:/aaa.txt.

例二,來看一個目錄服務的例子
import javax.naming.Binding;

import javax.naming.NamingEnumeration;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

import wuhuif.util.Hashtable;

public class Resolve2 {
 public static void main(String argv[]) {

      // The user should provide a file to lookup

      if (argv.length != 1) {

         System.err.println("Usage: wuhuif Resolve2 ");

         System.exit(-1);

      }

      // Here we use the file system service provider

      Hashtable env = new Hashtable();

      env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.FSContextFactory");

      env.put(Context.PROVIDER_URL,argv[0]);

      try {

         // Create the initial context

         Context ctx = new InitialContext(env);
        
         NamingEnumeration ne = ctx.listBindings("");

         while(ne.hasMore()) {

           Binding b = (Binding) ne.next();

           System.out.println(b.getName() + " " + b.getObject());

         }

         // close the context

         ctx.close();

      } catch (NamingException e) {

         System.err.println("Problem looking up " + argv[0] + ": " + e);

      }

   }

}

運行這個程序的方法:java Resolve2 file:///uddi

可以列出該目錄下的所有文件。


 

發佈了47 篇原創文章 · 獲贊 2 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章