国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

JBoss:有狀態(tài)會(huì)話Bean及其多種調(diào)用方法

2019-11-18 13:04:50
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  一、有狀態(tài)會(huì)話 Bean 的開(kāi)發(fā)和部署
  1、基礎(chǔ)知識(shí)
  
  在第一節(jié)中,我們給出了一個(gè) HelloWorld 無(wú)狀態(tài)的會(huì)話 Bean ,在 EJB2.0 規(guī)范中, EJB 包括三種 Bean ,第一種便是會(huì)話 Bean(session Bean) ,然后還有實(shí)體 Bean(EntityBean) 和消息驅(qū)動(dòng) Bean 。
  
  會(huì)話 Bean 包括無(wú)狀態(tài)會(huì)話 Bean 和有狀態(tài)會(huì)話 Bean ,二者的主要區(qū)別是前者在執(zhí)行的過(guò)程中不保存 Bean 的狀態(tài)信息,它沒(méi)有狀態(tài)域,也就是說(shuō):無(wú)狀態(tài)會(huì)話 Bean 就只是一個(gè)執(zhí)行過(guò)程,我們調(diào)用它完成我們的任務(wù)而己,它在容器池中無(wú)法保存 Bean 狀態(tài)。而后者在容器中執(zhí)行時(shí)會(huì)保存 Bean 的執(zhí)行狀態(tài),相對(duì)應(yīng)的,有狀態(tài)會(huì)話 Bean 中也對(duì)應(yīng)有狀態(tài)域,即會(huì)話 Bean 在執(zhí)行的過(guò)程中會(huì)將與固定客戶端的會(huì)話狀態(tài)保存起來(lái)以備后用。
  
  然而,有狀態(tài)會(huì)話 Bean 它沒(méi)有主鍵類(lèi),客戶端無(wú)法查找出它對(duì)應(yīng)的在容器池中的 EJBObject ,那么我們?nèi)绾沃赜梦覀兊?EJBObject 呢?在這篇文章中,我們提供了兩種方法,并給出了示例程序:
  
  第一種方法是采用有狀態(tài)會(huì)話 Bean 的 Handle( 句柄 ) ,為了取得句柄,可以調(diào)用 EJBObject 接口的 getHandle ()方法,返回一個(gè) Handle 實(shí)例,為了重新構(gòu)建對(duì)同一 EJBObject 的引用,可以使用 Handle 接口的 getEJBObject ()方法,此方法返回一個(gè)對(duì)應(yīng) Handle 的 EJB 對(duì)象,利用此對(duì)象,我們就可以重構(gòu)出對(duì)應(yīng)的 EJBObject ,如下示例:
  
  Count count = counthome.create();// 產(chǎn)生 Remote 接口對(duì)象
  
  javax.ejb.Handle handle = count.getHandle();// 獲得 Remote 接口的句柄
  
  …
  
  Object obj = handle.getEJBObject();// 得獲得 Handle 對(duì)應(yīng)的在容器池中的 EJBObject 對(duì)象
  
  Count recount= (Count)PortableRemoteObject.narrow(obj,Count.class);
  
  // 將此對(duì)象重構(gòu)為遠(yuǎn)程接口對(duì)象即可重新調(diào)用它的方法
  
  第二種方法是采用有狀態(tài)會(huì)話 Bean 的 HomeHandle ,它類(lèi)似 handle ,但不能用于引用 EJBObject 。 HomeHandle 包含足夠的信息,可以重建 EJBHome ()的引用。它的做法是調(diào)用 getHomeHandle ()方法 和 getEJBHome ()方法,此方法返回一個(gè)對(duì)應(yīng) Handle 的 EJBHome 對(duì)象,利用此對(duì)象,可以重新生成出對(duì)應(yīng)的 EJBObject 對(duì)象,然后調(diào)用它的方法。如下示例:
  
  Content ctx = new InitialContext();
  
  Object h = ctx.lookup("CountHome");
  
  CountHome home = (CountHome)PortableRemoteObject.narrow(h, CountHome.class);
  
  HomeHandle homehandle = home.getHomeHandle();// 獲取 HomeHandle
  
  ....
  
  CountHome reHome = (CountHome)homeHandle.getEJBHome();
  
  Count recount = rehome.create();
  
  利用以上兩種方法,我們可以自動(dòng)的存儲(chǔ)并重建引用所需的會(huì)話 Bean 中的 EJB 信息。
  
  好了,了解了以上知識(shí),下面我們就來(lái)一個(gè)真實(shí)的會(huì)話 Bean 來(lái)看看它的運(yùn)行方式!
  
  2、一個(gè)有狀態(tài)會(huì)話Bean的開(kāi)發(fā)和部署
  
  開(kāi)發(fā)一個(gè)會(huì)話 Bean ,基本的應(yīng)遵守以下步聚,首先開(kāi)發(fā) Remote 接口,再編寫(xiě) Home 接口,然后是 Bean 本身。
  
  同時(shí),為了區(qū)別,我們應(yīng)默認(rèn)遵守以下命名規(guī)則, Remote 接口直接用 xxx 命名, Home 接口用 xxxHome 命名, Bean 本身用 xxxBean 命名。
  
  首先,我們手動(dòng)建立開(kāi)發(fā)環(huán)境,在 C:/JBOSS 目錄(這里指 JBOSS 的安裝目錄,詳見(jiàn)上一節(jié))下新建一個(gè)存放我們項(xiàng)目的目錄 myPRoject ,然后再在 myproject 下建一個(gè)存放此 Count 會(huì)話 Bean 的目錄 CounterStatefullSessionBean ,用來(lái)存放我們的這個(gè) Bean 的所有相關(guān)文件。然后,再在 CounterStatefullSessionBean 目錄下建三個(gè)目錄: ejb 、 jsp 和 src 分別用來(lái)存放 ejb 類(lèi)、 Web 應(yīng)用文件( jsp 文件及 Servlet 類(lèi))和我們的源程序。
  
  接著,再在 EJB 目錄下建一個(gè) client 目錄和一個(gè) counter.jar 目錄分別用來(lái)存放 client 端測(cè)試程序和服務(wù)器端類(lèi)。然后再在 client 和 counter.jar 目錄下同時(shí)各新建一個(gè) counter 目錄, counter 目錄下再建一個(gè) ejb 目錄,這是我們的包名。然后在 counter.jar 目錄下再建一個(gè) META-INF 目錄,用于存放我們的 ejb 配置文件。
  
  接著,再在 jsp 目錄中新建一個(gè) counter.war 目錄用于保存 WEB 發(fā)部的程序,再在 counter.war 下新建一個(gè) WEB-INF 目錄,同時(shí)在 WEB-INF 目錄中新建一個(gè) classes 目錄,其下面再建包目錄 counter 及 counter 目錄下的 ejb 目錄。
  
  好了,我們的目錄己建立成功,我們的目錄結(jié)構(gòu)見(jiàn)圖 1 所示:
  
 JBoss:有狀態(tài)會(huì)話Bean及其多種調(diào)用方法

  
圖 1

  
  好了,我們利用上面的知識(shí)來(lái)建一個(gè)有狀態(tài)會(huì)話 Bean 及它的測(cè)試程序。我們?cè)谶@里引入《 Mastering EJB 》 (Second Edition) 中的一個(gè)會(huì)話 Bean ,即 Count 。這個(gè) Bean 中有一個(gè)狀態(tài)域命名為 val ,它用來(lái)保存相應(yīng)客戶端調(diào)用 EBJ 方法 count 的次數(shù)。
  
  我們進(jìn)入 src 目錄,所有的類(lèi)源程序我們都在此目錄中編寫(xiě)和存放。
  
  編寫(xiě) Remote 接口,代碼如下:
  
  //Count.java
  
  package counter.ejb;
  import javax.ejb.*;
  import java.rmi.RemoteException;
  public interface Count extends EJBObject{
  public int count() throws RemoteException;
  }
  
  編寫(xiě) Home 接口,代碼如下:
  
  //CountHome.java
  package counter.ejb;
  import javax.ejb.*;
  import java.rmi.RemoteException;
  public interface CountHome extends EJBHome{
  Count create(int val) throws RemoteException,CreateException;
  }
  
  編寫(xiě) Bean 類(lèi),代碼如下:
  
  //CountBean.java
  package counter.ejb;
  import javax.ejb.*;
  
  
  public class CountBean implements SessionBean{
  // 當(dāng)前的計(jì)數(shù)值就是對(duì)話狀態(tài)
  public int val;
  private SessionContext ctx;
  //EJB 方法
  public int count(){
  System.out.println("count()");
  return ++val;
  }
  
  //EJB 必須的方法
  
  public void ejbCreate(int val) throws CreateException{
  this.val=val;
  
  System.out.println("ejbCreate()");
  
  }
  
  public void ejbRemove(){
  
  System.out.println("ejbRemove()");
  
  }
  
  public void ejbActivate(){
  
  System.out.println("ejbActivate()");
  
  }
  
  public void ejbPassivate(){
  
  System.out.println("ejbPassivate()");
  
  }
  
  public void setSessionContext(SessionContext ctx){
  
  this.ctx = ctx;
  
  }
  
  public SessionContext getSessionContext(){
  
  return this.ctx;
  
  }}
  
  好了,我們?cè)?src 目錄中產(chǎn)生了三個(gè) java 文件,這是 EJB 必須的類(lèi),下面我們用在第一節(jié)中編寫(xiě)的 com.bat 文件來(lái)編譯它們。
  
  進(jìn)行 src 目錄,熱行: com *.java 即會(huì)產(chǎn)生三個(gè) .class 文件。
  
  下面我們部署我們的 EJB 。首先編寫(xiě)部署描述符,進(jìn)入:
  
  C : /JBOSS/myproject/CounterStatefullSessionBean/ejb/counter.jar/META-INF 目錄中,新建一個(gè) ejb-jar.xml 文件,內(nèi)容如下:
  
  <?xml version="1.0" encoding="gb2312"?>
  
  <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
  
  "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
  
  <ejb-jar>
  
  <enterprise-beans>
  
  <session>
  
  <display-name>Count</display-name>
  
  <ejb-name>Count</ejb-name>
  
  <home>counter.ejb.CountHome</home>
  
  <remote>counter.ejb.Count</remote>
  
  <ejb-class>counter.ejb.CountBean</ejb-class>
  
  <session-type>Stateful</session-type>
  
  <transaction-type>Container</transaction-type>
  
  </session>
  
  </enterprise-beans>
  
  </ejb-jar>
  
  此為 EJB 布署描述符文件,它里聲明了此 CountBean 的一些屬性,如聲明了本地接口,遠(yuǎn)程接口及 Bean 的類(lèi)型。其中 <session-type>Stateful</session-type> 一句聲明此 Bean 是有狀態(tài)會(huì)話 Bean ,假如是無(wú)狀態(tài)會(huì)話 Bean( 見(jiàn)第一節(jié)中的 HelloWorld) ,則此處應(yīng)該是 Stateless 。
  
  然后,我們?cè)僭诖四夸浿行陆ㄒ粋€(gè) jboss-service.xml 文件,它是 JBOSS 服務(wù)器特有的描述文件,它的內(nèi)容如下:
  
  <?xml version="1.0" encoding="gb2312"?>
  
  <jboss>
  
  <enterprise-beans>
  
  <session>
  
  <ejb-name>Count</e

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 芜湖县| 油尖旺区| 稻城县| 芦溪县| 霍城县| 永济市| 金华市| 赤城县| 屯昌县| 宜昌市| 东港市| 逊克县| 错那县| 任丘市| 岳池县| 烟台市| 嘉荫县| 凤台县| 鸡西市| 通州区| 晋江市| 泾源县| 黄浦区| 沙河市| 海宁市| 扶沟县| 雷波县| 娄底市| 青海省| 阿图什市| 大名县| 利辛县| 广东省| 湟源县| 瑞丽市| 顺昌县| 木兰县| 繁峙县| 平阳县| 陆丰市| 房产|