JNDI (The Java Naming and Directory Interface,Java 命名和目錄介面) 是一組在Java 應用中訪問命名和目錄服務的API。為開發人員提供了尋找和訪問各種命名和目錄服務的通用、統一的方式。藉助於JNDI 提供的介面,能夠通過名字定位使用者、機器、網路、物件服務等。 命名服務:就像DNS一樣,通過命名伺服器提供服務,大部分的J2EE 伺服器都含有命名伺服器。 目錄服務:一種簡化的RDBMS 系統,通過目錄具有的屬性儲存一些簡單的資訊。目錄服務通過目錄伺服器實現,比如微軟ACTIVE DIRECTORY 等。
JNDI 的好處
:(1)包含大量命名和目錄服務,可以使用相同API 呼叫訪問任何命名或目錄服務。(2)可以同時串連多個命名和目錄服務。(3)允許把名稱同JAVA 對象或資源關聯起來,不必知道對象或資源的物理ID。(4)使用通用介面訪問不同種類的目錄服務(5)使得開發人員能夠集中使用和實現一種類型的命名或目錄服務客戶API 上。 上下文:由0 或多個綁定構成。比如java/MySql,java 為上下文(context),MySql 為命名 子上下文(subConext):上下文下的上下文。比如MyJNDITree/ejb/helloBean,ejb 為子上下文。 因為JNDI 是一組介面,所以我們只需根據介面規範編程就可以。
要通過
JNDI
進行資源訪問,我們必須設定初始化內容相關的參數,
主要是設定
JNDI
驅動的類名
(java.naming.factory.initial)
和提供命名服務的
URL (java.naming.provider.url)。 因為Jndi 的實現產品有很多。所以java.naming.factory.initial 的值因提供JNDI 伺服器的不同而不同,java.naming.provider.url 的值包括提供命名服務的主機地址和連接埠號碼。 訪問Jboss 伺服器的例子代碼:Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");
訪問Sun 應用伺服器的例子代碼:Properties props = new Properties();
props.setProperty("java.naming.factory.initial",
"com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("java.naming.provider.url", "localhost:3700");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("com.foshanshop.ejb3.HelloWorld");
訪問Weblogic10 應用伺服器的例子代碼:Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "weblogic.jndi.WLInitialContextFactory");
props.setProperty("java.naming.provider.url", "t3://localhost:7001");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean#com.foshanshop.ejb3.HelloWorld");
JBOSS 環境下
JNDI 樹的命名規範:(1)java:copm 這個上下文環境和其子上下文環境僅能被與之相關的特定應用組件訪問和使用(2)java: 子上下文環境和綁定的對象只能被Jboss 伺服器虛擬機器內的應用訪問(3)其他上下文環境 只要實現序列化就可以被遠端使用者調用。
當你把EJB發布到JBOSS後,你就可以
在
jboss
的管理平台查看她們的
JNDI
名,輸入下面URL http://localhost:8080/jmx-console/,點擊“service=JNDIView” link,在出現的page裡找到“List of MBean operations:”欄的“list()”方法,click “Invoke”button,就會看到下面的介面在中可以看見HelloWorld 會話Bean 的JNDI路徑,JNDI 路徑名的組成規則是“上層名稱/下層名稱,每層之間以”/”分隔。HelloWorld 會話Bean 的JNDI路徑名是:HelloWorldBean/remote 下面要重點說明一下
Jboss EJB JNDI
名稱預設的命名規則,命名規則如下:1> 如果EJB 打包進尾碼為*.ear 的J2EE 發布檔案,預設的JNDI 路徑名稱是訪問本地介面:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local訪問遠程介面:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote例:EJB HelloWorld 打包進名為 HelloWorld.ear 的J2EE 應用,訪問她遠程介面的JNDI 名是:HelloWorld/HelloWorldBean/remote 2> 如果EJB 應用打包成尾碼為*.jar 的發布檔案, 預設的JNDI 路徑名稱是訪問本地介面:EJB-CLASS-NAME/local訪問遠程介面:EJB-CLASS-NAME/remote例: HelloWorld 應用打包成HelloWorld.jar 檔案,訪問她遠程介面的JNDI 名稱是:HelloWorldBean/remote 注意:EJB-CLASS-NAME 是不帶包名的,如com.foshanshop.ejb3.impl.HelloWorldBean 只需取HelloWorldBean。 目前網上很多教材擷取JNDI 路徑名的方式不適用在jboss 下,如:HelloWorld helloworld = (HelloWorld) ctx.lookup(HelloWorld.class.getName());這種方式適用於Sun Application Server 及glassfish