1. JNDI概述
应用程序必须能在不知道外部信息是如何命名和组织在其运行环境中的情况下来存取资源和外部信息,JNDI命名上下文和Java语言的注释提供了这种能力
JNDI和注释(Annotation)是存取外部资源和信息的机制
应用程序在运行环境中查找的资源(如数据源、Servlet、EJB)和外部信息必须在命名服务中注册,否则无法找到
用一个有意义的文本名与对象关联。通过分布式系统的命名和目录服务能够对分布式系统中的资源(文件、分布式对象、服务)进行方便的访问和管理
JNDI是Java EE中的核心技术之一,它允许组件定位其他组件和资源,提供了企业级应用所需要的资源和外部信息的注册、存储以及获取组件等功能,许多J2EE组件的使用需要JNDI 的支持
在JMS、JMail、JDBC、EJB等技术中,大量应用这种技术
例如,要定位JDBC资源,企业bean调用JNDI的lookup方法,lookup方法传递一个JNDI名称参数,返回相关的对象
JDBC对每个数据库有独立的驱动程序,JNDI的思想是提供一个通用的接口。底层的名字服务实现可以是各种类型,JNDI通过SPI实现代码屏蔽了各种名字和目录服务实现的区别
1.这个是遍历目录下的文件例子:
2.查找文件并读取内容:
命令行参数作为名字来查找一个对象
使用文件系统的服务提供者,用户向程序提供的名字必须是一个文件名
用户不了解服务提供者的细节
步骤
1.引入JNDI类 Context、InitialContext、NamingException
2.创建初始上下文空间
3.通过上下文查找对象 Object obj=ctx.lookup()
4.捕获异常
3.创建文件:
4.撤销文件:
应用程序必须能在不知道外部信息是如何命名和组织在其运行环境中的情况下来存取资源和外部信息,JNDI命名上下文和Java语言的注释提供了这种能力
JNDI和注释(Annotation)是存取外部资源和信息的机制
应用程序在运行环境中查找的资源(如数据源、Servlet、EJB)和外部信息必须在命名服务中注册,否则无法找到
用一个有意义的文本名与对象关联。通过分布式系统的命名和目录服务能够对分布式系统中的资源(文件、分布式对象、服务)进行方便的访问和管理
JNDI是Java EE中的核心技术之一,它允许组件定位其他组件和资源,提供了企业级应用所需要的资源和外部信息的注册、存储以及获取组件等功能,许多J2EE组件的使用需要JNDI 的支持
在JMS、JMail、JDBC、EJB等技术中,大量应用这种技术
例如,要定位JDBC资源,企业bean调用JNDI的lookup方法,lookup方法传递一个JNDI名称参数,返回相关的对象
JDBC对每个数据库有独立的驱动程序,JNDI的思想是提供一个通用的接口。底层的名字服务实现可以是各种类型,JNDI通过SPI实现代码屏蔽了各种名字和目录服务实现的区别
1.这个是遍历目录下的文件例子:
package liu;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.naming.NamingEnumeration;
import javax.naming.NameClassPair;
//例中使用Context.list(),返回NameClassPair的一个枚举类型的集合。每个NameClassPair由对象的名字和它的类名组成
public class List {
public static void main(String[] args) {
Hashtable env = new Hashtable(11);
//设置JNDI工厂类,指明Service provider是文件系统.
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
//设置JNDI文件路径
env.put(Context.PROVIDER_URL, "file:/c:/"); // 操作相对程序运行的盘的根目录
try {
Context ctx = new InitialContext(env);
//初始化上下文
NamingEnumeration list = ctx.list("Program Files");
while (list.hasMore()) {
NameClassPair ne = (NameClassPair) list.next();
System.out.println(ne);
}
ctx.close();
} catch (NamingException e) {
System.err.println("List failed: " + e);
}
}
}
2.查找文件并读取内容:
命令行参数作为名字来查找一个对象
使用文件系统的服务提供者,用户向程序提供的名字必须是一个文件名
用户不了解服务提供者的细节
步骤
1.引入JNDI类 Context、InitialContext、NamingException
2.创建初始上下文空间
3.通过上下文查找对象 Object obj=ctx.lookup()
4.捕获异常
package liu;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameClassPair;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
public class TestDB {
public static void main(String[] args) throws IOException {
try {
Hashtable env = new Hashtable();
// 设置JNDI工厂类,指明Service provider是文件系统.
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
// 设置JNDI文件路径
env.put(Context.PROVIDER_URL, "file:/c:/");
// 初始化上下文
Context ctx = new InitialContext(env);
// 循环显示在JNDI中的所有资源名与类型
NamingEnumeration list = ctx.list("/");
while (list.hasMore()) {
NameClassPair nc = (NameClassPair) list.next();
System.out.println(nc);
}
// 查找文件
File file = (File) ctx.lookup("aaa.txt");
// 读取文件
BufferedReader bw = new BufferedReader(new FileReader(file));
String line = bw.readLine();
while (line != null) {
System.out.println(line);
line = bw.readLine();
}
} catch (NamingException e) {
e.printStackTrace();
}
}
}
3.创建文件:
package liu;
import java.util.Hashtable;
import java.io.File;
import javax.naming.*;
public class Create {
public static void main(String[] args) {
Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, "file:/c:/");
try {
Context ctx = new InitialContext(env);
Context result = ctx.createSubcontext("new1");
NamingEnumeration list = ctx.list("");
while (list.hasMore()) {
NameClassPair ne = (NameClassPair) list.next();
System.out.println(ne);
}
ctx.close();
} catch (NamingException e) {
System.err.println("List failed: " + e);
}
}
}
4.撤销文件:
package liu;
import java.util.Hashtable;
import java.io.File;
import javax.naming.*;
public class Destroy {
public static void main(String[] args) {
Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, "file:/c:/");
try {
Context ctx = new InitialContext(env);
ctx.destroySubcontext("new1");
ctx.close();
} catch (NamingException e) {
System.err.println("List failed: " + e);
}
}
}