<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    302班

    java突擊隊
    posts - 151, comments - 74, trackbacks - 0, articles - 14
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    EJB介紹

    Posted on 2007-06-19 18:36 停留的風 閱讀(356) 評論(0)  編輯  收藏 所屬分類: 快速前進的Java

    EJB

    1.EJB體系結構:
         包括客戶端、服務器端。
         客戶端:包含了調用EJB組件特定業務所需的EJB接口(包括本地和遠程EJB接口);服務器端處理對象的句柄。
         服務器端:包含了EJB組件實現的實例;用來在客戶端和EJB組件之間進行映射的容器代碼。
         EJB客戶應用程序使用JNDI來查找對本地接口的實例引用,通過EJB接口來調用和引用EJB組件的全部方法和屬性。
    2.開發EJB程序的步驟:

         開發主接口、開發組件接口、開發Bean實現類、編寫部署文件。

         開發主接口:bean的主接口程序,命名為<bean-name>Home,繼承EJBHome,負責bean的生命周期(生成、刪除、查找bean)。只需提供主接口,類方法的實現由容器完成。其方法有create,remove,search等。

         開發組件接口:命名為<bean_name>,繼承EJBObject,當遠程用戶調用主接口方法create時,得到一個組件的遠程引用,為這個bean的所有方法提供一個接口類,類和主接口的實現是由容器在部署時自動生成。

         開發Bean的實現類:命名為<bean_name>EJB,實現SessionBean接口。實現ejbCreate、ejbRemove等。

         編寫部署文件:完整的bean由java類和描述其特性的ejb-jar.xml文件組成,將其打包,放在jboss中的deploy文件夾中。

    3.開發和部署測試程序:

         開發一個Servlet測試程序,將測試程序放在tomcat的webapps中。

    4.會話Bean:

         分為有狀態會話Bean和無狀態會話Bean。EJB容器通過ejb-jar.xml來判斷是否為一個SessionBean提供保存狀態的服務。

    所有SessionBean的壽命周期由容器控制,Bean的客戶不擁有Bean的直接引用。部署一個EJB時,容器為這個Bean分配幾個實例到Component Pooling,當客戶請求一個Bean時,J2EE服務器將一個預先實例化的Bean分配出去,在客戶的一次會話中,可以只引用一次Bean,就可以執行這個Bean的多個方法。如果另一個客戶請求同一個Bean,容器檢查池中空閑的Bean(不在方法和事務中,如果一個客戶長時間引用一個Bean,單執行一個方法后需等待一段事件執行另一個方法,則這段時間也是空閑的),如果全部的實例都已用完,則會自動生成一個新的實例放在池中,并分配給請求者。當負載減少時,池會自動管理Bean實例的數量,將多余的實例從池中釋放。

    5.有狀態會話Bean:

         在客戶訪問之間保存數據,在客戶引用期間維護Bean中的所有實例數據的狀態值。

         有四種狀態:不存在、方法現成、事務中方法現成、鈍化。

         不存在:有狀態SessionBean的初始化狀態為不存在,當客戶引用一個Bean時,按照下圖中初始化一個Bean。    方法現成:如果客戶調用remove()方法回到不存在狀態,并觸發Bean的ejbRemove()方法。如果客戶長時間不調用Bean或服務器準備釋放一些內存資源,則容器調用ejbPassivate()將這些Bean從組件池中鈍化,此時釋放分配的資源。當請求被鈍化的Bean時,容器調用ejbActivate()激活Bean,Bean轉到方法現成狀態時分配Bean所需的資源。

         Bean本身可以管理事務(BMT Bean-Managed Transactions),也可由容器管理事務(CMT Container-Managed Transactions)。對于CMT,容器在方法開始時打開事務,在方法結束時實現事務。通過afterBegin()、beforeCompletion()、afterCompletion()來獲取事務的各個狀態,afterCompletion(true)表示事務完成,afterCompletion(false)表示事務被撤消。 

         setSessionContext()將對象的語境放到對象變量中,容器在結束會話Bean或自動超時死亡之前自動調用ejbRemove()方法,此方法中可以用來釋放資源,

    6.無狀態會話Bean:

         不會在客戶訪問之間保存數據,不能申明實例變量,方法只能操作傳來的參數。

    如果數據是數據的瞬像,則用無狀態會話Bean。弊端:本該存儲在服務器端的數據被保存在客戶中,每次調用這些數據要以參數的方式傳遞給Bean。如果數據狀態非常敏感,則不要使用無狀態會話Bean。

    有兩種狀態:存在、不存在。


    只對客戶提供業務邏輯,服務器端不保存客戶端的任何數據狀態,這些狀態被保存在客戶端。

    當客戶端不存在一個無狀態Session Bean時,通過遠程主接口的create()方法創建一個Bean,newInstance()負責實例化Bean,ejb容器調用bean類的setSessionContext()方法把運行環境對象SessionContext傳遞給Bean,然后調用ejbCreate()方法進行初始化和資源分配。

    7.Jboss:

         用Jboss來運行EJB,將EJB的.jar文件放在jboss deploy文件夾中。這個jboss版本是Jboss2.2.1。將該EJB所有的class文件放在tomcat的webapps中。

    配置ejb-jar.xml文件:

         <?xml version="1.0" encoding="UTF-8"?>

    <ejb-jar>

              <description>This is Hello Ejb</description>

              <display-name>HelloBean</display-name>

              <enterprise-beans>

                  <session>

                       <ejb-name>Hello</ejb-name>

                       <home>hello.HelloHome</home>

                       <remote>hello.Hello</remote>

                       <ejb-class>hello.HelloEJB</ejb-class>

                       <session-type>Stateless</session-type>

                       <transaction-type>Container</transaction-type>

                  </session>

              </enterprise-beans>

    </ejb-jar>

    ejb-name——是EJB的接口類名稱。這里的接口類是Hello。

    home ——是主接口,包括完整的包名。

    ejb-class ——是EJB的類實例,包括完整的包名。

    remote ——是EJB的接口類名稱,包括完整的包名。

    session-type——有兩個值Stateless、Stateful。

    8.實體Bean:

         用來代表底層的對象,常用來映射關系數據庫中的紀錄。關系數據庫的字段可以被一對一的映射到一個Entity Bean中,表之間的關系可以看成是Entity Bean之間的關系,一個Entity Bean實例可能會對應表中的一條紀錄或一個查詢結果。

         持久性:數據庫紀錄的任何改變也應該被同步組件池中相關的Bean中。這一過程是持久性,是Entity Bean最重要的特征。可分為:容器管理持久性(CMP Container-Managed Persistence)和Bean管理持久性(BMP Bean-Managed Persistence)。

         容器管理者:是在Bean與基礎數據庫表紀錄值之間負責同步工作的操作者。CMP Bean的持久性由EJB容器負責,與數據庫的操作在部署EJB時由EJB部署者描述,由容器實現SQL操作和同步工作。BMP Bean的持久性由Bean負責,由Bean開發者負責與數據庫交互的代碼部分。

    9.EJB 1.1規范中的CMP:

         用CMP方式編寫的Bean對于數據庫的操作是在部署時由部署者映射到實際的數據庫字段,這樣增強程序的移植性。不必考慮CMP Bean如何連接到數據庫,者在部署Bean時由部署者為CMP Bean指定一個數據庫連接池的JNDI名。

         在設計一個CMP Bean時,Bean被固定映射一個實體表,表中的每個指定字段被映射成Bean的一個public 型類變量,在實際開發中,只需在Bean的實現類中,申明這些變量,映射操作和SQL處理由部署者和容器自動完成。

         只有Entity Bean有主鍵,每個Entity Bean的實例代表一行紀錄。主鍵類型一般對應于數據表主關鍵字類型。在Bean的實現類中ejbCreate(),CMP Bean返回一個NULL類型的值,BMP Bean返回一個主鍵類型對象;在Bean的遠程主接口中,create()用來插入一條數據,并根據ejbCreate()返回一個Bean的引用。

         CMP Bean和會話Bean一樣需要設計:遠程主接口、組件接口和Bean的實現類。

    10.Entity Bean的壽命周期: 
         客戶在調用完一個Entity Bean且釋放資源后,Entity Bean的實例仍然存在于組件池中,與映射的數據庫紀錄保持持久性。

         Entity Bean的開始狀態為不存在,不引用,當客戶直接向數據庫插入紀錄后,新的紀錄將被映射Bean的實例放到組件池中等待引用,狀態為存在,不引用,可以通過主接口的find方法查找這些對象到存在、引用狀態,也可通過Home.remove()將其刪除,回到初始狀態。在初始狀態通過Home.create()可以到存在、引用狀態,引用的句柄由create方法返回。只有在存在、引用時可以調用組件的業務方法。用set null可以將存在、引用狀態的Bean釋放資源,使用主接口和組件接口的remove()將刪除被映射的數據紀錄,釋放Entity Bean資源,但引用資源仍未釋放,只用set null才可以釋放引用資源。當數據庫紀錄被其他應用程序或進程直接插入數據后,容器將自動維持其持久性,在客戶端執行完一個Entity Bean后,一定要釋放其引用的資源。  

         當遠程客戶調用遠程主接口的create()時,容器調用newInstance()來創建一個Bean實例,調用setEntityContext()將當前的情境傳遞給Bean,進入池共享階段。調用ejbCreate()、ejbPostCreate()來完全初始化Bean并進入準備階段,進入準備階段的Bean業務邏輯方法可以被客戶調用,在調用setxx或getXx時,容器(CMP)或Bean(BMP)會多次調用更新(ejbStore())和提取(ejbLoad())來維護組件的持久性。

    11.開發CMP Bean:

         開發主接口:繼承EJBHome, 開發組件接口:繼承EJBObject,組件接口中申明的方法必須在Bean類中實現,組件的主鍵有默認的操作方法,所以可以不用在組件接口中申明,使用getPrimary()可以獲取組件的主鍵,返回一個Object類型,在客戶端程序中通過上溯造型成合適的類型。

         開發Bean的實現類:實現了EntityBean接口,ejbLoad()從數據庫中讀取數據紀錄,ejbStore()提交當前數據狀態到紀錄,ejbRemove()釋放實例對象并刪除相關映射的數據紀錄,setEntityContext()使當前Bean實例訪問Bean情境,unsetEntityContext()釋放特定的情境資源。Entity Bean激活時的調用順序:ejbActivate()—ejbLoad();鈍化時的順序:ejbStore()—ejbPassivate();對于CMP的ejbCreate()返回為主關鍵字類型,由于容器來實現,在此方法中只需關聯相關的映射字段,然后返回null。必須在類中定義與數據庫表相關聯的映射字段。

         編寫部署文件:部署文件是ejb-jar.xml。

         對于CMP Bean來說,當一個Bean實例被客戶引用,容器會自動讀取Bean的實例字段,然后,通過容器與數據庫發生關系,保存改變的數據,執行完后Bean被鈍化,并調用ejbPassivate()來通知Bean。然后又調用這個Bean時,Bean先調用ejbActivate()通知Bean,Bean實例要激活,然后從數據庫中提取數據,并自動將數據值映射到Bean的實例,然后調用ejbLoad(),實例再一次被初始化,最后才開始執行要執行的業務方法。

    12.開發BMP Bean:

         當一個Bean實例被客戶引用,并執行一個業務方法后,容器執行ejbStore(),由這個方法把數據保存在數據庫中,執行完后Bean被鈍化,調用ejbPassivate()通知Bean。當客戶又調用這個Bean的某業務方法時,被鈍化的Bean又重新激活,EJB對象先調用ejbActivate()通知Bean,Bean實例要激活,然后調用Bean的ejbLoad(),此方法負責從數據庫中提取數據,Bean實例被初始化,最后才執行要執行的業務方法。

         要求所有的數據庫操作由Bean實例完成。

         setXxx():來設置字段的值;getXxx():來獲取Bean字段的值;ejbCreate():由開發者實現,返回創建紀錄的主鍵值;ejbLoad():以實現組件非持久性狀態緩存持久性信息;ejbStore():將信息從組件的非持久性狀態轉到持久性狀態;ejbRemove():必須由開發者實現;unsetEntityContext():釋放在setEntityContext()中緩存的情境資源和取得的資源;setEntityContext():設置情境資源,初始化數據庫連接對象;ejbActivate():通過情境參數設置主鍵值;ejbPassivate():取消Bean與數據庫記錄的持久性工作,進入鈍化狀態。

         開發主接口:與開發CMP Bean的主接口一樣。

         開發組件接口:與開發CMP Bean的主件接口一樣。

         開發Bean的實現類:Bean不在聲明全局的類變量,類變量的映射改教給Bean來管理。需要聲明一個EntityContext情境變量,通過這個變量的getPrimaryKey()得到保存在情境中的主關鍵字,以便在Bean激活時重新初始化Bean的數據。因為要對數據庫直接操作,所以定義一個DataSource的對象,在Bean初始化從連接池中取得一個有效數據庫的對象。定義的Connect對象將在獲取一個數據庫連接時被引用。定義一個String類型的static變量存放一個獲得數據庫資源的JNDI名。

    主站蜘蛛池模板: 男女猛烈无遮掩视频免费软件| 青青免费在线视频| 97国产免费全部免费观看| 国产精品亚洲综合久久| 波多野结衣中文一区二区免费 | 无码精品一区二区三区免费视频| 麻豆亚洲av熟女国产一区二| 毛片免费在线播放| 九九全国免费视频| 亚洲视频国产精品| 亚洲AV永久无码精品水牛影视| 成人超污免费网站在线看| 99久久国产免费-99久久国产免费| 亚洲色欲色欲www在线播放| 国产综合亚洲专区在线| 成人黄色免费网站| 一级毛片免费观看不卡视频| 久久九九久精品国产免费直播| 国产亚洲sss在线播放| 亚洲综合久久夜AV | 国产精品久久久久久久久久免费 | 精品国产免费人成电影在线观看| 香蕉国产在线观看免费| 亚洲日本国产精华液| 国产成人亚洲综合无码| 亚洲?V乱码久久精品蜜桃 | 亚洲成aⅴ人片在线观| 亚洲色图黄色小说| 亚洲第一区视频在线观看| 亚洲国产精品国产自在在线 | 亚洲人成高清在线播放| 国产亚洲av片在线观看16女人| 国产特级淫片免费看| 18禁止看的免费污网站| 精品乱子伦一区二区三区高清免费播放 | 色窝窝亚洲av网| 亚洲午夜电影在线观看| 亚洲视频在线免费播放| 亚洲精品在线免费观看视频| 亚洲视频一区二区三区| 亚洲xxxxxx|