命名服務(wù)(naming service)
        命名服務(wù)是計(jì)算機(jī)系統(tǒng)中的一個(gè)基本功能。命名服務(wù)是將名字和計(jì)算機(jī)中的一個(gè)對(duì)象相關(guān)聯(lián),通過(guò)名字可以方便地找到對(duì)應(yīng)的對(duì)象。例如,計(jì)算機(jī)中的文件系統(tǒng)就包含了一個(gè)命名服務(wù),你可以通過(guò)文件名找到對(duì)應(yīng)的文件對(duì)象。
目錄服務(wù)(directory service) 
        目錄服務(wù)是命名服務(wù)的延伸,目錄服務(wù)不只保存對(duì)象和對(duì)象名的匹配,而且保存這個(gè)對(duì)象的各種屬性,你可以對(duì)這些屬性進(jìn)行查詢、修改、增加、刪除操作。
JNDI(Java Naming Directory Interface)
        JNDI是一些標(biāo)準(zhǔn)API接口,Java程序通過(guò)這些API可以訪問(wèn)命名目錄服務(wù)。JNDI的定義不依賴于任何獨(dú)立的命名目錄服務(wù)器,對(duì)于各種命名目錄服務(wù)器,都可通過(guò)統(tǒng)一的JNDI接口調(diào)用。
       JNDI結(jié)構(gòu)包括兩組API:JNDI API(Application Programming Interface)和JNDI SPI(Service Provider Interface)。Java應(yīng)用程序通過(guò)JNDI API訪問(wèn)各種命名目錄服務(wù)。JNDI SPI使得各種命名目錄服務(wù)透明地加入到JNDI結(jié)構(gòu)中,如上圖中的LDAP、DNS、NIS等服務(wù)通過(guò)JNDI SPI加入到JNDI結(jié)構(gòu)中,從而使Java應(yīng)用程序能夠通過(guò)JNDI API訪問(wèn)這些服務(wù)。

JNDI Context    
          Context是一系列命名到對(duì)象綁定的集合,Context提供以下主要接口訪問(wèn)命名服務(wù),JNDI中的一組綁定作為上下文來(lái)引用。每個(gè)上下文暴露的一組操作是一致的。例如,每個(gè)上下文提供了一個(gè)查找操作,返回指定名字的相應(yīng)對(duì)象。每個(gè)上下文都提供了綁定和撤除綁定名字到某個(gè)對(duì)象的操作。JNDI使用通用的方式來(lái)暴露命名空間,即使用分層上下文以及使用相同命名語(yǔ)法的子上下文。  

  bind(Name name, Object obj) 建立一個(gè)命名到一個(gè)對(duì)象的匹配關(guān)系,也叫綁定
  lookup(String name) 通過(guò)命名查找其對(duì)應(yīng)的對(duì)象
  rebind(Name name, Object obj) 重新綁定一個(gè)命名到對(duì)象,覆蓋原來(lái)的綁定
  unbind(Name name) 解除這個(gè)命名到其匹配對(duì)象的綁定關(guān)系

在客戶端使用JNDI

u       創(chuàng)建一個(gè)java.util.Hashtable或者java.util.Properties的實(shí)例。

u       添加變量到HashtableProperties對(duì)象:

naming server提供的JNDI class類(lèi)名。

包含aming server位置的URL

安全信任書(shū)。

u       通過(guò)HashtableProperitesjndi屬性文件創(chuàng)建一個(gè)InitialContext對(duì)象。

示例:

 

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);

 

環(huán)境變量

相應(yīng)的常量

說(shuō)明

java.naming.factory.initial

Context.INITIAL_CONTEXT_FACTORY

Context Factory

類(lèi)名,由服務(wù)提供商給出。

java.naming.provider.url

Context.PROVIDE_URL

初始化地址。

java.naming.security.

principal

Context.SECURITY_PRINCIPAL

服務(wù)使用者信息。

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");


創(chuàng)建InitialContext

Class Name: javax.naming.InitialContext

Interfaces that it implements: javax.naming.Context

Constructors:

 

    public InitialContext();

    
public InitialContext(Hashtable configuration);

    
public InitialContext(Properties configuration);

一個(gè)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);



一個(gè)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");

 


枚舉所有名字對(duì)象:
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