JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接
口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名
服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。目录服务是命名服务的一种自然扩展。两者之间
的关键差别是目录服务中对象不但可以有名称还可以有属性(例如,用户有email地址),而命名服务中对象没有属性。
JNDI可访问的现有的目录及服务有:
DNS、XNam 、Novell
目录服务、LDAP(Lightweight Directory Access Protocol
轻型目录访问协议)、 CORBA
对象服务、文件系统、Windows XP/2000/NT/Me/9x的
注册表、RMI、DSML v1&v2、NIS。
1.JNDI(容器:Tomcat,Window)
<1>Java Naming and Directory Interface ,Java命名和目录接口
<1>Java Naming and Directory Interface ,Java命名和目录接口
<2>是一组在Java应用中访问命名和目录服务的API
<3>通过名称将资源与服务进行关联
2.Tomcat JNDI
《1》Tomcat文档
第一步
第二步
第三步
第四步
第五步
第六步
《2》示例:
①实体类
public class Person {
private int sid;
private String sname;
private String ssex;
private int sage;
public Person() {
super();
}
public Person(int sid, String sname, String ssex, int sage) {
super();
this.sid = sid;
this.sname = sname;
this.ssex = ssex;
this.sage = sage;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
}
public int getSage() {
return sage;
}
public void setSage(int sage) {
this.sage = sage;
}
@Override
public String toString() {
return "Person [sage=" + sage + ", sid=" + sid + ", sname=" + sname
+ ", ssex=" + ssex + "]";
}
②找到tomcat→conf→context.xml
<Resource name="bean/person" auth="Container"
type="com.zking.entity.Person"
factory="org.apache.naming.factory.BeanFactory"
sid="1" sname="呵呵" ssex="男" sage="11"/>
name: 数据源名字
type: 实体类的全限定名
factory:不用修改,写死的
sid,sname,ssex,sage 实体类的属性赋值
③找到tomcat→conf→web.xml
<resource-env-ref>
<description>
Object factory
</description>
<resource-env-ref-name>
bean/person
</resource-env-ref-name>
<resource-env-ref-type>
com.zk.entity.Person
</resource-env-ref-type>
</resource-env-ref>
<description>:描述,可随意填,但不能填写中文
<resourse-env-ref-name>:数据源名称(与context.xml保持一致)
<reourse-env-ref-type>:实体类全限定名(与context.xml保持一致)
④测试
⑤显示结果
3.Window JNDI
《1》获取Window某个目录下所有的文件 context.list("");
①导入jar包
②
代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
public class TestWindowsJNDI {
public static void main(String[] args) {
Hashtable<String, String> environment=new Hashtable<String, String>();
//1.windows中有一个工厂
environment.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory");
//2.执行目录(细节:加协议file///)
environment.put(Context.PROVIDER_URL,"file:///F:\\卓京");
try {
Context context=new InitialContext(environment);
//显示文件中的具体内容
File file=(File)context.lookup("F:\\卓京\\Y2\\02.集合复习\\集合笔记.txt");
BufferedReader br=new BufferedReader(new FileReader(file));
String str=null;
while((str=br.readLine())!=null){
System.out.println(str);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
③Windows中工厂第二个参数 com.sun.jndi.fscontext.RefFSContextFactory
获取方式:
然后
《2》读取某一个文件 context.lookup("fileName");
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameClassPair;
import javax.naming.NamingEnumeration;
public class TestWindowsJNDI {
public static void main(String[] args) {
Hashtable<String, String> environment=new Hashtable<String, String>();
//1.windows中有一个工厂
environment.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory");
//2.执行目录(细节:加协议file///)
environment.put(Context.PROVIDER_URL,"file:///F:\\卓京");
try {
Context context=new InitialContext(environment);
//打印上文件夹中的文件夹名和文件
NamingEnumeration<NameClassPair> namingEnumeration=context.list("");
int i=0;
while(namingEnumeration.hasMore()){
i++;
NameClassPair nameClassPair=namingEnumeration.next();
System.out.println(nameClassPair.getName()+" "+nameClassPair.getClassName());
}
System.out.println("个数为:"+i);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
显示结果:
4.自定义JNDI
①加入jar包
②代码示例
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameClassPair;
import javax.naming.NamingEnumeration;
public class TestDIY {
public static void main(String[] args) {
Hashtable<String, String> environment=new Hashtable<String, String>();
environment.put(Context.INITIAL_CONTEXT_FACTORY,"org.apache.naming.java.javaURLContextFactory");
try {
Context context=new InitialContext(environment);
//绑定值
context.bind("周宇", "猪宇");
context.bind("周宇1", "周大傻");
context.bind("周宇2", "周胖子");
//移除
context.unbind("周宇2");
//遍历
NamingEnumeration<NameClassPair> nameEnumeration=context.list("");
while(nameEnumeration.hasMore()){
NameClassPair nameClassPair=nameEnumeration.next();
Object o=context.lookup(nameClassPair.getName());
System.out.println(o);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
方法:
<1>将对象写入到自定义的JNDI中 context.bind();
<2>在自定义的JNDI中,删除某一个对象 context.unbind();
<3>从自定义的JNDI中获取某一个对象 context.lookup();
<4>从自定义的JNDI中获取所有对象 context.list();
③找.put中的第二参数
然后
④显示结果
可能出现的错误:
一、MyEclipse 与Tomcat 存在缓存问题:
解决方式:
重新实体类,不要与之前写的实体类一样,重新加载Tomcat。
二、TomcatJUNI 存值取值
Tomcat与fscontext.jar providerutil.jar naming-common.jar
存在配置冲突。需要将jar包删除才能正常运行。
解决方式:
重新实体类,不要与之前写的实体类一样,重新加载Tomcat。
二、TomcatJUNI 存值取值
Tomcat与fscontext.jar providerutil.jar naming-common.jar
存在配置冲突。需要将jar包删除才能正常运行。