jndi 小案例
JNDI就是为JAVA中命名和目录服务定义的JAVA API,是命名服务的抽象机制。在J2EE中,JNDI的目的是用来查找J2EE服务器的注册资源。只要该对象在命名服务器上注册过,且你知道命名服务器的地址和该对象在命名服务器上注册的JNDI名。这样你就可以在无需知道对象位置的情况下获取和使用对象。SUN对JNDI只提供接口,使用JNDI只需要用到JNDI接口而不必关心具体实现。
现在我们就可以在main()中启动基于RMI的JNDI服务并且绑一个对象到JNDI上。注意,我直接把JNDI的相关参数放入了System.properties中,这样,后面的代码如果要查JNDI,直接new InitialContext()就可以了
在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型,所以就需要自己扩展一个。其实JNDI还有两个Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果访问JNDI需要用户名和口令,这两个也要提供,不过一般用不上。下面是两个使用JNDI的简单例子的代码,可以直接运行。
使用main方法做JNDI的demo时出现NoInitialContextException是因为无法从System.properties中获得必要的JNDI参数,在服务器环境下,服务器启动时就把这些参数放到System.properties中了,于是直接new InitialContext()就搞定了。但是在单机环境下,可没有JNDI服务在运行,那就需要手动启动一个JNDI服务。在JDK 5的rt.jar中一共找到了4种SUN自带的JNDI实现:LDAP,CORBA,RMI,DNS。
这4种JNDI要正常运行还需要底层的相应服务。一般我们没有LDAP或CORBA服务器,也就无法启动这两种JNDI服务,DNS用于查域名的,以后再研究,唯一可以在main()中启动的就是基于RMI的JNDI服务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | package com.ellen.jndi; import java.io.Serializable; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.util.Date; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; //在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型 class Person implements Remote, Serializable { private static final long serialVersionUID = -8592182872966400365L; private String name; private String pass; public String getName() { return name; } public void setName(String name) { this .name = name; } public String getPass() { return pass; } public void setPass(String pass) { this .pass = pass; } public String toString() { return "name=" + this .getName() + "&pass=" + this .getPass(); } } // 在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型 // 外部扩展,可以内部扩展也可以外部扩展 class RemoteDate extends Date implements Remote { }; public class Demo { public static void initDate() throws NamingException, RemoteException { // 设置参数 LocateRegistry.createRegistry( 1099 ); System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory" ); System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099" ); InitialContext ctx = new InitialContext(); // 在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型 // 内部扩展,可以内部扩展也可以外部扩展 class RemoteDate extends Date implements Remote { } ; ctx.bind( "java:comp/env/systemStartTime" , new RemoteDate()); ctx.close(); } public static void initDate2() throws NamingException, RemoteException { // 设置参数 LocateRegistry.createRegistry( 1099 ); System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory" ); System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099" ); InitialContext ctx = new InitialContext(); // 自己扩展,可以内部扩展也可以外部扩展 // class RemoteDate extends Date implements Remote { // } // ; ctx.bind( "java:comp/env/systemStartTime" , new RemoteDate()); ctx.close(); } public static void findDate() throws NamingException, RemoteException { // 直接使用 InitialContext ctx = new InitialContext(); Date startTime = (Date) ctx.lookup( "java:comp/env/systemStartTime" ); System.out.println( "+++++++++++++++++++++++" + startTime.toString()); ctx.close(); } public static void jndiDate() throws NamingException, RemoteException { // Demo.initDate(); Demo.initDate2(); Demo.findDate(); } public static void initPerson() throws NamingException, RemoteException { // 设置参数 LocateRegistry.createRegistry( 1099 ); System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory" ); System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099" ); InitialContext ctx = new InitialContext(); // Person person = new Person(); // person.setName("ellen"); // person.setPass("000727"); ctx.bind( "java:comp/env/person" , new Person()); ctx.close(); } public static void initPerson2() throws NamingException, RemoteException { // 设置参数 LocateRegistry.createRegistry( 1099 ); System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory" ); System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099" ); InitialContext ctx = new InitialContext(); Person person = new Person(); person.setName( "ellen" ); person.setPass( "000727" ); ctx.bind( "java:comp/env/person" , person); ctx.close(); } public static void findPerson() throws NamingException, RemoteException { // 直接使用 InitialContext ctx = new InitialContext(); Person person = (Person) ctx.lookup( "java:comp/env/person" ); System.out.println( "------" + person.toString()); System.out.println( "------" + person.getName()); System.out.println( "------" + person.getPass()); ctx.close(); } public static void jndiPerson() throws NamingException, RemoteException { // Demo.initPerson(); Demo.initPerson2(); Demo.findPerson(); } public static void main(String[] args) throws NamingException, RemoteException { // 为什么两个jndi的例子不能同时运行 // internal error: ObjID already in use // Demo.jndiDate(); Demo.jndiPerson(); } } |
posted on 2015-08-28 17:11 nevergiveupzeng 阅读(307) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理