`

JNDI的学习

阅读更多

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/

分享到:
评论

相关推荐

    JNDI学习资料,有关使用和配置

    Java Naming and Directory Interface (JNDI) 是Java平台中用于访问命名和目录服务的API,它提供了一种标准的方法来查找和绑定各种类型的名字。在IT领域,JNDI主要被用来管理和查找数据源(DataSource),特别是在...

    JNDI学习总结(一)——JNDI数据源的配置.html

    JNDI学习总结,JNDI配置数据源,资料详细,适合初学者

    jndi学习经典

    javaEE学习EJB的jndi,一个小代码,易于理解

    JNDI学习文档.doc

    **Java Naming and Directory Interface (JNDI) 是Java平台中用于访问命名和目录服务的一组API。它提供了一个统一的接口来查找、访问和管理分布式系统中的资源,如数据库连接池、邮件服务器、对象服务等。JNDI的核心...

    JNDI介绍和学习资料

    关于JNDI的介绍和个人总结 还请多多指教 大家来分享学习 共同进步 谢谢

    JNDI学习总结.docx

    java - 访问数据库学习 在Java开发中,使用JDBC操作数据库的步骤 数据源由来、数据源配置

    DBCP 数据库连接池JNDI连接 学习笔记

    这篇“DBCP 数据库连接池JNDI连接 学习笔记”主要探讨了如何结合JNDI(Java Naming and Directory Interface)来使用DBCP进行数据库连接管理。JNDI提供了一种标准的方式来查找和绑定资源,如数据源,在企业级应用中...

    JNDIDemo 以及相关文档

    通过学习这些文档和实践`JNDIDemo`,你可以掌握JNDI的基本用法,理解其在企业级应用中的重要性,以及如何在实际项目中利用JNDI进行资源管理。这将有助于提升你的Java编程技能,特别是对于处理分布式系统和企业级Java...

    JNDI示例整合SSH

    **标题:“JNDI示例整合SSH”** 在IT领域,`JNDI`(Java Naming and Directory Interface)是...为了深入学习和实践,你可以解压并研究这些文件,结合文章链接中提供的详细教程,进一步理解JNDI在SSH框架中的应用。

    JNDI基础教程课件

    jndi入门学习资料,介绍jndi基本原理,安装和使用,基本配置

    JNDI简单应用示例

    通过阅读和学习这个示例,你可以掌握如何在实际项目中利用JNDI来管理和查找资源,提高代码的可维护性和可扩展性。对于那些处理复杂企业级应用,尤其是需要频繁交互各种服务的开发者来说,理解并熟练使用JNDI是非常有...

    JNDI初步学习资料

    JNDI(Java Naming and Directory Interface)是Java平台中用于访问命名和目录服务的API,它为Java应用程序提供了一种标准的方式来查找、管理和组织资源。JNDI与具体的命名或目录服务实现无关,这意味着开发者可以...

    JNDI注入学习1

    **JNDI注入详解** Java Naming and Directory Interface (JNDI) 是Java应用程序用来查找和管理网络资源的接口。它不依赖于特定的目录服务,而是通过服务提供者接口(SPI)来支持多种不同的目录服务,如LDAP、DNS等...

    JNDI.rar_JINI jndi_JNDI相关书籍_jndi

    **在学习JNDI时,你可能会遇到的几个关键知识点:** 1. **Naming Contexts**:命名上下文是JNDI的核心,它代表了一个命名空间,可以包含其他上下文和对象。 2. **Lookup操作**:通过指定的名字在命名上下文中查找...

    JNDI配置原理详解.doc

    通过本文的学习,我们了解了JNDI的基本原理及其在不同环境下的配置方法。特别地,对于非服务器环境,我们探讨了如何通过启动本地RMI服务来模拟JNDI行为。此外,还简要介绍了JNDI的安全性配置选项。掌握这些知识将有...

    JNDI使用

    - **学习曲线**:JNDI API相对复杂,需要花费时间学习。 - **性能**:相比于直接访问服务,通过JNDI进行查找可能稍慢。 通过上述介绍,我们可以看出JNDI在Java应用程序中起着至关重要的作用,尤其是在企业级应用中...

    jndi测试小项目,初学者

    **学习JNDI的关键点**: 1. **理解Naming和Directory的区别**:Naming服务主要是用来管理简单的名字到对象的映射,而Directory服务则可以存储和检索更复杂的对象,包括属性和层次结构。 2. **JNDI API的使用**:熟悉...

    JNDI数据链接池示例

    **JNDI(Java Naming and Directory Interface)**是Java平台中的一个重要组件,它提供了一种标准的方法来查找和访问...TestJNDI文件提供了实践这一概念的实际代码,对学习和掌握JNDI数据链接池有着重要的指导作用。

    JNDI-Injection-Exploit-1.0-SNAPSHOT-all.zip

    Java Naming and Directory Interface (JNDI) 是Java平台中用于访问命名和目录服务的API,它允许程序查找和操作各种...通过学习和理解这个工具包,开发人员和安全专家能够增强他们的系统安全性,防止这类威胁的发生。

Global site tag (gtag.js) - Google Analytics