熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

JBoss:有狀態會話Bean及其多種調用方法

2013-11-23 20:29:00  來源: Java開源技術 

  有狀態會話 Bean 的開發和部署
  基礎知識
  
  在第一節中我們給出了一個 HelloWorld 無狀態的會話 Bean 在 EJB 規范中 EJB 包括三種 Bean 第一種便是會話 Bean(Session Bean) 然後還有實體 Bean(EntityBean) 和消息驅動 Bean
  
  會話 Bean 包括無狀態會話 Bean 和有狀態會話 Bean 二者的主要區別是前者在執行的過程中不保存 Bean 的狀態信息它沒有狀態域也就是說無狀態會話 Bean 就只是一個執行過程我們調用它完成我們的任務而己它在容器池中無法保存 Bean 狀態而後者在容器中執行時會保存 Bean 的執行狀態相對應的有狀態會話 Bean 中也對應有狀態域即會話 Bean 在執行的過程中會將與固定客戶端的會話狀態保存起來以備後用
  
  然而有狀態會話 Bean 它沒有主鍵類客戶端無法查找出它對應的在容器池中的 EJBObject 那麼我們如何重用我們的 EJBObject 呢?在這篇文章中我們提供了兩種方法並給出了示例程序
  
  第一種方法是采用有狀態會話 Bean 的 Handle( 句柄 ) 為了取得句柄可以調用 EJBObject 接口的 getHandle ()方法返回一個 Handle 實例為了重新構建對同一 EJBObject 的引用可以使用 Handle 接口的 getEJBObject ()方法此方法返回一個對應 Handle 的 EJB 對象利用此對象我們就可以重構出對應的 EJBObject 如下示例
  
  Count count = counthomecreate();// 產生 Remote 接口對象
  
  javaxejbHandle handle = countgetHandle();// 獲得 Remote 接口的句柄
  
  …
  
  Object obj = handlegetEJBObject();// 得獲得 Handle 對應的在容器池中的 EJBObject 對象
  
  Count recount= (Count)PortableRemoteObjectnarrow(objCountclass);
  
  // 將此對象重構為遠程接口對象即可重新調用它的方法
  
  第二種方法是采用有狀態會話 Bean 的 HomeHandle 它類似 handle 但不能用於引用 EJBObject HomeHandle 包含足夠的信息可以重建 EJBHome ()的引用它的做法是調用 getHomeHandle ()方法 和 getEJBHome ()方法此方法返回一個對應 Handle 的 EJBHome 對象利用此對象可以重新生成出對應的 EJBObject 對象然後調用它的方法如下示例
  
  Content ctx = new InitialContext();
  
  Object h = ctxlookup(CountHome);
  
  CountHome home = (CountHome)PortableRemoteObjectnarrow(h CountHomeclass);
  
  HomeHandle homehandle = homegetHomeHandle();// 獲取 HomeHandle
  
  
  
  CountHome reHome = (CountHome)homeHandlegetEJBHome();
  
  Count recount = rehomecreate();
  
  利用以上兩種方法我們可以自動的存儲並重建引用所需的會話 Bean 中的 EJB 信息
  
  好了了解了以上知識下面我們就來一個真實的會話 Bean 來看看它的運行方式!
  
  一個有狀態會話Bean的開發和部署
  
  開發一個會話 Bean 基本的應遵守以下步聚首先開發 Remote 接口再編寫 Home 接口然後是 Bean 本身
  
  同時為了區別我們應默認遵守以下命名規則 Remote 接口直接用 xxx 命名 Home 接口用 xxxHome 命名 Bean 本身用 xxxBean 命名
  
  首先我們手動建立開發環境在 C:\JBOSS 目錄(這裡指 JBOSS 的安裝目錄詳見上一節)下新建一個存放我們項目的目錄 myproject 然後再在 myproject 下建一個存放此 Count 會話 Bean 的目錄 CounterStatefullSessionBean 用來存放我們的這個 Bean 的所有相關文件然後再在 CounterStatefullSessionBean 目錄下建三個目錄 ejb jsp 和 src 分別用來存放 ejb 類 Web 應用文件( jsp 文件及 Servlet 類)和我們的源程序
  
  接著再在 EJB 目錄下建一個 client 目錄和一個 counterjar 目錄分別用來存放 client 端測試程序和服務器端類然後再在 client 和 counterjar 目錄下同時各新建一個 counter 目錄 counter 目錄下再建一個 ejb 目錄這是我們的包名然後在 counterjar 目錄下再建一個 METAINF 目錄用於存放我們的 ejb 配置文件
  
  接著再在 jsp 目錄中新建一個 counterwar 目錄用於保存 WEB 發部的程序再在 counterwar 下新建一個 WEBINF 目錄同時在 WEBINF 目錄中新建一個 classes 目錄其下面再建包目錄 counter 及 counter 目錄下的 ejb 目錄
  
  好了我們的目錄己建立成功我們的目錄結構見圖 所示
  
 

  

  
  好了我們利用上面的知識來建一個有狀態會話 Bean 及它的測試程序我們在這裡引入《 Mastering EJB 》 (Second Edition) 中的一個會話 Bean 即 Count 這個 Bean 中有一個狀態域命名為 val 它用來保存相應客戶端調用 EBJ 方法 count 的次數
  
  我們進入 src 目錄所有的類源程序我們都在此目錄中編寫和存放
  
  編寫 Remote 接口代碼如下
  
  //Countjava
  
  package counterejb;
  import javaxejb*;
  import javarmiRemoteException;
  public interface Count extends EJBObject{
  public int count() throws RemoteException;
  }
  
  編寫 Home 接口代碼如下
  
  //CountHomejava
  package counterejb;
  import javaxejb*;
  import javarmiRemoteException;
  public interface CountHome extends EJBHome{
  Count create(int val) throws RemoteExceptionCreateException;
  }
  
  編寫 Bean 類代碼如下
  
  //CountBeanjava
  package counterejb;
  import javaxejb*;
  
  
  public class CountBean implements SessionBean{
  // 當前的計數值就是對話狀態
  public int val;
  private SessionContext ctx;
  //EJB 方法
  public int count(){
  Systemoutprintln(count());
  return ++val;
  }
  
  //EJB 必須的方法
  
  public void ejbCreate(int val) throws CreateException{
  thisval=val;
  
  Systemoutprintln(ejbCreate());
  
  }
  
  public void ejbRemove(){
  
  Systemoutprintln(ejbRemove());
  
  }
  
  public void ejbActivate(){
  
  Systemoutprintln(ejbActivate());
  
  }
  
  public void ejbPassivate(){
  
  Systemoutprintln(ejbPassivate());
  
  }
  
  public void setSessionContext(SessionContext ctx){
  
  thisctx = ctx;
  
  }
  
  public SessionContext getSessionContext(){
  
  return thisctx;
  
  }}
  
  好了我們在 src 目錄中產生了三個 java 文件這是 EJB 必須的類下面我們用在第一節中編寫的 combat 文件來編譯它們
  
  進行 src 目錄熱行 com *java 即會產生三個 class 文件
  
  下面我們部署我們的 EJB 首先編寫部署描述符進入
  
  C \JBOSS\myproject\CounterStatefullSessionBean\ejb\counterjar\METAINF 目錄中新建一個 ejbjarxml 文件內容如下
  
  <?xml version= encoding=gb?>
  
  <!DOCTYPE ejbjar PUBLIC //Sun Microsystems Inc//DTD Enterprise JavaBeans //EN
  
  jar__dtd>
  
  <ejbjar>
  
  <enterprisebeans>
  
  <session>
  
  <displayname>Count</displayname>
  
  <ejbname>Count</ejbname>
  
  <home>counterejbCountHome</home>
  
  <remote>counterejbCount</remote>
  
  <ejbclass>counterejbCountBean</ejbclass>
  
  <sessiontype>Stateful</sessiontype>
  
  <transactiontype>Container</transactiontype>
  
  </session>
  
  </enterprisebeans>
  
  </ejbjar>
  
  此為 EJB 布署描述符文件它裡聲明了此 CountBean 的一些屬性如聲明了本地接口遠程接口及 Bean 的類型其中 <sessiontype>Stateful</sessiontype> 一句聲明此 Bean 是有狀態會話 Bean 如果是無狀態會話 Bean( 見第一節中的 HelloWorld) 則此處應該是 Stateless
  
  然後我們再在此目錄中新建一個 jbossservicexml 文件它是 JBOSS 服務器特有的描述文件它的內容如下
  
  <?xml version= encoding=gb?>
  
  <jboss>
  
  <enterprisebeans>
  
  <session>
  
  <ejbname>Count</e
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28547.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.