jndi学习资料

原创 2007年10月11日 11:27:00

最近学EJB,看到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上:

import java.rmi.Remote;
import java.rmi.registry.LocateRegistry;
import java.util.Date;

import javax.naming.Context;
import javax.naming.InitialContext;


public class JNDITest {
 static class RemoteDate extends Date implements Remote {
  public void print(){
   System.out.println("hello jndi!");
  }
 };
 public static void deploy()
 {
  try{
   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();
   ctx.bind("java:comp/env/systemStartTime", new RemoteDate());
   ctx.close();
  }catch(Exception e)
  {
   e.printStackTrace();
  }
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
  deploy();
  InitialContext ctx = new InitialContext();
  RemoteDate date=(RemoteDate)ctx.lookup("java:comp/env/systemStartTime");
  date.print();
 }catch(Exception e)
 {
  e.printStackTrace();
 }
}
}

注意,我直接把JNDI的相关参数放入了System.properties中,这样,后面的代码如果要查JNDI,直接new InitialContext()就可以了,否则,你又得写Hashtable env = ...

在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型,所以就自己扩展一个。

其实JNDI还有两个Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果访问JNDI需要用户名和口令,这两个也要提供,不过一般用不上。

在后面的代码中查询就简单了:

InitialContext ctx = new InitialContext();
RemoteDate startTime = (RemoteDate ) ctx.lookup("java:comp/env/systemStartTime");

在SUN的JNDI tutorial中的例子用的com.sun.jndi.fscontext.RefFSContextFactory类,但是我死活在JDK 5中没有找到这个类,也就是NoClassDefFoundError,他也不说用的哪个扩展包,我也懒得找了。

WTL for MFC Programmers(3)

ATL-style templatesEven if you can read C++ templates without getting a headache, there is two thing...
  • snaill
  • snaill
  • 2004-04-07 22:12:00
  • 1171

JNDI实例

一、JNDI在Java EE中的应用    JNDI技术是Java EE规范中的一个重要“幕后”角色,它为Java EE容器、组件提供者和应用程序之间提供了桥梁作用:Java EE容器同时扮演JND...
  • xiancaieeee
  • xiancaieeee
  • 2012-08-18 19:17:26
  • 11666

JNDI培训资料(经典)

  • 2012年02月28日 09:55
  • 652KB
  • 下载

jndi学习资料

最近学EJB,看到JNDI,有点不明白其原理,到处查资料,发现所有的中文资料都对JNDI解释一通,配置代码也是copy的,调了半天也没调通,最后到SUN的网站参考了一下他的JNDI tutorial,...
  • wjwwgh
  • wjwwgh
  • 2007-10-11 11:27:00
  • 1407

JNDI 是什么

JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有...
  • anhuidelinger
  • anhuidelinger
  • 2014-05-07 22:27:52
  • 4204

JNDI使用入门

1.在tomcat服务器下面的conf\context.xml文件中配置信息: 如: 这段代码的意思是为tomcat服务器设置了一个名为tjndi,值为hello JNDI,类型为...
  • qq_28893679
  • qq_28893679
  • 2016-09-28 15:23:14
  • 304

JNDI简介&简单示例

JNDI: The Java Naming and Directory Interface   什么是JNDI? The Java Naming and Directory Interface是访问不...
  • asklxf
  • asklxf
  • 2004-07-04 14:11:00
  • 8334

JNDI理解心得

JNDI是一个支持访问java程序中命名和目录服务的API。命名服务的作用是把名字和对象联系起来,并提供一种通过对象名访问对象的方式。命名系统的对象覆盖了文件系统中的文件和DNS记录中的名字,以及EJ...
  • nice_guy
  • nice_guy
  • 2006-08-02 11:14:00
  • 781

在部署文件中设定了jdbc引用名jdbc/sample,jndi名字为jdbc/sample

在部署文件中设定了jdbc引用名jdbc/sample,jndi名字为jdbc/sample 如果采用如下代码: javax.sql.DataSource ds = (javax.sql.DataSo...
  • zwhfyy
  • zwhfyy
  • 2007-08-29 08:59:00
  • 2697

JNDI详细配置及使用

JNDI在项目中使用很多,下面介绍一下JNDI的配置和使用
  • Crazyer0214
  • Crazyer0214
  • 2017-05-09 10:54:47
  • 1106
收藏助手
不良信息举报
您举报文章:jndi学习资料
举报原因:
原因补充:

(最多只允许输入30个字)