JNDI实战

JNDI实战
最近两天研究JNDI,在练习的过程中遇到不少问题,现总结总结
1概念:JNDI全称Java Naming Directory Interface,概念就不用讲了。
2 运行环境搭建:
   A,需要安装JDK.
   B, JNDI software (相信现在你用的JDK一定带有的),不用安装,如javax.naming包。
   C, Service provider服务提供者,就是用在JNDI API和JNDI 服务器交互的,郁闷了吧,还有服务器一说。其实我们可以用JNDI来通过一个绑定的name和一些特定的属性获得一个具体的对象,以至于我们能够操作对象,这就是JNDI给我们提供的服务,所以说有服务器一说也是可以理解的。这个也是不用装的,JDK1.3以上提供了三个Service provider,这三个Service provider是分别基于LDAP,RMI,CORBA的。
   D 名称和目录服务器,这个是需要安装的。我用到的有两种,一种就是文件服务器(我们的PC机就有此功能),不用安装。另外一个就是基于LDAP的服务器(OpenLDAP),这个需要安装,可以去http://download.bergmans.us/openldap/openldap-2.2.19/openldap-2.2.19-db-4.3.21-openssl-0.9.7e-win32.exe这里下载免费的安装程序,默认一直NEXT安装就OK,安装好之后自己机器上会有一个OpenLDAP…的服务,自己去检查。安装程序sun网站上也有,但是在sun那里我下载到的是源码,需要在LINUX下编译安装的。
3,真枪实弹:既然大体了解了,就开始coding吧,谁怕谁啊,学习文档上把代码COPY一下不就可以运行了吗,哈哈。。。。好戏才刚刚开始,第一个程序:
import javax.naming.*;
publicclass Lookup {
    publicstaticvoid main(String[] args) {
       Hashtable env = new Hashtable();
       env.put(Context.INITIAL_CONTEXT_FACTORY,
              "com.sun.jndi.fscontext.RefFSContextFactory");
       try {
           // Create the initial context
           Context ctx = new InitialContext(env);
           System.out.println(ctx.getEnvironment());
       } catch (NamingException e) {
           System.err.println("Problem: " + e);
       }
    }
} 
多简单啊,初始化一个基于文件系统的上下文(Context),这里的RefFSContextFactory就是属于上面所介绍的Service provider了。我一运行就碰壁,NoInitialContextException发生了,我一看文档说是只有两中可能:1是没有设置Context.INITIAL_CONTEXT_FACTORY属性,明显嘛,我已经设置了,2,service provider不可用。晕 JDK不是连LDAP的服务提供者都给了吗?干麻区区的文件系统的服务提供者都不给啊,真是奇怪。过程是辛苦的,但是方案是简单的,嘿嘿,没有就去下一个贝,com.sun.jndi.fscontext.RefFSContextFactory在fscontext.jar里,去SUN网站上下载就OK,我下载的是一个ZIP文件(fscontext-1_2-beta3.zip),里面还附带者一个providerutil.jar。解压之后把两个JAR文件放在JDK路径/jre/lib/ext下,问题解决了,附带说一下,本来还需要一个文件服务器的,不过我们的PC机就是一个,前面说过。
第二个程序(基于LDAP的):
import javax.naming.*;
publicclass LDAPTest{
    publicstaticvoid main(String[] args) {
      Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY,                "com.sun.jndi.ldap.LdapCtxFactory");env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");       try {
           // Create the initial context
           Context ctx = new InitialContext(env);
           System.out.println(ctx.getEnvironment());
       } catch (NamingException e) {
           System.err.println("Problem: " + e);
       }
    }
}
很简单,都是教程上的例子,这回错误是CommunicationException java.net.ConnectException: Connection refused: connect;看文档,重点查找LdapCtxFactory类,这个类是有的,在rt.jar文件下根据上面的路径是能找到的,呵呵,看来是有服务提供者了,通过学习,知道这与文件系统不一样,LDAP是需要装服务器的,于是就象2.D那样做了,然后把OpenLDAP服务启动之后,程序OK了,很激动,小小的两个问题折腾了我一天,不过解决问题之后的情绪是很激动的,至少自己入门了。可以进一步学习JNDI了,希望与大家分享一切收获。

你可能感兴趣的:(JNDI)