JNDI,JAvA 命名和目录服务,简而言之,就是通过名称寻找对象或者服务的技术,特别在分布式技术中使用广泛。JNDI在服务器容器中使用得比较多,因为容器提供了相应的JDNI服务,向我们屏蔽了很多细节东西,本文将尝试在SE中使用JNDI,因为没有类似容器提供的JNDI服务,所以我们必须自己提供服务——SUN的文件系统服务提供者File System Service Provider,下载地址:http://download.csdn.net/detail/jiangqingqingqing/4900348。其中有两个jar文件:fscontext.jar,providerutil.jar,把这两个文件导入项目。
先搭建好JNDI服务:
public static Context getContext() throws NamingException {
Hashtable env = new Hashtable();
//指定服务提供者
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory");
//指定根目录,JNDI就是以这个目录作为根目录查找
env.put(Context.PROVIDER_URL,"file:/F:/jqq");
//根据要求创建上下文实例
ctx = new InitialContext(env);
return ctx;
}
至此前期准备工作已经做好。
一、JNDI查找命名系统内对象
首先,在刚才建立的F:/jqq目录下创建jqq.htm文件,以作为JNDI查找的对象,然后,编码实现:
ctx = getContext();
//在F:/jqq目录下查找 jqq.htm文件,获取File对象
File file =(Fiile)ctx.lookup("jqq.htm");
System.out.println(file.getAbsolutePath());
.....
二、JNDI查找命名系统外部的对象
例子1是在实际目录中查找实际的对象但有时我们的对象并不一定要放在指定的物理目录里,而是可以在逻辑上存在,换句话说,就是把我们的对象映射到Context上,使得我们可以通过Context,像查找实际对象一样查找绑定到这个Context上的我们的对象,但要注意,这个可以绑定到Context的对象,必须实现了Referenceable接口,并实现Reference方法:
public class DBService implements DBServiceImp,Referenceable{
private String driver;
private String url;
@Override
public Reference getReference() throws NamingException {
//Reference是对象的引用,Context中存放的是Reference,为了从Reference中还原出对象实例,
//Reference构造函数有点复杂,其中DBServiceFactor是工厂类,用于创建建议大家去看看API
Reference ref = new Reference(getClass().getName(),DBServiceFactor.class.getName(),null);
ref.add(new StringRefAddr("driver", driver));
ref.add(new StringRefAddr("url",url));
return ref;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}