免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 19144 | 回复: 13
打印 上一主题 下一主题

JNDI学习笔记(一) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-09-30 18:53 |只看该作者 |倒序浏览
由于工作需要学习了一天的JNDI有一些收获,写下来与大家分享.高手可以帮忙纠正和指点,在此谢过!
一:
  几个概念,Context,entry/object,filter.Attribute
  Context:上下文,我的理解是相当与文件系统的中的目录(JNDI的Naming Service是可以用操作系统的文件系统的,哈哈).
  entry/object:一个节点,相当与文件系统中的目录或文件.
  filter:查询/过滤条件是一个字符串表达式如&(objectClass=top)(cn=*))查询出objectClass属性为top,cn属性为所有情况的entry.
  Attribute:entry/object的属性可以理解成JAVA对象的属性,不同的是这个属性可以多次赋值.

论坛徽章:
0
2 [报告]
发表于 2004-09-30 19:15 |只看该作者

JNDI学习笔记(一)

(怕发丢了分着发)
二:
  Naming Service的简单例子,JNDI的全称是名字与目录服务,LDAP服务器都可以做Naming Service和Directory Service.JNDI Toturial上为了方面用File System做为naming service.以下的一个例子是演示一个从File System Lookup.

  1. package study.jndi;

  2. import java.util.Hashtable;
  3. import javax.naming.Context;
  4. import javax.naming.InitialContext;
  5. import javax.naming.NamingException;

  6. public class Lookup{
  7.         public static void main(String[] args){
  8.                 Hashtable env = new Hashtable();
  9.                 String name = "C:/aaa.txt";
  10.                 try{
  11.                         env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory"); //use the file system as service provider
  12.                         Context ctx = new InitialContext(env);
  13.                         Object obj = ctx.lookup(name);
  14.                         System.out.println("the name " + name + " is bound to object:" + obj);
  15.                 }catch(Exception ex){
  16.                         ex.printStackTrace();
  17.                 }
  18.                
  19.                
  20.         }
  21. }
复制代码

为了运行的程序你要到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是文件系统.

论坛徽章:
0
3 [报告]
发表于 2004-09-30 19:51 |只看该作者

JNDI学习笔记(一)

由于我的工作主要是对Directory Service进行操作,所以重点学习了,javax.naming.directory包中的类.以下的几个例子演示从LDAP上查询ENTRY并得到属性和属性值.
假设我的LDAP是这样存放的:  根节点c=com 二级节点 ou=t 以及其它 三级节点 ou = xc 以及其它 四级节点 cn=bsj. LDAP服务器安装在我自己的机器上。
下面的一个例子是找到一个entry(object/节点,一个意思).然后取出所有的属性值。

  1. package study.jndi;

  2. import java.util.Hashtable;
  3. import javax.naming.Context;
  4. import javax.naming.NamingException;
  5. import javax.naming.NamingEnumeration;
  6. import javax.naming.directory.DirContext;
  7. import javax.naming.directory.Attribute;
  8. import javax.naming.directory.Attributes;
  9. import javax.naming.directory.InitialDirContext;


  10. public class GetAttr{
  11.         public static final String ENTRY_NAME = "cn=bsj,ou=xc,ou=t,c=com";
  12.         public static void main(String[] args){
  13.                
  14.                 Hashtable env = new Hashtable();
  15.                 env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
  16.                 env.put(Context.PROVIDER_URL,"ldap://127.0.0.1:10389/"); //login the ldap server
  17.                 try{
  18.                         DirContext ctx = new InitialDirContext(env);
  19.                         Attributes allAttr = ctx.getAttributes(ENTRY_NAME); //get *a* object's all attributes
  20.                         for(NamingEnumeration attrs = allAttr.getAll();attrs.hasMore();){
  21.                                 Attribute attr = (Attribute)attrs.next();
  22.                                 System.out.println("Attribute is : " + attr.getID());
  23.                                 for(NamingEnumeration values = attr.getAll();values.hasMore();){
  24.                                         System.out.println("    value is : " + values.next());
  25.                                 }
  26.                         }
  27.                                                
  28.                 }catch(NamingException ex){
  29.                         ex.printStackTrace();
  30.                 }
  31.                 System.out.println("SUCCESS!");
  32.         }
  33. }
复制代码

这个例子需要到同样的地址下载ldap.jar然后加入到CLASSPATH中,就可以执行,当然要保证你有一个配置到的LDAP服务器,我的是公司专用的服务器并且是配置好的,所以你要去找一个LDAP服务器安装好在运行这个例子。这个例子的原理就是用ctx根据节点的DN(专有名词,可以看做是文件名)来查找这个entry的所有属性,然后在从属性中得到所有的值,注意一个属性可以有多个值,如果你熟悉LDAP就会知道了。
下边这个例子在以上的例子基础上加了一个设置entry返回的属性都有哪些。

  1. package study.jndi;

  2. import java.util.Hashtable;
  3. import javax.naming.Context;
  4. import javax.naming.NamingException;
  5. import javax.naming.NamingEnumeration;
  6. import javax.naming.directory.DirContext;
  7. import javax.naming.directory.InitialDirContext;
  8. import javax.naming.directory.Attribute;
  9. import javax.naming.directory.Attributes;
  10. public class GetAttr2{
  11.         public static final String ENTRY_NAME = "cn=bsj,ou=xc,ou=t,c=com";
  12.         public static void main(String[] args){
  13.                 Hashtable env = new Hashtable();
  14.                 env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
  15.                 env.put(Context.PROVIDER_URL,"ldap://127.0.0.1:10389/"); //login the ldap server
  16.                 String[] attrNames = new String[]{"abc"};  //get a attribute's value
  17.                 try{
  18.                         DirContext ctx = new InitialDirContext(env);
  19.                         Attributes attrs = ctx.getAttributes(ENTRY_NAME,attrNames);
  20.                         for(NamingEnumeration ae = attrs.getAll();ae.hasMore();){
  21.                                 Attribute attr = (Attribute)ae.next();
  22.                                 System.out.println("Attribute : " + attr.getID());
  23.                                 for(NamingEnumeration ve = attr.getAll();ve.hasMore();){
  24.                                         System.out.println("  Value : " + ve.next());
  25.                                 }
  26.                         }
  27.                 }catch(NamingException ex){
  28.                         ex.printStackTrace();
  29.                 }
  30.                 System.out.println("SUCCESS!");
  31.         }
  32. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2004-09-30 20:05 |只看该作者

JNDI学习笔记(一)

下面的例子是利用DirContext提供的search方法对entry进行查找。
这个是查找一个CONTEXT下符合条件的一个或多个节点。

  1. package study.jndi;

  2. import java.util.Hashtable;
  3. import javax.naming.Context;
  4. import javax.naming.NamingException;
  5. import javax.naming.NamingEnumeration;
  6. import javax.naming.directory.Attribute;
  7. import javax.naming.directory.Attributes;
  8. import javax.naming.directory.BasicAttribute;
  9. import javax.naming.directory.BasicAttributes;
  10. import javax.naming.directory.DirContext;
  11. import javax.naming.directory.InitialDirContext;
  12. import javax.naming.directory.SearchResult;


  13. public class BasicSearch{
  14.         public static final String ROOT_ENTRY = "ou=xc,ou=t,c=com";
  15.         public static void main(String[] args){
  16.                 Hashtable env = new Hashtable();
  17.                 env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
  18.                 env.put(Context.PROVIDER_URL,"ldap://127.0.0.1:10389/");
  19.                 try{
  20.                         DirContext ctx = new InitialDirContext(env);
  21.                         Attributes matchAttrs = new BasicAttributes(true);//the attributes is interface
  22.                         matchAttrs.put(new BasicAttribute("cn","txc"));
  23.                         matchAttrs.put(new BasicAttribute("objectClass","top"));
  24.                         NamingEnumeration se = ctx.search(ROOT_ENTRY,matchAttrs);
  25.                         while(se.hasMore()){
  26.                                 SearchResult searchResult = (SearchResult)se.next();
  27.                                 System.out.println("**SearchResult : " + searchResult.getName());
  28.                                 JNDITools.listAttributes(searchResult.getAttributes());
  29.                         }
  30.                 }catch(NamingException ex){
  31.                         ex.printStackTrace();
  32.                 }
  33.                 System.out.println("SUCCESS!");
  34.         }
  35. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2004-09-30 20:09 |只看该作者

JNDI学习笔记(一)

下面这个例子是应该是最常用的查询操作的例子用到了DirContext的几个search方法中的一个。

  1. package study.jndi;

  2. import java.util.Hashtable;
  3. import javax.naming.Context;
  4. import javax.naming.NamingException;
  5. import javax.naming.NamingEnumeration;
  6. import javax.naming.directory.DirContext;
  7. import javax.naming.directory.InitialDirContext;
  8. import javax.naming.directory.SearchResult;
  9. import javax.naming.directory.SearchControls;

  10. public class FilterSearch{
  11.         public static final String ROOT_ENTRY = "ou=xc,ou=t,c=com";
  12.         public static void main(String[] args){
  13.                 Hashtable env = new Hashtable();
  14.                 env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");   
  15.                 env.put(Context.PROVIDER_URL,"ldap://127.0.0.1:10389/");                                    
  16.                 try{
  17.                         DirContext ctx = new InitialDirContext(env);
  18.                         SearchControls controls = new SearchControls();
  19.                         String filter = "(&(objectClass=top)(cn=*))";
  20.                        
  21.                         /**
  22.                          * OBJECT_SCOPE
  23.                          *controls.setSearchScope(SearchControls.OBJECT_SCOPE);
  24.                          *NamingEnumeration se = ctx.search("cn=txc,ou=xc,ou=t,c=com",filter,controls);
  25.                         */
  26.                         controls.setCountLimit(100); //If the program attempts to get more than the count limit number of results, then a SizeLimitExceededException will be thrown
  27.                         controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
  28.                         NamingEnumeration se = ctx.search("c=com",filter,controls);
  29.                         while(se.hasMore()){
  30.                                 SearchResult result = (SearchResult)se.next();
  31.                                 System.out.println("**SearchResult : " + result.getName());
  32.                                 JNDITools.listAttributes(result.getAttributes());
  33.                         }
  34.                 }catch(NamingException ex){
  35.                         ex.printStackTrace();
  36.                 }
  37.                 System.out.println("SUCCESS!");
  38.         }
  39. }
复制代码

下面对以上的代码进行解释: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()。
对了还有一个工具类用于打印给定属性集合中的所有属性以及属性的值代码如下:

  1. package study.jndi;

  2. import javax.naming.NamingException;
  3. import javax.naming.NamingEnumeration;
  4. import javax.naming.directory.Attribute;
  5. import javax.naming.directory.Attributes;
  6. public class JNDITools{
  7.         public static void listAttributes(Attributes attrs)throws NamingException{
  8.                 for(NamingEnumeration ae = attrs.getAll();ae.hasMore();){
  9.                         Attribute attr = (Attribute)ae.next();
  10.                         System.out.println("Attribute : " + attr.getID());
  11.                         for(NamingEnumeration ve = attr.getAll();ve.hasMore();){
  12.                                 System.out.println("  value : " + ve.next());
  13.                         }
  14.                 }
  15.         }
  16. }
复制代码


在这里抛砖引玉,希望熟悉JNDI的朋友会给出好的建议,哈哈,更希望给和我一样的初学者提供帮助。先写到这里。
参考资料:JNDI Toturial http://java.sun.com/products/jndi/tutorial/

论坛徽章:
0
6 [报告]
发表于 2004-10-03 16:20 |只看该作者

JNDI学习笔记(一)

好,(二)呢?

论坛徽章:
0
7 [报告]
发表于 2004-10-08 09:28 |只看该作者

JNDI学习笔记(一)

请继续!

论坛徽章:
0
8 [报告]
发表于 2004-10-09 15:04 |只看该作者

JNDI学习笔记(一)

我前段时间也学了一个多星期

论坛徽章:
0
9 [报告]
发表于 2006-06-16 09:26 |只看该作者
谢谢!!

论坛徽章:
0
10 [报告]
发表于 2006-06-16 18:14 |只看该作者
太有耐性了~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP