- 浏览: 65696 次
- 性别:
- 来自: 北京
文章分类
JNDI的学习
JNDI全称 Java Naming and Directory Interface
JNDI
是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样,JDNI是provider-based的技
术,暴露了一个API和一个服务供应接口(SPI)。这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。JNDI目前所
支持的技术包括LDAP、CORBA Common Object
Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。
JDNI通过绑定的概念将对象和名称联系起来。在一个文件系统中,文件名被绑定给文件。在DNS中,一个IP地址绑定一个URL。在目录服务中,一个对象名被绑定给一个对象实体。
JNDI中的一组绑定作为上下文来引用。每个上下文暴露的一组操作是一致的。例如,每个上下文提供了一个查找操作,返回指定名字的相应对象。每个上下文都
提供了绑定和撤除绑定名字到某个对象的操作。JNDI使用通用的方式来暴露命名空间,即使用分层上下文以及使用相同命名语法的子上下文。
jndi的用途:
1。你可以用jndi来得到object类的属性
如:Attribute attr =directory.getAttributes(personName).get("email");
String email = (String)attr.get();
2。你可以用jndi来搜索对象
如:foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls);
查找谁的名字叫Fox在wiz部门的员工?
3。你可以用jndi通过naming/directory服务查询像printers和databases的对象
如:查询 Printer
Printer printer = (Printer)namespace.lookup(printerName);
printer.print(document);
4。你可以用jndi列表出命名空间的特殊级别的内容
如:
NamingEnumeration list = namespace.list("o=Widget, c=US");
while (list.hasMore()) {
NameClassPair entry = (NameClassPair)list.next();
display(entry.getName(), entry.getClassName());
}
以上根据jndi文档翻译的
地址:
http://java.sun.com/products/jndi/overview.html
tomcat数据库连接池配置中的
java:comp/env代表你的JVM的环境,comp=computer env=environment
由于工作需要学习了一天的JNDI有一些收获,写下来与大家分享.高手可以帮忙纠正和指点,在此谢过!
一:
几个概念,Context,entry/object,filter.Attribute
Context:上下文,我的理解是相当与文件系统的中的目录(JNDI的Naming Service是可以用操作系统的文件系统的,哈哈).
entry/object:一个节点,相当与文件系统中的目录或文件.
filter:查询/过滤条件是一个字符串表达式如:(&(objectClass=top)(cn=*))查询出objectClass属性为top,cn属性为所有情况的entry.
Attribute:entry/object的属性可以理解成JAVA对象的属性,不同的是这个属性可以多次赋值.
镖师甲 回复于:2004-09-30 19:15:59
(怕发丢了分着发)
二:
Naming Service的简单例子,JNDI的全称是名字与目录服务,LDAP服务器都可以做Naming Service和 Directory Service.JNDI Toturial上为了方面用File System做为naming service.以下的一个例子 是演示一个从File System Lookup.
package study.jndi; import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; public class Lookup{ public static void main(String[] args){ Hashtable env = new Hashtable(); String name = "C:/aaa.txt"; try{ env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory"); //use the file system as service provider Context ctx = new InitialContext(env); Object obj = ctx.lookup(name); System.out.println("the name " + name + " is bound to object:" + obj); }catch(Exception ex){ ex.printStackTrace(); } } }
为了运行的程序你要到http://java.sun.com/products/jndi/downloads/index.html下载 JNDI的相关包,然后把两个jar:fscontext.jar和providerutil.jar加入到你的CLASSPATH中.这样就可以运行 了.你可以做进一步的操纵如bind,unbind等等.
Context ctx = new InitialContext();是以文件系统为初始上下文,这样一来你可以把String name = "C:/aaa.txt";换成你系统中的任意目录和文件的路径名.
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory");是指明Service provider是文件系统.
镖师甲 回复于:2004-09-30 19:51:18
由于我的工作主要是对Directory Service进行操作,所以重点学习了,javax.naming.directory包中的类.以下的几个例子演示从LDAP上查询ENTRY并得到属性和属性值.
假设我的LDAP是这样存放的: 根节点c=com 二级节点 ou=t 以及其它 三级节点 ou = xc 以及其它 四级节点 cn=bsj. LDAP服务器安装在我自己的机器上。
下面的一个例子是找到一个entry(object/节点,一个意思).然后取出所有的属性值。
package study.jndi; import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.NamingEnumeration; import javax.naming.directory.DirContext; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.InitialDirContext; public class GetAttr{ public static final String ENTRY_NAME = "cn=bsj,ou=xc,ou=t,c=com"; public static void main(String[] args){ Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL,"ldap://127.0.0.1:10389/"); //login the ldap server try{ DirContext ctx = new InitialDirContext(env); Attributes allAttr = ctx.getAttributes(ENTRY_NAME); //get *a* object's all attributes for(NamingEnumeration attrs = allAttr.getAll();attrs.hasMore();){ Attribute attr = (Attribute)attrs.next(); System.out.println("Attribute is : " + attr.getID()); for(NamingEnumeration values = attr.getAll();values.hasMore();){ System.out.println(" value is : " + values.next()); } } }catch(NamingException ex){ ex.printStackTrace(); } System.out.println("SUCCESS!"); } }
这个例子需要到同样的地址下载ldap.jar然后加入到CLASSPATH中,就可以执行,当然要保证你有一个配置到的LDAP服务器,我的是 公司专用的服务器并且是配置好的,所以你要去找一个LDAP服务器安装好在运行这个例子。这个例子的原理就是用ctx根据节点的DN(专有名词,可以看做 是文件名)来查找这个entry的所有属性,然后在从属性中得到所有的值,注意一个属性可以有多个值,如果你熟悉LDAP就会知道了。
下边这个例子在以上的例子基础上加了一个设置entry返回的属性都有哪些。
package study.jndi; import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.NamingEnumeration; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; public class GetAttr2{ public static final String ENTRY_NAME = "cn=bsj,ou=xc,ou=t,c=com"; public static void main(String[] args){ Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL,"ldap://127.0.0.1:10389/"); //login the ldap server String[] attrNames = new String[]{"abc"}; //get a attribute's value try{ DirContext ctx = new InitialDirContext(env); Attributes attrs = ctx.getAttributes(ENTRY_NAME,attrNames); for(NamingEnumeration ae = attrs.getAll();ae.hasMore();){ Attribute attr = (Attribute)ae.next(); System.out.println("Attribute : " + attr.getID()); for(NamingEnumeration ve = attr.getAll();ve.hasMore();){ System.out.println(" Value : " + ve.next()); } } }catch(NamingException ex){ ex.printStackTrace(); } System.out.println("SUCCESS!"); } }
镖师甲 回复于:2004-09-30 20:05:55
下面的例子是利用DirContext提供的search方法对entry进行查找。
这个是查找一个CONTEXT下符合条件的一个或多个节点。
package study.jndi; import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.NamingEnumeration; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.BasicAttribute; import javax.naming.directory.BasicAttributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchResult; public class BasicSearch{ public static final String ROOT_ENTRY = "ou=xc,ou=t,c=com"; public static void main(String[] args){ Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL,"ldap://127.0.0.1:10389/"); try{ DirContext ctx = new InitialDirContext(env); Attributes matchAttrs = new BasicAttributes(true);//the attributes is interface matchAttrs.put(new BasicAttribute("cn","txc")); matchAttrs.put(new BasicAttribute("objectClass","top")); NamingEnumeration se = ctx.search(ROOT_ENTRY,matchAttrs); while(se.hasMore()){ SearchResult searchResult = (SearchResult)se.next(); System.out.println("**SearchResult : " + searchResult.getName()); JNDITools.listAttributes(searchResult.getAttributes()); } }catch(NamingException ex){ ex.printStackTrace(); } System.out.println("SUCCESS!"); } }
镖师甲 回复于:2004-09-30 20:09:48
下面这个例子是应该是最常用的查询操作的例子用到了DirContext的几个search方法中的一个。
package study.jndi; import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.NamingEnumeration; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchResult; import javax.naming.directory.SearchControls; public class FilterSearch{ public static final String ROOT_ENTRY = "ou=xc,ou=t,c=com"; public static void main(String[] args){ Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL,"ldap://127.0.0.1:10389/"); try{ DirContext ctx = new InitialDirContext(env); SearchControls controls = new SearchControls(); String filter = "(&(objectClass=top)(cn=*))"; /** * OBJECT_SCOPE *controls.setSearchScope(SearchControls.OBJECT_SCOPE); *NamingEnumeration se = ctx.search("cn=txc,ou=xc,ou=t,c=com",filter,controls); */ controls.setCountLimit(100); //If the program attempts to get more than the count limit number of results, then a SizeLimitExceededException will be thrown controls.setSearchScope(SearchControls.SUBTREE_SCOPE); NamingEnumeration se = ctx.search("c=com",filter,controls); while(se.hasMore()){ SearchResult result = (SearchResult)se.next(); System.out.println("**SearchResult : " + result.getName()); JNDITools.listAttributes(result.getAttributes()); } }catch(NamingException ex){ ex.printStackTrace(); } System.out.println("SUCCESS!"); } }
下面对以上的代码进行解释:search()方法的第一个参数是一个上下文执行时在这个上下文下进行查找,第二个参数是一个Filter字串意思 是符合objectClass=top并且cn属性为任意值的entry,第三个属性是一个SearchControls对象在这个对象中设置一些参数用 于控制查找,如controls.setSearchScope(SearchControls.SUBTREE_SCOPE);这个方法中有三个值, SUBTREE_SCOPE为查找给定上下文(第一个参数)下以及所有下级上下文下的所有entry,而ONELEVEL_SCOPE只查找给定上下文下 的entry,OBJECT_SCOPE只查找一个entry。controls.setCountLimit(100); 是设置查找返回的最大结果, 如果查询的结果超过了这个值那么就会抛出一个异常。还有一个设置超时时间的方法setTimeout()。
对了还有一个工具类用于打印给定属性集合中的所有属性以及属性的值代码如下:
package study.jndi; import javax.naming.NamingException; import javax.naming.NamingEnumeration; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; public class JNDITools{ public static void listAttributes(Attributes attrs)throws NamingException{ for(NamingEnumeration ae = attrs.getAll();ae.hasMore();){ Attribute attr = (Attribute)ae.next(); System.out.println("Attribute : " + attr.getID()); for(NamingEnumeration ve = attr.getAll();ve.hasMore();){ System.out.println(" value : " + ve.next()); } } } }
在这里抛砖引玉,希望熟悉JNDI的朋友会给出好的建议,哈哈,更希望给和我一样的初学者提供帮助。先写到这里。
参考资料:JNDI Toturial http://java.sun.com/products/jndi/tutorial/
发表评论
-
java设计模式--代理模式
2014-02-22 16:36 520java设计模式之——代理模式 设计模式Java ... -
java 相关日期处理类
2011-09-06 17:01 683锁定老帖子 主题:java处理年、月、周次以及 ... -
深入探究JFreeChart(2)
2009-08-14 17:47 8623 数据源处理 JFreeChart 中的数据源是DataS ... -
深入探究JFreeChart(1)
2009-08-14 17:45 1008JFreeChart 是 SourceForge.n ... -
JFreeChart中文API
2009-08-14 14:09 673JFreeChart中文API 原文来自: htt ... -
java访问权限修饰符public protected friendly private用法总结
2009-01-07 12:18 1587java访问权限修饰符public protected f ... -
泛型注意的细节
2008-09-29 17:08 6651、不可以用一个 ... -
线程和进程的区别
2008-09-25 23:47 808<script>show_img("a ... -
WebLogic 9.2刚接触-新手安装到配置
2008-09-19 13:10 3628WebLogic 9.2刚接触-新手安 ... -
eclipse工具小技巧
2008-09-01 22:08 788一:解决保存中文问题 MyEclipse-> Win ... -
J2EE中文问题终极解决之道- -
2008-08-23 13:07 731RedMoon J2EE面试题集锦 ... -
java基础知识总结
2008-07-31 18:10 722■final ◆ 修饰的变量 类中声明为final的变 ... -
线程与进程的区别
2008-07-30 23:45 1903线程与进程的区别 多线 ...
相关推荐
这是一个JDNI学习资料,有关使用和配置的详细信息。看过的都说不错。
JNDI学习总结,JNDI配置数据源,资料详细,适合初学者
javaEE学习EJB的jndi,一个小代码,易于理解
JNDI............................
关于JNDI的介绍和个人总结 还请多多指教 大家来分享学习 共同进步 谢谢
java - 访问数据库学习 在Java开发中,使用JDBC操作数据库的步骤 数据源由来、数据源配置
JNDI 开发配置,有问题联系我,我觉得JNDI学习的人不是很多
jndi入门学习资料,介绍jndi基本原理,安装和使用,基本配置
JavaEE5学习笔记02-JNDI与RMI.
java的JNDI 技术介绍及应用 以及整理的代码。很适合学习与交流用
JNDI 功能 介绍 教程,需要学习JNDI
JNDI 注简单来说就是在 JNDI 接在初始化时,如: InitialContext.lookup(URI) ,如果URI 可控,那么客户端就可能会被攻击通过
一点不懂jndi的朋友看过之后可以有个初步的认识!!!!!!
NULL 博文链接:https://housheng33.iteye.com/blog/1522705
servlet学习笔记_JNDI.doc
tomcat配置jndi、数据库连接jndi、jndi实例、非常简单,可以快速学习入门。有连接数据库的例子,和具体的配置。
可能别人遇到的问题也会是你以后遇到的问题,在这里把问题共享了一下。
1.1 Apache Tomcat各版本 1.2 Apache Tomcat Versions 1.3 Java事务处理总结 1.4 JavaBean中使用JDBC方式进行事务处理 ...1.23 JSF+Seam框架学习心得 1.24 java jdbc驱动的四种类型 1.25 resource-ref元素
我自己学的,希望能帮你们解决一些学习上的困难