JNDI的簡單概念&簡單示例

          介紹JNDI的簡單概念&簡單示例。

          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:\temp\myfile.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

          }

          posted on 2007-09-10 10:43 劉錚 閱讀(238) 評論(0)  編輯  收藏 所屬分類: JAVA General

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          留言簿(1)

          文章分類(141)

          文章檔案(147)

          搜索

          最新評論

          主站蜘蛛池模板: 左云县| 宿迁市| 吴堡县| 太康县| 邢台县| 昌都县| 黄龙县| 城市| 信阳市| 江津市| 随州市| 滨州市| 杨浦区| 曲阳县| 兴海县| 乳山市| 大英县| 长岛县| 海淀区| 贞丰县| 五峰| 汉源县| 客服| 铜陵市| 桂林市| 大埔区| 交城县| 庆元县| 陕西省| 调兵山市| 凯里市| 夹江县| 湛江市| 共和县| 麟游县| 大新县| 沾益县| 丽水市| 甘谷县| 资中县| 乌拉特中旗|