这样你就可以在无需知道对象位置的情况下获取和使用对象。SUN对JNDI只提供接口,使用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服务。

现在我们就可以在main()中启动基于RMI的JNDI服务并且绑一个对象到JNDI上。注意,我直接把JNDI的相关参数放入了System.properties中,这样,后面的代码如果要查JNDI,直接new InitialContext()就可以了

在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型,所以就需要自己扩展一个。其实JNDI还有两个Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果访问JNDI需要用户名和口令,这两个也要提供,不过一般用不上。下面是两个使用JNDI的简单例子的代码,可以直接运行。

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();

}

}

java jndi使用_JNDI简单入门相关推荐

  1. java中logger_Java日志系统---Logger之简单入门

    Java 中自带的日志系统,今天抽空了解了一点,算是入了门,所以将自己的一些心得记录下来,以备日后查看,有兴趣的朋友,看到此文章,觉得有错误或需要添加的地方,请在下方评论留言,大家可以共同进步,谢谢: ...

  2. JAVA Bean和XML之间的相互转换 - XStream简单入门

    JAVA Bean和XML之间的相互转换 - XStream简单入门 背景介绍 XStream的简介 注解简介 应用实例 背景介绍 我们在工作中经常 遇到文件解析为数据或者数据转化为xml文件的情况, ...

  3. 【java开发系列】—— spring简单入门示例

    回顾 1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控 ...

  4. Python 简单入门指北(二)

    Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...

  5. java jndi 例子_MEJB附录B,jndi例子无法运行的问题

    在MEJB这本书的附录B(JNDI)中有一个简单的例子 package jndi.initctx; import java.util.Properties; /** * Illustrates how ...

  6. Mybatis 一对多 结果集映射 简单入门 易懂

    Mybatis官方文档说明处 Mybatis 一对多 结果集映射 简单入门 易懂 一.搭建数据库环境 二.idea 搭建maven 项目 (mybatis-demo) 2.1.项目结构 2.2.导入依 ...

  7. 分布式锁简单入门以及三种实现方式介绍(滴滴)

    很多小伙伴在学习Java的时候,总是感觉Java多线程在实际的业务中很少使用,以至于不会花太多的时间去学习,技术债不断累积!等到了一定程度的时候对于与Java多线程相关的东西就很难理解,今天需要探讨的 ...

  8. 程序员入门c语言还是java,先学java还是c语言?入门学哪种语言?

    很多刚接触编程语言的小伙伴都会有一个疑问先学 Java 还是 C 语言?今天 W3Cschool 小编就来和大家简单介绍一些,做个对比相信小伙伴们能够自行作出适合自己的判断. 在探讨先学 Java 还 ...

  9. Okio 1.9简单入门

    Okio 1.9简单入门 Okio库是由square公司开发的,补充了java.io和java.nio的不足,更加方便,快速的访问.存储和处理你的数据.而OkHttp的底层也使用该库作为支持. 该库极 ...

最新文章

  1. 使用Intellij IDEA 解决Java8的数据流问题
  2. 【我的Android进阶之旅】如何快速寻找Android第三方开源库在Jcenter上的最新版本...
  3. Python_管理项目
  4. 我的世界服务器高清修复,我的世界1.7.2 skinme高清修复(optifine)兼容版 35+8大型基础包...
  5. 整合SharePoint MOSS 和SQL Server 2005 reporting service(一)
  6. vb.net 弹出对话框 修改按钮名_批量修改日期格式
  7. MySQL 8.0版本安装后,安装目录下找不到my.ini文件
  8. 特征向量按照特征值大小进行排序
  9. redis 缓存预热_Redis:缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级
  10. 深入理解并发的关键字-synchronized
  11. 学习面向对象编程OOP 第一天
  12. python的*args与**kwargs
  13. 华为发布全新一代OceanStor存储Pacific系列,打造海量数据存储新标杆
  14. 测试交友软件哪个最好用,陌陌与比邻你觉得哪个好用?陌陌比邻两大交友软件对比...
  15. switch语句(JS)
  16. 仍然提供32位Linux发行版,Ubuntu 20.04彻底淘汰32位映像,只提供64位映像下载
  17. java基础代码详解
  18. 计算机if函数的作用,if函数的使用方法
  19. 爱奇艺大数据实时分析平台的建设与实践
  20. 15幅非常有创意的影子摄影作品欣赏

热门文章

  1. 布里渊散射信号仿真matlab代码,布里渊散射及BTDR原理.ppt
  2. ChatGPT中文版写论文神器使用技巧
  3. 选好股票得的几个重要指标,一定要会看
  4. linux的tty , pts 和notty pty伪终端
  5. 股票投资股市入门理论知识入门须知<第二天>
  6. moxa mscomm
  7. sigfillset
  8. 泡一杯茶,学一学同异步
  9. 微信小程序:BLE蓝牙开发
  10. java 音频转为wav格式标准音频 | Java工具类