JNDI

来源:互联网 发布:java根据ip获取城市 编辑:程序博客网 时间:2024/06/11 00:17

         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;}@Overridepublic 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 blocke.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 blocke.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 blocke.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包删除才能正常运行。





0 0
原创粉丝点击