`
yangzb
  • 浏览: 3500426 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JNDI: The Java Naming and Directory Interface

阅读更多

什么是 JNDI

The Java Naming and Directory Interface 是访问不同名字和目录服务的统一 API 接口。

不同的服务使用不同的名字格式。

Java 程序需要以相同的格式访问数据库,文件,目录,对象和网络。

 

JNID 有两部分接口:应用程序接口和提供服务的接口。在应用程序中使用 API 来访问名字或目录服务,在一个新的服务中使用 SPI 来提供服务。

 

JNDI 结构

名字服务( Naming Services

名字服务提供一种方法,映射标识符到实体或对象。

你需要知道的几条基本条款:

绑定: 绑定是将一个不可分割的名字( " 原子 " 名字)与一个对象联系起来。像 DNS ,我们用名字 www.yahoo.com IP 地址 216.32.74.53 联系起来,一个文件对象用文件名 afile.txt 联系起来。

名字空间; 名字空间包含一组名字,但名字空间内每个名字是唯一的。一个文件目录就是一个简单的名字空间,如目录 C:temp ,在这个目录下,不能有两个相同名字的文件,但是,不同目录下的两个文件可能有相同的名字。

复合名字: 复合名字是用名字空间构成的唯一名字,有一个或多个 " 原子 " 名字构成,取决于所在的名字空间。文件路径就是一个复合名字,比如我们用 C:tempmyfile.txt ,我们可以看到,这个名字由根目录名( C: ),临时目录名( temp )和一个文件名( myfile.txt )构成,这 3 个名字复合起来表示一个唯一的名字。

组合名字: 组合名字能跨越多个名字空间。一个 URL 就是一个组合名字,如果你看见 http://www.npu.edu/index.htm ,你使用 http 服务连接到服务器,然后使用另一个名字空间 /index.htm 来访问一个文件。

 

目录服务

目录服务提供一组分成等级的目录对象,具有可搜索的能力。

在目录服务中存储的对象可以是任何能用一组属性描述的对象,每个对象都可通过一组属性来描述该对象的能力。例如,一个 Person 对象可能有 height hair color age sex 等属性。目录服务还可提供根据要求来搜索的能力,如我们可以使用 Person age 属性,搜索 20-25 岁间的 Person 对象,目录服务将返回符合条件的 Persion 对象。这通常被称作基于内容的搜索。

 

 

在客户端使用 JNDI

u       创建一个 java.util.Hashtable 或者 java.util.Properties 的实例。

u       添加变量到 Hashtable Properties 对象:

naming server 提供的 JNDI class 类名。

包含 aming server 位置的 URL

安全信任书。

u       通过 Hashtable Properites jndi 属性文件创建一个 InitialContext 对象。

 

示例:

import java.util.*;

import javax.naming.*;

env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");

env.put(Context.PROVIDER_URL,"t3://localhost:7001");

InitialContext ctx = new InitialContext(env);

 

环境变量

相应的常量

说明

java.naming.factory.initial

Context.INITIAL_CONTEXT_FACTORY

Context Factory

类名,由服务提供商给出。

java.naming.provider.url

Context.PROVIDE_URL

初始化地址。

java.naming.security.

principal

Context.SECURITY_PRINCIPAL

服务使用者信息。

java.naming.security.

credentials

Context.SECURITY_CREDENTIAL

口令。

 

更多的配置示例:

Hashtable env = new Hashtable();

env.put (Context.INITIAL_CONTEXT_FACTORY,

"weblogic.jndi.WLInitialContextFactory");

env.put(Context.PROVIDER_URL, "t3://localhost:7001");

env.put(Context.SECURITY_PRINCIPAL, "system");

env.put(Context.SECURITY_CREDENTIALS, "password here");

 

Properties env = new Properties();

env.setProperties ("java.naming.factory.initial",

"weblogic.jndi.WLInitialContextFactory");

env.setProperties("java.naming.provider.url" , "t3://localhost:7001");

env.setProperties("java.naming.security.principal" , "tommy");

env.setProperties("java.naming.security.credentials" ,"password here");

 

创建 InitialContext

Class Name: javax.naming.InitialContext

Interfaces that it implements: javax.naming.Context

Constructors:

    public InitialContext();

    public InitialContext(Hashtable configuration);

    public InitialContext(Properties configuration);

 

以上所有方法都可能抛出 NamingException

 

一个 Binding 示例:

public static InitialContext getInitialContext() throws NamingException {

    Hashtable env = new Hashtable();

    env.put(Context.INITIAL_CONTEXT_FACTORY,

           "weblogic.jndi.WLInitialContextFactory");

    env.put(Context.PROVIDER_URL,"t3://localhost:7001");

    InitialContext context = new InitialContext(env);

    return context;

}

//Obtain the initial context

InitialContext initialContext = getInitialContext();

//Create a Bank object.

Bank myBank = new Bank();

//Bind the object into the JNDI tree.

initialContext.rebind("theBank",myBank);

 

一个 Lookup 示例:

public static InitialContext getInitialContext() throws NamingException {

    Hashtable env = new Hashtable();

    env.put(Context.INITIAL_CONTEXT_FACTORY,

           "weblogic.jndi.WLInitialContextFactory");

    env.put(Context.PROVIDER_URL,"t3://localhost:7001");

    InitialContext context = new InitialContext(env);

    return context;

}

//Obtain the initial context

InitialContext initialContext = getInitialContext();

//Lookup an existing Bank object.

Bank myBank = (Bank) initialContext.lookup("theBank");

 

可能发生的 NamingException

AuthenticationException

CommunicationException

InvalidNameException

NameNotFoundException

NoInitialContextException

 

枚举所有名字对象:

NamingEnumeration Declaration:

public interface NamingEnumeration extends Enumeration {

    public boolean hashMore() throws NamingException;

    public Object next() throws NamingException;

    public void close() throws NamingException; //jndi 1.2

}

 

try {

   

    NamingEnumeration enum = ctx.list("");

    while (enum.hasMore()) {

        NameClassPair ncp = (NameClassPair) enum.next();

        System.out.println("JNDI name is:" + ncp.getName());

    }

}

catch (NamingException e) {…}

 

最后的示例:

import java.util.*;

import javax.naming.*;

import javax.naming.directory.*;

import java.io.*;

public class ListAll {

    public static void main(java.lang.String[] args) {

        Hashtable env = new Hashtable();

        env.put(Context.INITIAL_CONTEXT_FACTORY,

            "weblogic.jndi.WLInitialContextFactory");

        env.put(Context.PROVIDER_URL, "t3://localhost:7001");

        try {

            InitialContext ctx = new InitialContext(env);

            NamingEnumeration enum = ctx.listBindings("");

            while(enum.hasMore()) {

                Binding binding = (Binding) enum.next();

                Object obj = (Object) binding.getObject();

                System.out.println(obj);

            }

        } catch (NamingException e) {

        System.out.println(e);

        }

    } // end main

} // end List

-------------------------------------------------------------------------

用hashtable:

Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL, "t3://localhost:7001");
ht.put(Context.SECURITY_PRINCIPAL,"guest");
ht.put(Context.SECURITY_CREDENTIALS,"guestpassword");

Context ctx = new InitialContext(ht);
Object obj = ctx.lookup("Name_Of_Object");
-----------------------------------------------------------------------

ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL, "t3://localhost:7001");
/* 如果要验证(一般不需要):
ht.put(Context.SECURITY_PRINCIPAL,"用户名");
ht.put(Context.SECURITY_CREDENTIALS,"口令");
*/

注意:
InitialContextFactory是接口,不同厂商提供不同的实现类,
weblogic.jndi.WLInitialContextFactory是weblogic的实现类,改成sun的就可以了,写类的全名,你需要查sun app server的文档看看jndi怎么写(如果有FAQ多半可以搜索jndi找到这个设置)

URL是一个查找服务器的格式,weblogic的格式为
t3://ip-address:7001/
sun app server肯定不一样,看看文档就知道格式怎么写了
当你指定URL后,特定厂商的InitialContextFactory会识别这个URL,所以这个URL是厂商自己规定的,jndi并没有规定

-------------------------------------------------------------------------

这是JBOSS的
Hashtable env=new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL,"192.168.0.81:2198");
env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");

分享到:
评论

相关推荐

    JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口

    JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI SPI的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,...

    JSP单元测试题JNDI JAVA Naming and Directory interface

    【JSP单元测试题JNDI -JAVA Naming and Directory interface】 JNDI(JAVA Naming and Directory interface)是Java平台提供的一套接口和API,用于访问各种命名和目录服务,如DNS、LDAP等。通过JNDI,开发者可以...

    Java分布式处理技术RMI,JNDI,

    JNDI(Java Naming and Directory Interface)是 Java 平台上的一个目录服务,它提供了一个统一的接口来访问不同的目录服务。JNDI 可以用来注册和查找分布式对象,实现对象之间的交互。 JNDI 的用途包括: 1. 对象...

    springboot-jndi-tomcat.rar

    JNDI全名为Java Naming and Directory Interface.JNDI主要提供应用程序所需要资源上命名与目录服务。在Java EE环境中,JNDI扮演了一个很重要的角色,它提供了一个接口让用户在不知道资源所在位置的情形下,取得该...

    JNDI访问LDAP

    **JNDI(Java Naming and Directory Interface)**是Java平台中的一个标准API,它允许Java应用程序访问各种命名和目录服务,如LDAP(Lightweight Directory Access Protocol)。在Java应用中,JNDI通常用于管理和...

    com.sun.jndi.ldap.jar

    是一个重要的库文件,它包含了Java Naming and Directory Interface (JNDI) 的 LDAP(Lightweight Directory Access Protocol)实现。JNDI是一个接口,提供了一种标准的方式来访问命名和目录服务,而LDAP则是一种...

    java jndi的使用

    Java JNDI(Java Naming and Directory Interface)是Java平台中用于访问命名和目录服务的一组API。它允许Java开发者在应用程序中查找和绑定资源,如数据源、EJB(Enterprise JavaBeans)、邮件服务器等。JNDI的核心...

    JNDI的应用

    JNDI是Java Naming and Directory Interface(JAVA命名和目录接口)的英文简写,它是为JAVA应用程序提供命名和目录访问服务的API(Application Programing Interface,应用程序编程接口)。

    jndi-1.2.1.jar.zip

    《JNDI 1.2.1:Java Naming and Directory Interface 的核心库解析》 在Java编程领域,JNDI(Java Naming and Directory Interface)是一个关键的API,它为Java应用程序提供了一种标准的方式来访问命名和目录服务。...

    jndi示例(java)

    Java Naming and Directory Interface (JNDI) 是Java平台中用于访问命名和目录服务的API,它为各种服务提供了一个统一的接口,使得开发者可以轻松地查找、绑定和管理分布式系统中的资源。JNDI通常与Java应用程序...

    com.sun.jndi.providerutil.jar

    是一个至关重要的组件,它属于Sun Microsystems公司的JNDI(Java Naming and Directory Interface)框架的一部分。JNDI是Java平台提供的一种标准服务接口,用于访问命名和目录服务,它允许应用程序查找、存储和管理...

    精通Java EE:精通Java EE 整合应用案例\源代码第五章

    5. **JNDI(Java Naming and Directory Interface)**:JNDI在Java EE中用于查找和绑定资源,如数据源或EJB。开发者会学习如何使用JNDI查找服务并进行依赖注入。 6. **JTA(Java Transaction API)**:在多组件协作...

    JNDI的包 java命名与服务

    Java Naming and Directory Interface (JNDI) 是Java平台中用于访问和管理命名和目录服务的一组接口和类。它提供了一种标准的方式来查找和访问多种类型的服务,如对象注册表、目录服务、数据库连接池等。JNDI的核心...

    java 采用JNDI访问数据库(三种方法)

    Java 通过JNDI(Java Naming and Directory Interface)访问数据库是一种常见的做法,它提供了一种标准的方法来查找和管理资源,如数据源、EJB、邮件服务器等。JNDI在企业级应用中广泛使用,因为它允许应用程序与...

    providerutil.jar dns.jar jndi.jar

    在Java中,"provider"通常指的是实现特定接口或标准的软件组件,这里可能是对JNDI(Java Naming and Directory Interface)服务提供者的一种支持或辅助工具。`providerutil.jar` 可能包含了帮助开发者集成和管理JNDI...

    java_ee_api_英文版.zip

    API涵盖了诸如Servlet、JSP(JavaServer Pages)、EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JPA(Java Persistence API)、JNDI(Java Naming and Directory Interface)等核心组件和技术。...

    基于Java的源码-EJB中JNDI的使用源码例子.zip

    JNDI(Java Naming and Directory Interface)是Java中的一种服务接口,它为应用程序提供了一个标准的方式来查找和绑定分布式环境中的对象。在这个基于Java的源码例子中,我们将深入探讨如何在EJB中使用JNDI进行服务...

    JNDI Java操作示例

    JNDI(Java Naming and Directory Interface)是Java平台中用于访问命名和目录服务的API。它提供了一种查找和定位应用程序所需的资源(如数据库连接、消息队列、EJBs等)的方式。在本文中,我们将通过一个具体的示例...

Global site tag (gtag.js) - Google Analytics