下面这个小demo会将一个对象绑定到一个JNDI服务器上,然后通过JNDI客户端获得这个对象。
PS:我们姑且这样叫:JNDI服务器,JNDI客户端这样理解起来可能比较简单
1.建立一个普通的Java项目
2.导入JDK
在JDK 5的rt.jar中一共找到了4种SUN自带的JNDI实现:LDAP,CORBA,RMI,DNS。
这4种JNDI要正常运行还需要底层的相应服务。我们没有LDAP或CORBA服务器,也就无法启动这两种JNDI服务,DNS用于查域名。唯一可以在main()中启动的就是基于RMI的JNDI服务。
PS:因为只是一个理解性的demo所以没有必要那么认真,下一个demo我们将连接weblogic服务器,获得服务器上的连接,那么我们看到的会更加直观。
3.开发绑定对象
在使用RMI来绑定对象,我们的对象必须继承接口:Remote;然后由于对象要在网络中传输,所以对象还得序列化即:继承接口——Serializable
package com.hh.jndi2; import java.io.Serializable; import java.rmi.Remote; /** * * @title Person * @description 使用RMI实现JNDI对象绑定到服务器上,对象必须继承Remote。对象要在网络中传输必须要序列化,所以继承Serializable * @author hadoop * @version * @copyright (c) SINOSOFT * */ public class Person implements Remote,Serializable { /** * @title long * @description TODO * @author hadoop * @param Person.java * @return TODO * @throws */ private static final long serialVersionUID = 1L; private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String toString(){ return "name:"+name+" password:"+password; } }
4.开发测试类
package com.hh.jndi2; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.naming.spi.NamingManager; public class Test { /** * * @title initPerson * @description 绑定一个对象到JNDI服务上 * @author hadoop * @throws Exception */ public static void initPerson() throws Exception{ //配置JNDI工厂和JNDI的url和端口。如果没有配置这些信息,将会出现NoInitialContextException异常 LocateRegistry.createRegistry(3000); System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory"); System.setProperty(Context.PROVIDER_URL, "rmi://localhost:3000"); ////初始化 InitialContext ctx = new InitialContext(); //实例化person对象 Person p = new Person(); p.setName("zc"); p.setPassword("123"); //将person对象绑定到JNDI服务中,JNDI的名字叫做:person。 ctx.bind("person", p); ctx.close(); } /** * * @title findPerson * @description 通过JNDI获得person对象 * @author hadoop * @throws Exception */ public static void findPerson() throws Exception{ //因为前面已经将JNDI工厂和JNDI的url和端口已经添加到System对象中,这里就不用在绑定了 InitialContext ctx = new InitialContext(); //通过lookup查找person对象 Person person = (Person) ctx.lookup("person"); //打印出这个对象 System.out.println(person.toString()); ctx.close(); } public static void main(String[] args) throws Exception { initPerson(); findPerson(); } }
5.demo的结构: