JNDI及其應用(Mark)

JNDI是Java Naming and Directory Interface(JAVA命名和目錄接口)的英文簡寫,它是爲JAVA應用程序提供命名和目錄訪問服務的API(Application Programing Interface,應用程序編程接口)。

1.命名的概念與應用

JNDI中的命名(Naming),就是將Java對象以某個名稱的形式綁定(binding)到一個容器環境(Context)中,以後調用容器環境(Context)的查找(lookup)方法又可以查找出某個名稱所綁定的Java對象。讀者也許會感到奇怪:自己創建一個Java對象,將其綁定到JNDI容器環境中後又查詢出來,這有什麼意思?在真實的項目應用中,通常是由系統程序或框加程序先將資源對象綁定到JNDI環境中,以後在該系統或框架中運行的模塊程序就可以從JNDI環境中查找這些資源對象了。例如,Tomcat服務器在啓動時可以創建一個連接到某種數據庫系統的數據源(DataSource)對象,並將該數據源(DataSource)對象綁定到JNDI環境中,以後在這個Tomcat服務器中運行的Servlet和JSP程序就可以從JNDI環境中查詢出這個數據源(DataSource)對象進行使用,而不用關心數據源(DataSource)對象是如何創建出來的,這種方式極大地增強了系統的可維護性,當數據庫系統的連接參數發生變更時,這只是Tomcat系統管理員一個人要關心的事情,而與所有的應用程序開發人員無關。
容器環境(Context)本身也是一個Java對象,它也可以通過一個名稱綁定到另一個容器環境(Context)中。將一個Context對象綁定到另外一個Context對象中,這就形成了一種父子級聯關係,多個Context對象最終可以級聯成一種樹狀結構,樹中的每個Context對象中都可以綁定若干個Java對象,如圖所示。
在這裏插入圖片描述
圖中的每個方框分別代表一個Context對象,它們綁定的名稱分別爲a、b、c、d、e,b和c是a的子Context,d是b的子Context,e又是d的子Context。圖9.x中的各個方框內的每個小橢圓分別代表一個Java對象,它們也都有一個綁定的名稱,這些綁定名稱分別爲dog、pig、sheet等,在同一個Context不能綁定兩個相同名稱的Java對象,在不同的Context中可以出現同名的綁定對象。可見,Context樹的級聯結構與文件系統中的目錄結構非常類似,Context與其中綁定的Java對象的關係也非常類似於文件系統中的目錄與文件的關係。從圖6.10中可以看到,要想得到Context樹中的一個Java對象,首先要得到其所在的Context對象,只要得到了一個Context對象,就可以調用它的查詢(lookup)方法來獲得其中綁定的Java對象。另外,調用某個Context對象的lookup方法也可以獲得Context樹中的任意一個Context對象,這只需要在lookup方法中指定相應的Context路徑即可。在JNDI中不存在着“根”Context的概念,也就是說,執行JNDI操作不是從一個“根”Context對象開始,而是可以從Context樹中的任意一個Context開始。無論如何,程序必須獲得一個作爲操作入口的Context對象後才能執行各種JNDI命名操作,爲此,JNDI API中提供了一個InitialContext類來創建用作JNDI命名操作的入口Context對象。Context是一個接口,Context對象實際上是Context的某個實現類的實例對象,選擇這個具體的Context實現類並創建其實例對象的過程是由一個Context工廠類來完成的,這個工廠類的類名可以通過JNDI的環境屬性java.naming.factory.initial指定,也可以根據Context的操作方法的url參數的Schema來選擇。

2.目錄的概念與應用

JNDI中的目錄(Directory)與文件系統中的目錄概念有很大的不同,JNDI中的目錄(Directory)是指將一個對象的所有屬性信息保存到一個容器環境中。JNDI的目錄(Directory)原理與JNDI的命名(Naming)原理非常相似,主要的區別在於目錄容器環境中保存的是對象的屬性信息,而不是對象本身,所以,目錄提供的是對屬性的各種操作。事實上,JNDI的目錄(Directory)與命名(Naming)往往是結合在一起使用的,JNDI API中提供的代表目錄容器環境的類爲DirContext,DirContext是Context的子類,顯然它除了能完成目錄相關的操作外,也能完成所有的命名(Naming)操作。DirContext是對Context的擴展,它在Context的基礎上增加了對目錄屬性的操作功能,可以在其中綁定對象的屬性信息和查找對象的屬性信息。JNDI中的目錄(Directory)的結構示意圖如圖6.11所示。
在這裏插入圖片描述
圖中的每個最外層的方框分別代表一個DirContext對象,它們綁定的名稱分別爲a、b,b是a的子DirContext。圖6.11中的各個最外層的方框內的每個小橢圓分別代表一個Java對象,各個裏層的方框分別代表一個對象的屬性。從名稱爲a的DirContext中的內容可以看到,一個DirContext容器環境中即可以綁定對象自身,也可以綁定對象的屬性信息,綁定的對象和綁定的屬性是完全獨立的兩個事物,即使它們的綁定名稱相同,它們的操作也是完全獨立的。另外,一個屬性可以有多個屬性值,例如,dog對象的category屬性就設置了兩個屬性值:meat和pet。從名稱爲b的DirContext中的內容可以看到,一個DirContext容器環境中也可以只綁定對象的屬性信息,而不綁定任何對象自身。與Context的操作原理類似,JNDI API中提供了一個InitialDirContext類來創建用作JNDI命名與目錄屬性操作的入口DirContext對象。

3.JNDI 應用例子

將某一個資源,以配置文件( tomct / config / context.xml )形式寫入

1. 配置:context.xml

<Context>

	<Environment name="jndiName" type="java.lang.String" value="jndiValue"/>

</Context>

2.在jsp中通過 context 對象使用

<%
     Context cxt = new InitialContext();
     String jndiText = (String)cxt.lookup("java:comp/env/jndiName");
     out.println(jndiText);
%>

這樣就成功使用JNDI了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章