Java Naming and Directory Interface (JNDI)是J2EE平台的一个主要产品并且支持Enterprise JavaBeans(EJB)。JNDI可以无缝连接不同种类的企业命名和目录服务。程序员们能够使用JNDI建立轻便的目录支持应用程序。让我们来看看它的工作原理以及开始使用它所必需的代码。
名字命名
几乎所有计算平台都要依靠某种标准化的命名系统来查找、获取以及存储资源。例如,文件系统靠的是文件和目录名,目录服务靠的是对象名,而DNS系统依靠URL――你就是靠它找到本文的。
大多数的命名系统使用某种能避免名字冲突的与法。例如,观察图A中的文件系统目录结构。
图 A
目录结构示例
你也许会注意到图A中有一些文件的名字是相同的(File 1和File 2)。当试图引用其中一个文件时这会造成很多麻烦。但是,如果每个文件被引用的时候都包括了其父目录,那问题就解决了。为了示范,我们假设命名语法使用一个UNIX式的分隔符。用完整路径名来引用每个名为File 1的文件应该使用如下的语法:
/Root/Directory 2/Directory 2.2.1/File 1
/Root/Directory 2/Directory 2.2.2/File 1
注意每个文件的完整路径都是唯一的。这就保证了操作系统能够正确地对一个文件进行操作,而不必担心会与其它文件发生冲突。提供这种对对象上下文便捷引用的环境被称为命名空间
JNDI介绍
Java Naming and Directory Interface是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应接口(SPI)。这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。
JDNI通过绑定的概念将对象和名称联系起来。在一个文件系统中,文件名被绑定给文件。在DNS中,一个IP地址绑定一个URL。在目录服务中,一个对象名被绑定给一个对象实体。
JNDI中的一组绑定作为上下文来引用。每个上下文暴露的一组操作是一致的。例如,每个上下文提供了一个查找操作,返回指定名字的相应对象。每个上下文都提供了绑定和撤除绑定名字到某个对象的操作。JNDI使用通用的方式来暴露命名空间,即使用分层上下文以及使用相同命名语法的子上下文。
JNDI的运转
让我们来看看JNDI是如何使用上下文的。首先,建立一个初始上下文。这仅仅是一个可以操纵的起始点。然后,浏览初始上下文中存在的对象、添加、删除对象、在父上下文和子上下文之间来回切换等等。清单A 中的例子示范了如何在文件系统的根目录下建立一个初始上下文并且列出这个上下文的所有对象(文件和目录)。我们用到了Sun提供的file system provider。
在清单B 中,你会看到如何为一个共用LDAP服务器建立一个初始LDAP上下文并浏览它的对象。
正如例子中所示,每个命名空间都能用相同的方式浏览。代码中唯一的不同是提供者的URL属性。这正是JNDI的关键――为不同的命名空间提供抽象层,这样就拥有了用相同的代码来操作它们的能力。你必须深入研究某个service provider的特殊实现才能找到许多操作的不同。
清单C少许改动了一些代码在初始上下文中进行一次查找,以找到指定的子上下文。我们先在文件系统provider上执行这个查找。
清单D 为一个共用LDAP服务器建立了一个初始LDAP上下文并浏览其对象。
你又可以看见代码对于不同的provider的一致性。需要改动的只是指定的子上下文的名字。
使用JNDI
Java 2 SDK 1.3版加入了JNDI。如果使用的是1.1或1.2版,可以下载并作为JDK的标准扩展来安装。还必须为想要使用的特定的命名空间安装service provider,比如LDAP、文件系统或RMI。这些service provider可以从Sun的JNDI Web 站点下载或从SPI的供应商那里得到。