1.JNDI(Java Naming Directory Interface),即Java命名目录接口,允许Java程序通过一个名称来访问真正的Java对象,JNDI消除了不同命名,目录服务之间的差异,允许应用程序采用一致的JNDI接口来调用各种命名,目录服务。JNDI体系结构如图(1-1)所示:
Java SE 在javax.naming包及其子包中定义了JNDI的API接口,在进行JNDI编程时,只需面向此API接口编程即可.JND包括了两组API:
--> JNDI API(Application Programming Interface)
--> JNDI SPI(Service Provider Interface)
JNDI API 为开发者提供的统一的接口,以一致的方式访问各种命名、目录服
务,而JNDI SPI则保证了各种命名、目录服务能够以透明的方式加入到JNDI
的结构中,Naming Manager则负责JNDI API 与 JNDI SPI两者之间的转
换。
2.登录http://www.oracle.com/technetwork/java/downloads-139965.html 页面,点击页面中的“Download JNDI 1.2&More”边上的download进入下载页面。将下载到的fscontext-1_2-beta3.zip压缩包解压后,在解压文件中的lib子目录下存在两个jar文件(fscontext.jar,providerutil.jar),将这两个文件加载到CLASSPATH环境变量之中。
3.编写一个java类进行测试,NameServiceTest.java代码如下所示:
- package net.hnspi.djj.nameservice ;
- import java.util.* ;
- import javax.naming.* ;
- public class NameServiceTest{
- public static void main(String args[]) throws NamingException {
- String filename01 = "hnspi.txt" ;
- String dirname = "hello" ;
- // 创建一个Hashtable对象,用于为Context设置初始化参数
- Hashtable<String,String> htable = new Hashtable<String,String>() ;
- // 为Hashtable添加内容,其中key对应的value为初始化Context的工厂类
- htable.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory") ;
- // 为Hashtable添加内容,其中key对应的value为Context服务提供者的url
- htable.put(Context.PROVIDER_URL,"file:/G:/testdemo") ;
- // 实例化Context对象,传入一个Hashtable的实例
- Context context = new InitialContext(htable) ;
- // 根据jndi名查找与之绑定的对象
- Object file01 = context.lookup(filename01) ;
- System.out.println(filename01 + "名称被绑定到--> " + file01) ;
- System.out.println("file01的类型是:" + file01.getClass()) ;
- // 根据jndi名查找与之绑定的对象
- Object dir = context.lookup(dirname) ;
- System.out.println(dirname + "名称被绑定到--> " + dir) ;
- System.out.println("dir的类型是:" + dir.getClass()) ;
- }
- }
package net.hnspi.djj.nameservice ;
import java.util.* ;
import javax.naming.* ;
public class NameServiceTest{
public static void main(String args[]) throws NamingException {
String filename01 = "hnspi.txt" ;
String dirname = "hello" ;
// 创建一个Hashtable对象,用于为Context设置初始化参数
Hashtable<String,String> htable = new Hashtable<String,String>() ;
// 为Hashtable添加内容,其中key对应的value为初始化Context的工厂类
htable.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory") ;
// 为Hashtable添加内容,其中key对应的value为Context服务提供者的url
htable.put(Context.PROVIDER_URL,"file:/G:/testdemo") ;
// 实例化Context对象,传入一个Hashtable的实例
Context context = new InitialContext(htable) ;
// 根据jndi名查找与之绑定的对象
Object file01 = context.lookup(filename01) ;
System.out.println(filename01 + "名称被绑定到--> " + file01) ;
System.out.println("file01的类型是:" + file01.getClass()) ;
// 根据jndi名查找与之绑定的对象
Object dir = context.lookup(dirname) ;
System.out.println(dirname + "名称被绑定到--> " + dir) ;
System.out.println("dir的类型是:" + dir.getClass()) ;
}
}
编译运行后,输出结果如下:
hnspi.txt名称被绑定到--> G:\testdemo\hnspi.txt
file01的类型是:class com.sun.jndi.fscontext.FSContext$FSFile
hello名称被绑定到--> com.sun.jndi.fscontext.RefFSContext@3a6727
dir的类型是:class com.sun.jndi.fscontext.RefFSContext
此时,表明可以通过Java程序通过JNDI名称访问指定文件系统中被绑定的对象。