`
yangzb
  • 浏览: 3476956 次
  • 性别: 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

    对于session对象的setMaxInactiveInterval(int interval) 如果参数设置为负数.....

    JNDT 有关技术的详细介绍

    JNDI全称 Java Naming and Directory Interface JNDI 是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应...

    springboot-jndi-tomcat.rar

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

    JAVA面试题

    (1)JNDI:Java Naming & Directory Interface,JAVA命名目录服务.主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能. (2)JMS:Java ...

    JNDI的应用

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

    java通用开发框架

    JCDF集中JSP(Java Server Pages),Servlets,EJB(Enterprise JavaBeans)组件,JDBC,JNDI(Java Naming and Directory Interface),标签库(TagLib),XML文档格式等关键技术,采用众多开发模式,为基于J2EE...

    Advanced.Java.Programming.0199455503

    Advanced Java Programming is a textbook specially... Java Naming and Directory Interface Chapter 25. Java Message Service Chapter 26. Introduction to J2EE Chapter 27. Java and CORBA 28. Java Server Faces

    JNDI配置方法详解

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

    数据库连接池连接数据库

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

    The Java EE 6 Tutorial Basic Concepts 4th Edition

    Resources and JNDI Naming 529 DataSource Objects and Connection Pools 530 Resource Injection 531 Resource Adapters and Contracts 534 Metadata Annotations 538 Common Client Interface 540 Further ...

    在jboss上部署web应用

    JNDI (Java Naming and Directory Interface) 它还提供一些高级特性,比如集群、JMX、Web Service。它还整合了IIOP(Internet Inter-ORB Protocol)。 因为JBoss代码遵循LGPL许可,你可以在任何商业应 用中免费使用...

    基于JNDI的应用程序开发

    JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务...

    jta-1.3.1.jar

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

    tomcat配置jndi有全局配置和局部配置

    JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,...

    JBoss Application Server

    Java Naming & Directory Interface (JNDI) 1.2.1 Java Servlet 2.3 & JavaServer Pages (JSP) 1.2 Java Transaction API (JTA) 1.0.1b Java API for XML Processing (JAXP) 1.1 Java Authentication & ...

    怎样实现Java与oracle数据库的连接

     JNDI全名叫做Java命名和目录接口(Java Naming and Directory Interface ,JNDI)是用于从Java应用程序中访问名称和目录服务的一组API,JNDI是J2EE的核心技术之一,JNDI的功能简单说是可以简单的方式去查找某种...

    Java相关技术(详细资料)

     5、JNDI(Java Naming and Directory Interface)提供从Java平台到的统一的无缝的连接。这个接口屏蔽了企业网络所使用的各种命名和目录服务。  6、JMAPI(Java Management API)为异构网络上系统、网络和服务管理的...

    jdk-9.0.1_doc-all 最新版

    Defines the Java Naming and Directory Interface (JNDI) API. java.prefs Defines the Preferences API. java.rmi Defines the Remote Method Invocation (RMI) API. java.scripting Defines the Scripting API...

    Sun权威教程--《J2EE Tutorial中文版》

    ☆ Java Naming and Directory Interface (JNDI,Java名字与目录接口)  ☆ XML  ☆ J2EE Connector Architecture (J2EE连接器架构)  ☆ JavaMail  ☆ JDBC <br> 当你准备创建自己的大型...

Global site tag (gtag.js) - Google Analytics