Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 760|回复: 0

JNDI简单入门

[复制链接]

该用户从未签到

发表于 2011-9-14 16:34:04 | 显示全部楼层 |阅读模式
JNDI就是为java中命名和目录服务定义的JAVA API,是命名服务的抽象机制。在J2EE中,JNDI的目的是用来查找J2EE服务器的注册资源。只要该对象在命名服务器上注册过,且你知道命名服务器的地址和该对象在命名服务器上注册的JNDI名。这样你就可以在无需知道对象位置的情况下获取和使用对象。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();
}
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-6 23:27 , Processed in 0.395552 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表