JNDI(The Java Naming and Directory Interface,Java 命名和目录接口)是一组在Java 应用中访问命名和目录服务的API。为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。借助于JNDI 提供的接口,能够通过名字定位用户、机器、网络、对象服务等。命名服务就像DNS 一样,通过命名服务器提供服务,大部分的J2EE 服务器都含有命名服务器。
目录服务:一种简化的RDBMS系统,通过目录具有的属性保存一些简单的信息。目录服务通过目录服务器实现,比如微软ACTIVE DIRECTORY 等。JNDI 的好处:
(1)包含大量命名和目录服务可以使用相同API 调用访问任何命名或目录服务。
(2)可以同时连接多个命名和目录服务。
(3)允许把名称同JAVA 对象或资源关联起来,不必知道对象或资源的物理ID。
(4)使用通用接口访问不同种类的目录服务。
(5)使得开发人员能够集中使用和实现一种类型的命名或目录服务客户API上。
什么是上下文:由0 或多个绑定构成。比如java/MySql,java为上下文(context),MySql为命名什么是子上下文(subConext),上下文下的上下文。比如MyJNDITree/ejb/helloBean, ejb 为子上下文。JNDI 编程过程因为JNDI是一组接口,所以我们只需根据接口规范编程就可以。要通过JNDI 进行资源访问,我们必须设置初始化上下文的参数,主要是设置JNDI驱动的类名(java.naming.factory.initial)和提供命名服务的URL(java.naming.provider.url)。因为Jndi 的实现产品有很多。所以java.naming.factory.initial 的值因提供JNDI 服务器的不同而不同,java.naming.provider.url的值包括提供命名服务的主机地址和端口号。下面是访问Jboss 服务器的例子代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote")
下面是访问Sun 应用服务器的例子代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial","com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("java.naming.provider.url", "localhost:3700");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("com.foshanshop.ejb3.HelloWorld");
下面是访问Weblogic10 应用服务器的例子代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "weblogic.jndi.WLInitialContextFactory");
props.setProperty("java.naming.provider.url", "t3://localhost:7001");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean#com.foshanshop.ejb3.HelloWorld")
JBOSS 环境下JNDI 树的命名约定:
(1)java:copm这个上下文环境和其子上下文环境仅能被与之相关的特定应用组件访问和使用。
(2)java子上下文环境和绑定的对象只能被Jboss 服务器虚拟机内的应用访问。
(3)其他上下文环境只要实现序列化就可以被远程用户调用。
目录服务:一种简化的RDBMS系统,通过目录具有的属性保存一些简单的信息。目录服务通过目录服务器实现,比如微软ACTIVE DIRECTORY 等。JNDI 的好处:
(1)包含大量命名和目录服务可以使用相同API 调用访问任何命名或目录服务。
(2)可以同时连接多个命名和目录服务。
(3)允许把名称同JAVA 对象或资源关联起来,不必知道对象或资源的物理ID。
(4)使用通用接口访问不同种类的目录服务。
(5)使得开发人员能够集中使用和实现一种类型的命名或目录服务客户API上。
什么是上下文:由0 或多个绑定构成。比如java/MySql,java为上下文(context),MySql为命名什么是子上下文(subConext),上下文下的上下文。比如MyJNDITree/ejb/helloBean, ejb 为子上下文。JNDI 编程过程因为JNDI是一组接口,所以我们只需根据接口规范编程就可以。要通过JNDI 进行资源访问,我们必须设置初始化上下文的参数,主要是设置JNDI驱动的类名(java.naming.factory.initial)和提供命名服务的URL(java.naming.provider.url)。因为Jndi 的实现产品有很多。所以java.naming.factory.initial 的值因提供JNDI 服务器的不同而不同,java.naming.provider.url的值包括提供命名服务的主机地址和端口号。下面是访问Jboss 服务器的例子代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote")
下面是访问Sun 应用服务器的例子代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial","com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("java.naming.provider.url", "localhost:3700");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("com.foshanshop.ejb3.HelloWorld");
下面是访问Weblogic10 应用服务器的例子代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "weblogic.jndi.WLInitialContextFactory");
props.setProperty("java.naming.provider.url", "t3://localhost:7001");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean#com.foshanshop.ejb3.HelloWorld")
JBOSS 环境下JNDI 树的命名约定:
(1)java:copm这个上下文环境和其子上下文环境仅能被与之相关的特定应用组件访问和使用。
(2)java子上下文环境和绑定的对象只能被Jboss 服务器虚拟机内的应用访问。
(3)其他上下文环境只要实现序列化就可以被远程用户调用。