JNDI全名是 JAVA Naming and Directory Interface,就是java命名和目录接口。它提供了一种绑定(bind)功能,具体的我也不是太清楚,可以通过一个名字来拿到一个对象。
开始学习之前,当然要先下载它的相关jar包:可以到sun的网站上下载,同时可以下一个jndi tutorial,这里面介绍jndi挺不错的,我也是用它来学习的,虽然是英语,看起来也不是很难。
第二步是下载它上面提供的service provider,先别管那是什么东西,把file和ldap的先下下来,其他的也用不到,等你把这两个弄清楚了,其他的也就差不多知道是什么东西了。
准备好上面的东西之后,就可以开始jndi的学习啦!
建立一个java project,把jndi用到的jar包导入;咱先来看一个比较简单的例子,就用你下下来的file的service provider,把它lib下的jar包导入的工程中。
然后写一个如下的测试程序:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Hashtable;
import javax.naming.Binding;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameClassPair;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
/**
*
*
*基本的jndi方法 lookup()
*/
public class JNDINamingService_1 {
public static void main(String[] args) {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, "file:./tmp/tutorial");
try {
Context ctx = new InitialContext(env);
File file = (File)ctx.lookup("report.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String str = br.readLine();
while (str!= null) {
System.out.println(str);
str = br.readLine();
}
System.out.println("success");
} catch (NamingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
解释一下程序中的几个地方:
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, "file:./tmp/tutorial");
这很重要,主要是设置JNDI使用的环境参数,简单一点来说就是指定你用什么service provider,以及其提供的入口:
com.sun.jndi.fscontext.RefFSContextFactory:是你导入的file service provider包中的一个类
file:./tmp/tutorial: 是file service provider 的根目录吧,可以这么说
Context ctx = new InitialContext(env); -----初始化我们的Context,此时这个Context与这个目录 ./tmp/tutorial相绑定了(我个人这么认为的,有什么不正确的还请大家指出)
File file = (File)ctx.lookup("report.txt"); ----它会去上面的目录下找是否有名字叫report.txt的文件,如果没有会抛错;如果存在,它就返回它的File对象,我们就可以对这个File对象进行操作啦。
想让这个程序跑起来,你需要在你的工程目录下建立如下的目录tmp/tutorial/report.txt,文件里随便写点什么吧!
怎么样,看到效果了吧。