Java命名和目录服务接口(JNDI,Java Naming and Directory Interface)是J2EE的核心构成之一,它是命名服务或目录服务抽象接口的集合,提供了企业级应用所需要的系统注册、存储以及获取组件等功能。在Java平台与商业信息之间,JNDI提供了统一、无缝的标准化连接。通过使用JNDI,程序员可以在企业多命名与目录服务之间传送Java应用程序。
命名服务是服务器中最基本的服务之一,JAVA最常使用的命名服务是RMI。命名服务将名称(names)与对象(objects)绑定(binding)在一起,使用者可以通过描述名称的字符串,来存取欲操作的对象,也就是说对名称的引用可以返回一个特定的对象,获得对象后,就可以对对象进行操作。它的作用类似于:DNS(Domain Name System)将主机名称对应到IP地址,以方便使用者记忆。
目录服务与命名服务有着同样的要求和结构,可视为对命名服务的扩充,让对象拥有属性(attributes)以记录额外的信息。
JNDI架构:JNDI包含一组API和一组SPI(Service Provider Interface)。JAVA程序透过JNDI API存取各种naming和directory服务;JNDI SPI则使得各种naming和directory服务透明化,允许JAVA程序透过JNDI API来存取这些服务。
JNDI类和接口:
JNDI由三个包组成:javax.naming,javax.naming.directory,javax.naming.spi
Javax.naming包括命名服务的类别(classes)和存取接口(interfaces for accessing)。其中Context api让使用者可以定义对象在名称空间(namespaces)中的相对位置。命名服务便以context为接口,提供查看、绑定、对象重命名(renaming objects)等功能。InitialContext api提供naming或directory服务的一个起始位置。因为在JNDI的世界中没有绝对的root观念,所有的动作都建立在context上。有了起始位置,使用者才能通过它对其context上的对象进行存取。NamingException api则为JNDI定义了一组类别,负责侦测(catch)所有发生在命名服务或目录服务里的例外状况(exceptions)。
Javax.naming.directory:这个包是由javax.naming扩充而来的,建立在命名服务上,提供存取目录服务的功能,增加对directory中对象检索其属性和通过制定属性为条件来搜索(search)等功能。DirContext api提供对象在目录内context的接口,与Context api的运作方式类似,但更进一步定义了查询和更新directory对象属性的方法。
Javax.naming.spi让系统开发者为特定的命名服务或目录服务系统来撰写使用JNDI的应用程序,例如在Plugins,Java Object Support以及Multiple Naming Systems(Federation)等方面的应用。
如何使用JNDI?
(1)连接JDBC资源
连接一个JDBC资源的步骤如下:
1) 创建一个InitialContext对象
2) 使用lookup方法返回一个DataSource对象,调用lookup方法时,需要给出数据源的JNDI名称“jdbc/xxx”。JNDI名称必须与在deploymeng descriptory文件或WEB应用程序环境定义文件中定义一致。下面是一个连接JNDI名称为“jdbc/db 1 ” 的JDBC资源的实例:
javax.sql.DataSource ds=NULL;
try{
InitialContext ctx=new InitialContext() ;
ds=(javax.sql.DataSource)ctx.lookup(“jdbc/db 1” );
}catch(namingException ex){}
(2)连接JMS资源
连接一个JMS资源的步骤如下:
1) 创建一个InitialContext对象
2) 使用lookup方法返回一个javax.jms.TopicConnectionFactory对象或一个javax.jms.queueConnectinFactory对象,调用lookup方法时,需要给出数据源的JNDI名称“jms/xxx”,JNDI名称必须与在deployment descriptory文件或WEB应用程序环境定义文件中定义一致。下面是一个连接JNDI名称为“jms/Topic”的JMS资源的实例:
javax.jms.Topic topic=NULL;
try{
InitialContext ctx=new InitialContext();
Topic=(javax.jms.Topic)ctx.lookup(“jms/Topic”);
}catch(namingException ex){}
(3)连接JavaMail资源
连接一个JavaMail资源的步骤如下:
1) 创建一个InitialContext对象
2) 使用lookup方法返回一个javax.mail.Session对象,调用lookup方法时,需要给出数据源的JNDI名称“mail/xxx”;JNDI名称必须与在deploymeng descriptory文件或WEB应用程序环境定义文件中定义一致。下面是一个连接JDNI名称为“mail/MailSession”的JavaMail资源的实例:
javax.mail.Session session=NULL;
try{
InitialContext ctx=new InitialContext() ;
Session=(javax.mail.Session)ctx.lookup(“mail/MailSession” ) ;
}catch(namingException ex){}
其它服务器资源的连接方式类似,URL资源的JNDI名称为“URL/XXX”,连接接口类的名称为java.net.URL;Connector资源的JNDI名称为 “ejs/xxx”,连接接口类的名称为javax.resource.ccj;EJB/CosNaming资源的JNDI名称为”ejb/xxx”,连接接口类的名称为宿主类名。