程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 靈活使用EJB的本地和遠程接口(三)

靈活使用EJB的本地和遠程接口(三)

編輯:關於JAVA

JNDI 綁定和源代碼分析

EJB 模塊

從 DualEJBModule01 開始。在 EJB Deployment Descriptor 編輯器面板中,選擇 Beans 選項卡,然後選擇 DualEntity,並且確保 WebSphere Bindings 部分中的 JNDI 名設置為 “ejb/dual/ejb/DualEntityHome” 。保存所有的更改。首先,讓我們研究 DualEJBModule02 項目中 DualSession EJB 的 ejb-jar.xml 的代碼片斷:

...

useLocal
java.lang.Boolean
true
doTrace
java.lang.Boolean
false
ejb/DualEntityRemoteHome
Entity
dual.ejb.DualEntityRemoteHome
dual.ejb.DualEntityRemote
DualEJBModule01.jar#DualEntity
ejb/DualEntityLocalHome
Entity
dual.ejb.DualEntityLocalHome
dual.ejb.DualEntityLocal
DualEJBModule01.jar#DualEntity
   ...

這裡,第一個元素(具有名稱“useLocal”)是用來控制 DualEntity EJB 的本地接口的使用的。第二個條目(具有名稱“doTrace”)准備只用於跟蹤。已實現的跟蹤功能是相當基本的,但是對於我們的目的來說足夠了。 相應的 Java 代碼看起來像是下面這樣的:

public class DualSessionBean implements javax.ejb.SessionBean {
   private javax.ejb.SessionContext mySessionCtx;
   private boolean doTrace;
   private boolean useLocal;
   private DualEntityRemoteHome entityRemoteHome;
   private DualEntityLocalHome entityLocalHome;
   public void setSessionContext(javax.ejb.SessionContext ctx) {
   mySessionCtx = ctx;
   try {
   Context initCtx = new InitialContext();
   Boolean option = null;
   option = (Boolean)initCtx.lookup("java:comp/env/useLocal");
   useLocal = option.booleanValue();
   option = (Boolean)initCtx.lookup("java:comp/env/doTrace");
   doTrace = option.booleanValue();
   if (doTrace)
   System.out.println("DualSessionBean#setSessionContext: useLocal="
   +useLocal);
   Object homeObject = null;
   if (useLocal){
   homeObject = initCtx.lookup("java:comp/env/ejb/DualEntityLocalHome");
   entityLocalHome = (DualEntityLocalHome)homeObject;
   } else {
   homeObject = initCtx.lookup("java:comp/env/ejb/DualEntityRemoteHome");
   entityRemoteHome = (DualEntityRemoteHome)
   javax.rmi.PortableRemoteObject.narrow(homeObject,
   DualEntityRemoteHome.class);
   }
   } catch(NamingException ne){
   // process exception here...
   }
   }
   ...

在 Java 代碼中,EJB 環境變量是作為無狀態會話 Bean 對象的生命周期的類變量存儲的。DualEntity 的本地接口和 Remote Home Interface 是通過引用訪問的;這是首選的方式,並且遵守 EJB 2.0 規范。相對地,ejb-jar.xml 包含描述這些引用的 ejb-ref 和 ejb-local-ref 元素。打開 EJB Deployment Descriptor 編輯器,然後選擇 Beans 選項卡。確保 JNDI 名設置為“ejb/dual/ejb/DualSessionHome”。然後轉到 References 選項卡,確保對 DualEntity 兩個引用指向 JNDI 名“ejb/dual/ejb/DualEntityHome”。必要時可以更改這些值,然後保存所作的更改。

Web 模塊

DualWebModule03project 標准的 J2EE Web 部署描述符包含兩個重要的代碼片段。第一個指定該 Servlet 的初始參數:

...

useLocal
true
doTrace
true
   ...

上面的代碼在意義上類似於前面討論的 EJB 環境參數。注釋掉的 Web 部署描述符部分後面將需要用於分離容器(Separate Containers)拓撲。The Web deployment descriptor section that is commented out will be needed later for the Separate Containers topology. 如果這三個附加的參數沒有注釋掉,在與此體系結構有關的邏輯將通過該 Servlet 的 init() 方法進行調用。(稍後將對此進行更多的介紹。)第二個代碼片段描述了需要用來建立 Servlet 與 EJB 通信的引用:

...

ejb/DualSessionRemoteHome
Session
dual.ejb.DualSessionRemoteHome
dual.ejb.DualSessionRemote
DualEJBModule02.jar#DualSession
ejb/DualSessionLocalHome
Session
dual.ejb.DualSessionLocalHome
dual.ejb.DualSessionLocal
DualEJBModule02.jar#DualSession
   ...

相對地,DualServlet 的源代碼包含該 Servlet 的 init() 方法中的處理邏輯。下面是與處理 EJB 引用有關的代碼片段:

...
   final String JNDI_NAME_LOCAL = "java:comp/env/ejb/DualSessionLocalHome";
   final String JNDI_NAME_REMOTE = "java:comp/env/ejb/DualSessionRemoteHome";
   ...
   if (useLocal) {
   initCtx = new InitialContext();
   homeObject = initCtx.lookup(JNDI_NAME_LOCAL);
   sessionLocalHome = (DualSessionLocalHome) homeObject;
   } else {
   homeObject = initCtx.lookup(JNDI_NAME_REMOTE);
   sessionRemoteHome =
   (DualSessionRemoteHome) PortableRemoteObject.narrow(
   homeObject,
   DualSessionRemoteHome.class);
   }
   ...

(下載的源代碼中的初始參數處理邏輯實際上更復雜,因為它還處理分離容器(Separate Containers)拓撲。)可以在 DualWebModule03 的 Web Deployment Descriptor 編輯器窗格中,首選選中 DualServlet 的所有設置(包括 Initialization 部分在內),然後轉到 References 選項卡,選中 EJB 和 EJB Local 這兩個子選項卡。兩個引用應該指向 WebSphere Bindings 部分中的JNDI 名“ejb/dual/ejb/DualSessionHome”。

項目依賴性總結

現在我們基本上完成了這些模塊,讓我們再次回顧一下所有項目(包括 EAR 在內)的依賴性:

?DualJavaModule00 沒有依賴性。

?DualEJBModule01 沒有依賴性。

?DualEJBModule02 在“Java Build Path”、“Java JAR Dependencies”和“Project References”?設置中必須有 DualJavaModule00、DualEJBModule01 項目。

?DualWebModule03 在“Java Build Path”、“Project References”和“Web Library Projects”設置中必須有 DualJavaModule00、DualEJBModule02 項目。

?DualEARForEJBContainer 在“Project References”設置中必須有 DualJavaModule00、DualEJBModule01、DualEJBModule02;EAR 部署描述符必須有指向 EJB 模塊和 Java 模塊的引用。

?DualEARForAllInOne 必須有指向所有模塊

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved