天天看點

JNDI介紹及常用應用伺服器的EJB調用

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 伺服器的例子代碼:

JNDI介紹及常用應用伺服器的EJB調用

Properties props  =   new  Properties();

JNDI介紹及常用應用伺服器的EJB調用

props.setProperty( " java.naming.factory.initial " ,  " org.jnp.interfaces.NamingContextFactory " );

JNDI介紹及常用應用伺服器的EJB調用

props.setProperty( " java.naming.provider.url " ,  " localhost:1099 " );

JNDI介紹及常用應用伺服器的EJB調用

InitialContext  =   new  InitialContext(props);

JNDI介紹及常用應用伺服器的EJB調用

HelloWorld helloworld  =  (HelloWorld) ctx.lookup( " HelloWorldBean/remote " );

JNDI介紹及常用應用伺服器的EJB調用

通路 Sun 應用伺服器的例子代碼:

JNDI介紹及常用應用伺服器的EJB調用

Properties props  =   new  Properties();

JNDI介紹及常用應用伺服器的EJB調用

props.setProperty( " java.naming.factory.initial " ,

JNDI介紹及常用應用伺服器的EJB調用

" com.sun.enterprise.naming.SerialInitContextFactory " );

JNDI介紹及常用應用伺服器的EJB調用

props.setProperty( " java.naming.provider.url " ,  " localhost:3700 " );

JNDI介紹及常用應用伺服器的EJB調用

InitialContext  =   new  InitialContext(props);

JNDI介紹及常用應用伺服器的EJB調用

HelloWorld helloworld  =  (HelloWorld) ctx.lookup( " com.foshanshop.ejb3.HelloWorld " );

JNDI介紹及常用應用伺服器的EJB調用

通路 Weblogic10 應用伺服器的例子代碼:

JNDI介紹及常用應用伺服器的EJB調用

Properties props  =   new  Properties();

JNDI介紹及常用應用伺服器的EJB調用

props.setProperty( " java.naming.factory.initial " ,  " weblogic.jndi.WLInitialContextFactory " );

JNDI介紹及常用應用伺服器的EJB調用

props.setProperty( " java.naming.provider.url " ,  " t3://localhost:7001 " );

JNDI介紹及常用應用伺服器的EJB調用

InitialContext  =   new  InitialContext(props);

JNDI介紹及常用應用伺服器的EJB調用

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,就會看到下面的界面

JNDI介紹及常用應用伺服器的EJB調用

在上圖中可以看見 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