JNDI(Java Naming Directory Interface)

命名服務(naming service)
命名服務是計算機系統中的一個基本功能。命名服務是將名字和計算機中的一個對象相關聯,通過名字可以方便地找到對應的對象。例如,計算機中的文件系統就包含了一個命名服務,你可以通過文件名找到對應的文件對象。
目錄服務(directory service)
目錄服務是命名服務的延伸,目錄服務不只保存對象和對象名的匹配,而且保存這個對象的各種屬性,你可以對這些屬性進行查詢、修改、增加、刪除操作。


JNDI(Java Naming Directory Interface)
JNDI是一些標準API接口,java程序通過這些API可以訪問命名目錄服務。JNDI的定義不依賴於任何獨立的命名目錄服務器,對於各種命名目錄服務器,都可通過統一的JNDI接口調用。JNDI結構如下:





JNDI結構包括兩組API:JNDI API(Application Programming Interface)和JNDI SPI(Service Provider Interface)。java應用程序通過JNDI API訪問各種命名目錄服務。JNDI SPI使得各種命名目錄服務透明地加入到JNDI結構中,如上圖中的LDAP、DNS、NIS等服務通過JNDI SPI加入到JNDI結構中,從而使java應用程序能夠通過JNDI API訪問這些服務。


JNDI Context
Context是一系列命名到對象綁定的集合,Context提供以下主要接口訪問命名服務:


bind(Name name, Object obj) 建立一個命名到一個對象的匹配關係,也叫綁定
lookup(String name) 通過命名查找其對應的對象
rebind(Name name, Object obj) 重新綁定一個命名到對象,覆蓋原來的綁定
unbind(Name name) 解除這個命名到其匹配對象的綁定關係
... ...


Apusic JNDI 應用舉例
Apusic Application Server包含一個完全遵循JNDI標準的命名服務器,下面我們舉例說明如何通過JNDI接口找到你需要調用的EJB Home接口。


Context ctx = null;
try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.apusic.jndi.InitialContextFactory");
env.put(Context.PROVIDER_URL, "rmi://localhost:6888");
env.put(Context.SECURITY_PRINCIPAL, null);
env.put(Context.SECURITY_CREDENTIALS, null);
ctx = new InitialContext(env);
} catch (Exception e) {
System.err.println("Cannot get initial context: " + e);
System.exit(1);
}


AccountHome home = null;
try {
home = (AccountHome) ctx.lookup("CMAccountHome");
} catch (Exception e) {
System.err.println("Cannot lookup CMAccountHome" + e);
System.exit(1);
}


首先,通過Hashtable env傳遞JNDI調用參數,取得JNDI Context ctx,各參數說明如下:
Context.INITIAL_CONTEXT_FACTORY: 指定jndi環境的工廠,在Apusic中必須爲 com.apusic.jndi.InitialContextFactory
Context.PROVIDER_URL: 指定命名服務提供者的URL,格式爲:rmi://localhost:6888
Context.SECURITY_PRINCIPAL: 指定用戶身份,null爲“匿名用戶”
Context.SECURITY_CREDENTIALS: 指定用戶密碼,同上




然後,通過JNDI Context ctx 的lookup方法找到"CMAccountHome"綁定的CMAccountBean的Home接口。 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章