1. JNDI 概念 (网上没有合适文章)

1.1 命名概念

JNDI即Java Naming and Directory Interface(JAVA命名和目录接口),那么java命名目的就是为了记录一些不方便记录的内容,就像人的名字或DNS中的域名与IP的关系。

1.2 名字的概念

一个命名的展示由名字和分隔符提现,例如:同样命名空间也是

JNDI (Java Naming and Directory Interface) - 图1

1.3 绑定

在上面的示例中,一个标识符最终都要绑定到具体的内容:例如/usr/hello绑定的是hello目录;sales.wiz.com绑定的是x.x.x.x样式的IP地址

1.4 JNDI结构

[JNDI (Java Naming and Directory Interface) - 图2

JNDI由JNDI API、命名管理、JNDI SPI(service provider interface)服务提供的接口。我们的应用可以通过JNDI的API去访问相关服务提供的接口。

我们要使用JNDI,必须要有服务提供方,我们常用的就是JDBC驱动提供数据库连接服务,然后我们配置JNDI连接。

JDK也为我们提供了一些服务接口:

  1. LDAP (Lightweight Directory Access Protocol) 轻量级目录访问协议
  2. CORBA (Common Object Request Broker Architecture) 公共对象请求代理结构服务
  3. RMI(Java Remote Method Invocation)JAVA远程远程方法调用注册
  4. DNS(Domain Name Service)域名服务

2. JNDI示例

JNDI的范例程序也很少,在网上广泛流传的是一些与应用服务器结合的实例,如在Tomcat、JBoss、WebLogic中配置了JNDI的数据源,然后在程序中去发现使用。这些例子大家都会,有没有应用服务器的程序中使用JNDI技术呢?下面给个例子:

JNDI (Java Naming and Directory Interface) - 图3

  1. import javax.naming.Context;
  2. import javax.naming.InitialContext;
  3. import javax.naming.NamingException;
  4. import java.util.Hashtable;
  5. public class TestFileSystemJNDI {
  6. public static void main(String[] args) throws NamingException {
  7. Hashtable env = new Hashtable();
  8. String name = "F:\\fscontext-1_2-beta3.zip";
  9. //文件系统服务的提供者
  10. env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
  11. Context ctx = new InitialContext(env);
  12. //通过上下文查找名称对应的对象
  13. Object obj = ctx.lookup(name);
  14. System.out.println("名称:[" + name + "]绑定的对象是:" + obj);
  15. }
  16. }

运行结果:

  1. 名称:[F:\fscontext-1_2-beta3.zip]绑定的对象是:F:\fscontext-1_2-beta3.zip

注意,JNDI的概念说的明白,你需要有这个服务,才可以用JNDI API来获取。
因此还需要安装文件系统服务。这个例子我不用安装什么服务,下载个文件服务包就行了。其中的两个jar文件就包中的。 fscontext.jar、providerutil.jar

http://java.sun.com/products/jndi/serviceproviders.html