由于工作需要学习了一天的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/
dong_jh 回复于:2004-10-03 16:20:59
好,(二)呢?
mao0531 回复于:2004-10-08 09:28:05
请继续!
smithy 回复于:2004-10-09 15:04:25
我前段时间也学了一个多星期
carinnar 回复于:2006-06-16 09:26:13
谢谢!!
hanxin0131 回复于:2006-06-16 18:14:54
太有耐性了~~
|
相关推荐
这篇“DBCP 数据库连接池JNDI连接 学习笔记”主要探讨了如何结合JNDI(Java Naming and Directory Interface)来使用DBCP进行数据库连接管理。JNDI提供了一种标准的方式来查找和绑定资源,如数据源,在企业级应用中...
### JNDI (Java Naming and Directory Interface)学习笔记 #### 一、JNDI简介 JNDI(Java Naming and Directory Interface),即Java命名和目录接口,是在分布式计算环境中使用的一种标准化接口,它允许Java应用...
2. **JNDI学习.doc与JNDI学习笔记--概念篇.doc** JNDI(Java Naming and Directory Interface)是Java平台中的一个接口,用于访问命名和目录服务。这两份文档将帮助你理解JNDI的基础知识,包括它的作用、API使用、...
【标题】"Tomcat学习笔记 - 使用JNDI数据源" 在Java应用服务器如Tomcat中,使用JNDI(Java Naming and Directory Interface)数据源是一种标准的方式,它允许我们集中管理和配置数据库连接,提高应用的可移植性和可...
【JAVA WEB学习笔记】——Tomcat中数据源的配置与使用 在Java Web开发中,数据源(DataSource)是管理数据库连接的关键组件。它提供了一种高效、灵活的方式来获取和管理数据库连接,尤其是在大型企业级应用中。...
### Servlet学习笔记3:深入理解Servlet...综上所述,本学习笔记涵盖了Servlet技术的核心概念、Tomcat服务器配置、JNDI和数据源管理以及Java EE架构的概览,是Java Web开发者深入理解和掌握Servlet技术的重要参考资料。
**JDBC学习笔记** 在Java开发中,JDBC(Java Database Connectivity)是连接数据库的关键技术。它是Java API,允许Java程序与各种类型的数据库进行交互。本笔记将深入探讨JDBC的核心概念、工作原理以及实际应用。 ...
【标题】:Tomcat学习笔记 【正文】: Tomcat是一款广泛应用的开源Web服务器和Java Servlet容器,由Apache软件基金会的Jakarta项目开发。它实现了Java Servlet和JavaServer Pages(JSP)规范,并且作为轻量级应用...
本学习笔记涵盖了JavaEE的核心技术,帮助学习者深入理解和掌握javaweb的各项技能。 1. **Servlet与JSP** - **Servlet**:Servlet是Java编写的服务器端程序,主要用于扩展服务器的功能。在JavaEE中,Servlet处理...
学习笔记会讲解如何通过JNDI查找和管理这些服务。 5. **JTA(Java Transaction API)和JPA(Java Persistence API)**:JTA提供了一种统一的事务管理机制,确保多操作的原子性。JPA则简化了对象关系映射(ORM),...
**J2EE学习笔记概述** J2EE(Java 2 Platform, Enterprise Edition)是Java平台的一个版本,专门针对企业级应用开发。它提供了一个全面的框架来构建、部署和管理多层、分布式、跨平台的企业应用程序。J2EE学习笔记...
Java JDK 6学习笔记——PPT简体版是针对初学者和有经验的开发者们的一份宝贵资源,它深入浅出地介绍了Java编程语言的核心概念和技术。这份笔记以PPT的形式呈现,使得学习过程更加直观易懂,适合课堂教学或自我学习。...
【J2EE学习笔记概述】 J2EE,全称为Java 2 Platform, Enterprise Edition,是Java平台上用于构建企业级应用的框架。它提供了一个统一的标准和可扩展的平台,允许开发人员创建分布式、多层的企业应用程序。J2EE的...
《软件工程师学习笔记J2EE》是一份针对Java企业级应用开发(J2EE)的详尽学习资源,对于想要深入理解和掌握J2EE技术体系的软件工程师来说,具有极高的参考价值。这份笔记不仅全面覆盖了J2EE的基础概念,还深入探讨了...
**J2EE学习笔记概述** J2EE(Java 2 Platform, Enterprise Edition)是Java平台的一个版本,专门针对企业级应用开发。它提供了一个全面的框架,用于构建、部署和管理分布式多层企业应用程序。本笔记主要围绕J2EE的...
**J2EE学习笔记概述** J2EE,全称为Java 2 Platform, Enterprise Edition,是Java平台上用于构建企业级分布式应用程序的框架。它为开发者提供了丰富的功能,包括Web服务、事务处理、安全控制以及数据库连接等,使得...
**J2EE精华学习笔记** J2EE,全称为Java 2 Platform, Enterprise Edition,是Java平台上用于构建企业级分布式应用程序的框架。本学习笔记旨在深入解析J2EE的核心概念和技术,帮助读者全面掌握J2EE开发的关键知识。 ...