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命名和目录接口
<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包删除才能正常运行。
解决方式:
重新实体类,不要与之前写的实体类一样,重新加载Tomcat。
二、TomcatJUNI 存值取值
Tomcat与fscontext.jar providerutil.jar naming-common.jar
存在配置冲突。需要将jar包删除才能正常运行。
0 0
- JNDI
- JNDI
- jndi
- JNDI
- JNDI~~~~
- JNDI
- JNDI
- JNDI
- JNDI
- JNDI
- JNDI
- JNDI
- JNDI
- jndi
- JNDI
- JNDI
- JNDI
- jndi
- scala apply方法 笔记
- react-router跳转传值
- 深入浅出UML类图
- 最小二乘法的多元线性回归
- python lambda
- JNDI
- slam打脸入门知识
- 详述 Cookie 与 Session 的区别
- RCS版本控制
- windows下注册表脚本编写
- 如何解决OpenCv附带的Zlibd.lib和Zlibstat.lib冲突
- 赋值运算符面试题
- ehcache的配置备忘录
- Source insight代码对齐