亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

如何開發會話Bean(有狀態會話Bean)

2019-11-18 12:29:15
字體:
來源:轉載
供稿:網友

  會話Bean可以分為有狀態會話Bean(stateful Bean)和無狀態會話Bean(stateless Bean),有狀態會話Bean可以在客戶訪問之間保存數據,而無狀態會話Bean不會在客戶訪問之間保存數據。兩者都實現了javax.ejb.sessionBean接口,EJB容器區通過部署文件ejb-jar.xml來判定是否為一個SessionBean提供保存狀態的服務,另外,在程序實現上,無狀態Bean不能聲明實例變量,每個方法只能操作方法傳來的參數,假如需要在引用期間維持一些數據狀態,以在其他方法中可以引用,則可以把Bean設計成有狀態會話Bean。在第二節中我們用一個SatatelessDate Bean例子描述了開發無狀態會話Bean的過程及特性,下面的一節將介紹關于有狀態會話Bean的一些特性和壽命周期,并用一個例子來證實這些特性。
  
  在本節中你將了解到:
  
  什么是有狀態Session Bean?
  
  有狀態Session Bean壽命周期
  
  編寫一個有狀態Session Bean程序
  
  部署到應用服務器
  
  開發和部署測試程序
  
  運行測試程序
  
  什么是有狀態Session Bean?
  有狀態會話Bean(Stateful Session Bean)就是在客戶引用期間維護Bean中的所有實例數據的狀態值,這些數據在引用期間可以被其他方法所引用,其他客戶不會共享同一個Session Bean的實例。Bean的狀態被保存到臨時存儲體中,因為Bean是可以被序列化的,所以同樣也可以把一個Bean狀態保存到文件系統或數據庫中。因為在調用方法時需要維護狀態(這部分是有開銷的),所以只有需要維護客戶狀態時才使用有狀態會話Bean。典型的會話Bean是購物車,當一個客戶第一次打開購物車時,系統為他分配一個購物車的會話Bean,在以后,每當客戶選購了商品將改變購物車的商品記錄,而這些記錄數據將保存到用戶會話數據中。
  
  有狀態Session Bean壽命周期
  有狀態Session Bean壽命周期由容器控制,Bean的客戶并不實際擁有Bean的直接引用,當我們部署一個EJB時,容器會為這個Bean分配幾個實例到組件池(component pooling)中,當客戶請求一個Bean時,J2EE服務器將一個預先被實例化的Bean分配出去,在客戶的一次會話里,可以只引用一次Bean,就可以執行這個Bean的多個方法。假如又有客戶請求同樣一個Bean,容器檢查池中空閑的Bean(不在方法中或事務中,假如一個客戶長時間引用一個Bean但執行一個方法后需要等待一段時間再執行另一個方法,則這段時間也是空閑的),假如全部的實例都已用完則會自動生成一個新的實例放到池中,并分配給請求者。當負載減少時,池會自動治理Bean實例的數量,將多余的實例從池中釋放。
  
  有狀態會話Bean的壽命周期比無狀態會話Bean更加的復雜,有狀態會話Bean有四種狀態:
  
  不存在
  
  方法現成
  
  事務中方法現成
  
  鈍化
  
  如圖3-1所示:
  
 如何開發會話Bean(有狀態會話Bean)

  <圖3-1>
  
  有狀態會話Bean的初始化狀態為不存在,當有客戶引用一個Bean時,按照順序調用newInstance()、setSessionContext()和ejbCreate()方法,與第一節中講到的無狀態調用順序相同。當處于方法現成狀態時,假如客戶調用remove()方法,則回到不存在狀態,并觸發Bean的ejbRemove()方法。假如客戶長時間不調用Bean或服務器預備釋放一些內存資源,則容器將這些Bean從組件池中鈍化,鈍化過程容器將調用Bean的ejbPassivate()方法,使程序員有機會在鈍化Bean時釋放分配的資源。當一個客戶請求一個被鈍化的Bean時,容器可以激活Bean,激活過程容器將調用ejbActivate()放,使程序員有機會在Bean轉到方法現成狀態時分配Bean所需的資源。
  
  Bean本身可以治理事務(BMT Bean-Managed Transactions),也可以由容器治理事務(CMT Container-Managed Transation)。對于CMT,容器在方法開始時打開事務,在方法結束時實現事務。Bean開發人員可以通過afterBegin()、beforeCompletion()、afterCompletion(Boolean)來獲取事務的各個狀態,假如afterCompletion(Boolean)中Boolean變量為true表示事務完成,為false表示事務被撤消。
  
  編寫一個有狀態Session Bean程序
  假設這次我們要為一個基金組織編寫一個基金帳戶的Bean組件,這個組件將為基金治理系統提供一個基金帳戶的基本功能。為了能夠描述清楚有狀態會話Bean的特性,我們將之簡化成提供三個業務邏輯接口:addFunds()方法為一個基金帳戶添加基金,removeFunds()方法從基金帳戶中取出基金,方法getBalance()為我們提供一個基金帳戶的余額查詢。我們為這個Bean起名為StatefulAccount
  
  設計一個有狀態的Session Bean至少包括四個步驟:
  
  開發主接口
  
  開發組件接口
  
  開發Bean實現類
  
  編寫部署文件
  注重:本節假設你使用的Windows操作系統。假如使用其他操作系統,可能影響到存儲路徑和JDK命令,但這與程序代碼和部署文件內容無關。
  
  1.開發主接口(StatefulAccountHome.java):
  
  是由Bean開發人員編寫的一個Bean的主接口(interface)程序,負責控制Bean的生命周期(生成、刪除、查找Bean)。只需要開發人員給出一個主接口類,類方法的實現由容器來完成。
  
  主接口擴展了javax.ejb.EJBHome接口,參考avax.ejb.EJBHome接口定義如下:
  
   package javax.ejb;
   import java.rmi.Remote;
   import java.rmi.RemoteException;
   
   public interface EJBHome extends Remote{
   public abstract EJBMetaData getEJBMetaData() throws RemoteException;
   public abstract HomeHandle getHomeHandle() throws RemoteException;
   public abstract void remove(Object obj) throws RemoteException,RemoveException;
   public abstract void remove(Handle handle) throws RemoteException,RemoveException;
   }
  
  方法getEJBMetaData()返回EJBMetaData接口的引用,取得Bean的信息,EJBMetaData不是遠程接口。這個類擴展了java.io.Serializable,所以可序列化,具有序列化的特性
  
  方法getHomeHandle()返回主對象的句柄,句柄是主接口StatelessAccountHome的持久性引用,這個類擴展了java.io.Serializable,所以可序列化,具有序列化的特性,HomeHandle 對象可以傳遞給另一個JVM,且不傳遞安全信息,這樣新的應用可以不使用JNDI來查找對象既可以獲得這個主接口,并來創建和獲得Bean實例。
  
  方法remove()用來刪除一個Bean的實例,對于一個會話Bean,執行Remove操作將引用的Bean返回到池中,由池來治理其生命周期。
  
  一般情況下,習慣將主接口的命名規則規定為<bean-name>Home,所以我們把這個主接口類起名為StatefulAccountHome
  
  大部分邏輯方法已經被EJBHome定義,在我們要設計的遠程主接口中,不必再重新定義。值得注重的是,我們需要為這個接口定義一個create()方法,用來獲得一個實例Bean的引用,返回的對象類型是組件接口類StatefulAccount。與第二節的StatelessDateHome類定義基本相同,不同的是Create()方法需要一個double類型的fund參數,當客戶創建一個Bean引用時,我們將通過這個參數初始化基金帳戶的余額。Fund數值的狀態將由容器來維護。
  
  StatefulAccountHome.java代碼:
  
  import java.rmi.RemoteException;
  import javax.ejb.CreateException;
  import javax.ejb.EJBHome;
  
  public interface StatefulAccountHome extends EJBHome{
   public StatefulAccount create(double fund) throws RemoteException,CreateException;
  }
  
  假設我們保存到D:/ejb/StatefulAccount/src/StatefulAccountHome .java
  
  2.開發組件接口(StatefulAccount.java):
  
  當遠程用戶調用主接口類生成方法(create(double))時,客戶要得到一個組件的遠程引用,因此EJB容器要求你為這個Bean的所有方法提供一個接口類,而類的實現則與遠程主接口StatefulAccountHome 一樣由容器在部署時自動生成。
  
  組件接口擴展了avax.ejb.EJBObject接口,參考avax.ejb.EJBObject接口定義如下:
  
   package javax.ejb;
   import java.rmi.Remote;
   import java.rmi.RemoteException;
   
   public interface EJBObject extends Remote{
  public abstract EJBHome getEJBHome() throws RemoteException;
  public abstract Handle getHandle() throws RemoteException;
  public abstract Object getPRimaryKey() throws RemoteException;
  public abstract boolean isIdentical(EJBObject ejbobject) throws RemoteException;
  public abstract void remove() throws RemoteException,RemoveException;
   }
  
  方法getEJBHome()返回遠程主接口對象的引用
  
  方法getHandle() 當前組件接口對象的句柄,和遠程主接口的句柄HomeHandle一樣,這個對象是被序列化的,所以可以保存到本地或通過RMI/IIOP協議傳輸給其他JVM上的客戶使用,而免去JNDI查找和調用主接口的create方法,只要執行Handle.getEJBObject()方法即可取得這個Bean實例的引用。
  
  getPrimaryKey()方法一般用于Entity Bean,假如在Session Bean中調用,拋出java.rmi.RemoteException。
  
  方法isIdentical()用于對當前引用的Bean實例和另一Bean實例進行比較

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一页在线| 亚洲欧美www| 欧美成人免费全部观看天天性色| 欧美壮男野外gaytube| 欧美性猛交xxxx乱大交3| 亚洲日本中文字幕免费在线不卡| 日韩av电影在线免费播放| 欧美韩国理论所午夜片917电影| 欧美精品九九久久| 91在线观看免费高清| 国产精品视频男人的天堂| 琪琪第一精品导航| 欧美性猛交xxxx乱大交蜜桃| 欧美激情视频在线免费观看 欧美视频免费一| 色妞一区二区三区| 欧美极品少妇与黑人| 亚洲国内高清视频| 国产精品露脸av在线| 91国产中文字幕| 亚洲天堂第二页| 欧美激情在线观看| 色黄久久久久久| 久久精品国产久精国产思思| 国产精品久久久久久久久久ktv| 亚洲成人黄色在线| 2019亚洲日韩新视频| 精品久久久久久国产| 九九热精品视频国产| 国产欧美精品一区二区三区-老狼| 91日本视频在线| 国产一区玩具在线观看| 亚洲欧美精品一区| 伊是香蕉大人久久| 欧美日韩在线视频观看| 亚洲欧美中文字幕在线一区| 日韩经典中文字幕| 国产精品免费电影| 午夜剧场成人观在线视频免费观看| 精品亚洲一区二区三区| 欧美午夜片欧美片在线观看| 国产日韩欧美在线| 久久国产精品久久久久| 亚洲国产高清高潮精品美女| 欧美孕妇与黑人孕交| 8090理伦午夜在线电影| 国产mv免费观看入口亚洲| 国产精品综合久久久| 91探花福利精品国产自产在线| 欧美另类69精品久久久久9999| 国产精品久久久久久久久久久久久| 欧美日韩国产中文精品字幕自在自线| 国产精品久久91| 亚洲黄色av网站| 另类专区欧美制服同性| 成人福利在线视频| 久久好看免费视频| 精品国产一区二区三区四区在线观看| 91国产一区在线| 国产精品久久久久91| 久久久久久久久亚洲| 久久久精品一区| 伦理中文字幕亚洲| 欧美成人免费视频| 精品久久久久久亚洲精品| 中文字幕亚洲一区二区三区| 欧美亚洲在线视频| 成人性生交xxxxx网站| 日韩成人中文字幕在线观看| 国产精品电影久久久久电影网| 中文字幕精品一区二区精品| 免费不卡在线观看av| 国产成人久久久| 精品久久久在线观看| 久久大大胆人体| 亚洲国产日韩欧美在线99| 久久夜精品香蕉| 欧美日韩成人在线播放| 成人黄色中文字幕| 亚洲精品久久久久国产| 日本精品久久久| 国产成人亚洲综合青青| 午夜精品一区二区三区视频免费看| 国产成人精品免费视频| 日韩精品www| 美女黄色丝袜一区| 国产色婷婷国产综合在线理论片a| 亚洲第一中文字幕在线观看| 国产精品入口免费视| 色午夜这里只有精品| 色婷婷综合久久久久中文字幕1| 日韩网站免费观看| 亚洲精品国偷自产在线99热| 国产精品羞羞答答| 国产香蕉一区二区三区在线视频| 午夜欧美大片免费观看| 这里只有精品丝袜| 最新91在线视频| 成人av资源在线播放| 成人黄色中文字幕| 欧美又大又硬又粗bbbbb| 欧美精品999| 欧美日韩日本国产| 欧美另类极品videosbest最新版本| 国产成人一区二| 精品国产91乱高清在线观看| 久青草国产97香蕉在线视频| www.久久草.com| 国产91精品最新在线播放| 亚洲国产精彩中文乱码av| 日韩中文第一页| 国产高清视频一区三区| 欧美日韩国内自拍| 久久夜精品va视频免费观看| 久久手机免费视频| 久久久久久久久久久网站| 国产97色在线| 亚洲男人天堂久| 91在线观看免费| 亚洲人成网7777777国产| 久久精品影视伊人网| 国产精品中文字幕在线| 久久99视频精品| 欧美老肥婆性猛交视频| 亚洲第一页在线| 国产精品18久久久久久首页狼| 亚洲精品中文字幕女同| 91精品国产高清久久久久久91| 久久免费成人精品视频| 色噜噜亚洲精品中文字幕| 亚洲人成在线观看| 国产精品久久久久久av福利软件| 国产一区二区三区在线免费观看| 国内外成人免费激情在线视频| 国产精品久久久久久久久久小说| 黄网站色欧美视频| 欧美成人精品在线视频| 美日韩精品免费观看视频| 精品人伦一区二区三区蜜桃网站| 国产免费一区二区三区在线能观看| 午夜精品久久久久久久99热| 中文亚洲视频在线| 国产日韩欧美一二三区| 国产精品美女午夜av| 亚洲乱码国产乱码精品精| 在线播放国产一区二区三区| 亚洲欧美日韩图片| 18性欧美xxxⅹ性满足| 国产精品视频网站| 久久免费视频这里只有精品| 国产网站欧美日韩免费精品在线观看| 精品久久久一区二区| 91九色视频导航| 亚洲摸下面视频| 国产精品久久久精品| 日韩视频欧美视频| 欧美在线国产精品| 欧美激情乱人伦| 中日韩美女免费视频网站在线观看| 久久人人97超碰精品888| 欧洲美女7788成人免费视频| 久久久国产视频91| 97久久久免费福利网址| 亚洲91精品在线| 在线成人免费网站|