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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章