Java知识点分析和总结.docx

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
JNDI 配置原理详解 最近写书,写到 JNDI,到处查资料,发现所有的中文资料都对 JNDI 解释一通, 配置代码也是 copy 的,调了半天也没调通,最后到 SUN 的网站参考了一下他的JNDI tutorial,终于基本上彻底明白了 和多数 java 服务一样,SUN 对 JNDI 也只提供接口,使用 JNDI 只需要用到 JNDI 接口而不必关心具体实现: private static Object jndiLookup() throws Exception { InitialContext ctx = new InitialContext(); return ctx.lookup(java:comp/env/systemStartTime); } 上述代码在 J2EE 服务器环境下工作得很好,但是在 main()中就会报一个NoInitialContextException,许多文章会说你创建 InitialContext 的时候还要传一个 Hashtable 或者 Properties,像这样: Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, weblogic.jndi.WLInitialContextFactory); env.put(Context.PROVIDER_URL,t3://localhost:7001); InitialContext ctx = new InitialContext(env); 这个在 WebLogic 环境下是对的,但是换到 JBoss 呢?再用 JBoss 的例子? 其实之所以有 NoInitialContextException 是因为无法从 System.properties 中获得必要的 JNDI 参数,在服 务器环境下,服务器启动时就把这些参数放到System.properties 中了,于是直接 new InitialContext()就搞定了,不要搞env 那么麻烦,搞了env 你的代码还无法移植,弄不好管理员设置服务器用的不是标准端口还照样抛异 常。 但是在单机环境下,可没有 JNDI 服务在运行,那就手动启动一个 JNDI 服务。我在 JDK 5 的 rt.jar 中一共找到了 4 种 SUN 自带的 JNDI 实现: LDAP,CORBA,RMI,DNS。 这 4 种 JNDI 要正常运行还需要底层的相应服务。一般我们没有 LDAP 或 CORBA 服务器,也就无法启动这两种 JNDI 服务,DNS 用于查域名的,以后再研究,唯一可以在 main()中启动的就是基于 RMI 的 JNDI 服务。 现在我们就在 main()中启动基于 RMI 的 JNDI 服务并且绑一个 Date 对象到 JNDI 上: 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(); 注意,我直接把 JNDI 的相关参数放入了 System.properties 中,这样,后面的代码如果要查 JNDI,直接 new InitialContext()就可以了,否则,你又得写Hashtable env = ... 在 RMI 中绑 JNDI 的限制是,绑定的对象必须是 Remote 类型,所以就自己扩展一个。 其实 JNDI 还有两个 Context.SECURITY_PRINCIPAL 和Context.SECURITY_CREDENTIAL,如果访问 JNDI 需要用户名和口令,这两个也要提供,不过一般用不上。 在后面的代码中查询就简单了: InitialContext ctx = new InitialContext(); Date startTime = (Date) ctx.lookup(java:comp/env/systemStartTime); 在 SUN 的 JNDI tutorial 中的例子用的c

文档评论(0)

tianya189 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档