JNDI

         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命名和目录接口
   <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包删除才能正常运行。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值