JBuilder9+Weblogic7實戰篇Entity Bean運用(四) (轉)

worldblog發表於2007-08-17
JBuilder9+Weblogic7實戰篇Entity Bean運用(四) (轉)[@more@]

JBuilder9+LOGIC7實戰篇:namespace prefix = o ns = "urn:schemas--com::office" />

ENTITY BEAN的運用(四)

  作者:黃 凱   

E_:

七、透過Session Bean訪問Entity Bean

  在前面給出的Entity Bean例項都是透過客戶端直接訪問Entity Bean(透過Entity Bean的介面),在實際的應用開發中通常不採用這種做法,經常採用的是這樣一種做法:建立一個Session Bean,該Session Bean中封裝對Entity Bean的訪問。而且訪問時透過Entity Bean的本地介面進行以提高,客戶端不與Entity Bean直接打交道,客戶端透過Session Bean完成對Entity Bean的操作。這中做法其實是遵循了一種設計:Facade設計模式。

7.1 引用

  在一個EJB中訪問其他EJB,例如Session Bean facade要訪問Entity Bean student,可以直接在facade中用“硬編碼”實現,即在facade中透過Student的JNDI名字找到Home,然後獲得對外介面(Remote介面或Local介面),完成方法。這種方式的缺點是顯而易見的,因為這兩個EJB被緊緊綁在一起,例如student有什麼改動,例如改名字,那麼facade就必須改程式碼(這也是為什麼在《Entity Bean的運用(二)》中需要重新建立一個TestClient的原因)。

  採用這樣一種方式解決此問題:在facade的部署描述中定義一個EJB引用,該項描述了對另一個EJB的引用,在facade的程式碼中只使用EJB引用的名字,EJB引用的名字是不變的,但是它所引用的內容是可變的,參見以下程式碼:

 

  facade

 

 

  student

  Student

 

 

  facade

 

  建立了EJB引用後,facade可以透過此引用獲得要訪問的EJB student的介面,參見以下程式碼:

  Context context = new InitialContext();

  ref = context.lookup("java:/comp/env/student");

  studentHome = (StudentHome)ref;

  在使用EJB引用時,作為lookup方法引數的完整的JNDI名字是“java:/comp/env/”+ EJB引用名,例如名為student的EJB引用,對應完整的JNDI名字是“java:/comp/env/student”。

7.2 EJB引用例項

7.2.1開啟《Entity Bean的運用(一)》中建立的comSample工程,新建一個名為facade的Session Bean(可參看《SESSION BEAN篇》)。修改該Bean的如下資訊:

  ★ Bean name: facade

★ Interface: remote

★ Session type: Stateless

7.2.2 在文件視窗“EJB Designer”中用滑鼠右鍵單擊facade,選擇Open DD Editor選單項。

7.2.3 在“DD Editor”介面中單擊下方的EJB Local References選項卡。

7.2.4 在“EJB Local References”的設定介面中,單擊Add按鈕,然後在Name項後輸入EJB引用的名字student,選中IsLink核取方塊(如果要引用的EJB是位於同一Jbuilder工程中則選種此項),Link項選擇Student(要引用的EJB),其他項採用系統自動的設定即可。

7.2.5 在facade中增加一個方法getStuInfo(),該方法的功能是找到與引數(代表stuid)對應的Entity Bean Student,然後呼叫Student的方法getStuid()getStuname()。該方法的屬性如下:

  ★ Method name: getStuInfo

Return type: String

Input parameters: String stuid

Interface: remote

7.2.6 在facade的Bean類中加入訪問Student的程式碼。要訪問Student,首先要獲得Student的Home物件,這可以透過EJB引用獲得。獲得Home物件這部分程式碼要放在facadeejbCreate()方法和ejbActivate()方法中(即只要facade的例項一被建立或啟用,就會獲得Student的Home物件)。獲得Student的Home物件後,在getStuInfo()方法中透過Home物件得到Student的本地介面(Local Interface),然後透過本地介面呼叫Student的方法。用以下程式碼替換facadeBean.java的程式碼:(灰色程式碼部分為手工新增的)

package cmpsample;

import java.math.*;

import javax.ejb.*;

import javax.naming.*;

public class facadeBean

  implements SessionBean

{

   SessionContext sessionContext;

  public Student student = null;

  private StudentHome studentHome = null;

  public void ejbCreate() throws CreateException

  {

  try

  {

  Context context = new InitialContext();

  Object ref = context.lookup("java:/comp/env/student");

  studentHome = (StudentHome) ref;

  }

  catch (Exception e)

  {

  e.printStackTrace();

  }

  }

  public void ejbRemove()

  {

  /**@todo Complete this method*/

  }

  public void ejbActivate()

  {

  try

  {

  Context context = new InitialContext();

  Object ref = context.lookup("java:/comp/env/student");

  studentHome = (StudentHome) ref;

  }

   catch (Exception e)

  {

  e.printStackTrace();

  }

  }

  public void ejbPassivate()

  {

  /**@todo Complete this method*/

  }

  public void setSessionContext(SessionContext sessionContext)

  {

  this.sessionContext = sessionContext;

  }

  public String getStuInfo(String stuid)

  {

  String strStu = null;

  try

  {

  student = studentHome.finyPrimaryKey(new BigDecimal(stuid));

  strStu = "The studentID is " + student.getStuid() + " Name is " +

  student.getStuname();

  }

  catch (Exception e)

  {}

  return strStu;

  }

}

7.2.7 重新編譯EJB module,生成Cmp.jar檔案,並部署到Weblogic Server上。

7.2.8 新建facade的客戶端程式facadeTestClient1.java,利用該客戶端程式訪問facadegetStuInfo()方法。修改該客戶端程式的main()方法如下:

  public static void main(String[] args)

  {

  facadeTestClient1 client = new facadeTestClient1();

  client.create();

  client.getStuInfo("2");

  }

7.2.9 編譯執行該客戶端程式,驗證結果。

參考

電子工業出版社  《J2EE應用開發(Jbuilder+Weblogic)》

我的文章首發牛耳論壇()和程式設計師論壇(/" target=_blank>),歡迎轉載,不過,請保留作者以及修訂者的名字,謝謝。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-963643/,如需轉載,請註明出處,否則將追究法律責任。

相關文章