<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      EJB內部資參1

      [摘要]enterpriseJavaBean 入門 一 基本知識 1. 背景 Java由于其良好的跨平臺行而成為服務器端的理想語言,為了利用Java實現服務 器端的計算,SUN推出了一個完整的開發平臺J2E...
      enterpriseJavaBean 入門

      一 基本知識

      1. 背景

      Java由于其良好的跨平臺行而成為服務器端的理想語言,為了利用Java實現服務
      器端的計算,SUN推出了一個完整的開發平臺J2EE,其目的是為基于Java的服務器
      端配置提供一個獨立于平臺的可攜帶的多用戶企業級的安全平臺,而J2EE的基石
      就是Enterprise JavaBeans(EJB),EJB是建立基于JAVA的服務器端組件的標準,它
      定義了如何編寫服務器端組件,提供了組件與管理組件的應用服務器之間的標準
      約定,EJB是一種組件架構,使得開發人員能夠快速開發出具有伸縮性的企業級應
      用。

      2. EJB簡介

      1)JavaBeans和Enterprise JavaBeans
      JavaBeans是Java的組件模型。在JavaBeans規范中定義了事件和屬性等特征。En
      terprise JavaBeans也定義了一個Java組件模型,但是Enterprise JavaBeans組
      件模型和JavaBeans組件模型是不同的。 JavaBeans重點是允許開發者在開發工具
      中可視化的操縱組件。JavaBeans規范詳細地解釋了組件間事件登記、傳遞、識別
      和屬性使用、定制和持久化的應用編程接口和語意。 Enterprise JavaBeans的側
      重點是詳細地定義了一個可以portably地部署Java組件的服務框架模型。因此,
      其中并沒提及事件,因為enterprise bean通常不發送和接受事件。同樣也沒有提
      及屬性------屬性定制并不是在開發時進行,而是在運行時(實際上在部署時)
      通過一個部署描述符來描述。
      不要尋找JavaBeans和Enterprise JavaBeans之間的相似性。他們都是組件模型規
      范,但是前者說明了開發工具中應用程序組裝的問題,而后者則側重于部署組件
      的服務框架的細節。不要錯誤地認為JavaBeans是用于客戶端的開發,Enterpris
      e JavaBeans是用于服務器端的開發。JavaBeans也可作為進行非圖形化服務器端
      Java應用開發的組件模型。區別是當你使用JavaBeans創建服務器應用時,你還得
      設計整個的服務框架。用Enterprise Javabeans框架是現成的,你只需遵守它的
      APIs.對于復雜的服務器端應用程序,顯然使用Enterprise JavaBeans比重新開發
      更簡單
      2)EJB體系結構
      EJB是一種組件架構,它采用分而制之的方法實現服務器端的計算。
      EJB規范定義了六種不同的角色來完成其任務, 包括:
      ? Bean provider: 提供可重用的商業組件
      ? Container provider: 為ejb 應用提供低層次的運行環境
      ? Server provider:提供應用程序服務器用以包含,管理和配置ejb組件,目前E
      JB規范沒有提供EJB Container和EJB Server之間的接口,故二者的提供商是合一
      的,有:BEA的Weblogic server,SUN的NetDynamics,IBM的WebSphere,Oracle的8
      i等。
      ? Application assembler:負責將不同的組件組織起來構成能夠運行的應用程序

      ? Deployer: 負責將要使用的組件安裝到應用服務器中并加以配置
      ? System Administrator: 負責配置好的系統的管理等
      這六種角色的流程圖如下:

      Enterprise JavaBean 駐留在EJB Container中,通過EJB Container對ejb進行管
      理。EJB規范定義了二者之間的接口。
      Javax.ejb.EJBHome接口列出了所有定位、創建、刪除EJB 類實例的方法。Home對
      象是home接口的實現。EJB類開發者必須定義home接口。EJB Container Provide
      r應該提供從home接口中產生home對象實現的方法。
      遠程接口(remote interface)列出了EJB類中的商業方法。Javax.ejb.EJBObje
      ct實現遠程接口,并且客戶端通過它訪問EJB實例的商業方法。EJB開發者定義遠
      程接口,EJB Container Provider提供產生相應的EJBObject的方法?蛻舳瞬荒
      得到EJB實例的引用,只能得到它的EJBObject實例的引用。當客戶端調用一個方
      法,EJBObject接受請求并把它傳給EJB實例,同時提供進程中必要的包裝功能。
      客戶端應用程序通過home對象來定位、創建、刪除EJB類的實例,通過EJBObject
      來調用實例中的商業方法?蛻舳丝梢杂肑ava來編程,通過Java RMI來訪問訪問
      home對象和EJBObject,或用其他語言編程并通過CORBA/IIOP訪問,使得部署的服
      務器端組件可以通過CORBA接口來訪問。

      Enterprise javaBean規范將Enterprise Beans 分為兩種:session bean和enti
      ty bean.

      I. session bean表示的是調用它的客戶端代碼索要完成的工作,是一種商業處理
      過程對象,它實現商業邏輯,商業規則以及工作流程,例如:報價,訂單處理,
      視頻壓縮,股票交易等。session bean之所以叫session bean是因為其生命周期
      與調用它的客戶端相同。
      session bean又分為兩種:stateless和stateful, stateful session bean用于
      貫穿多個方法請求和事務的商業過程,例如:網上商店,用戶進入商店后,可以
      將商品加入再現的購物車,組件必須跟蹤用戶的狀態(如:購物車);而statel
      ess session bean用于客戶調用方法期間不用維護任何狀態信息,例如:解決復
      雜數學運算的視頻壓縮/解壓縮。

      II. entity bean用來代表商業過程中處理的永久性的數據,例如:銀行出納員組
      件完成儲蓄等商業過程,其中涉及的數據時銀行賬戶數據
      entity bean用來代表底層的對象。最常用的是用entity bean代表關系庫中的數
      據。一個簡單的entity bean 可以定義成代表數據庫表的一個記錄,也就是每一
      個實例代表一個特殊的記錄。更復雜的entity bean可以代表數據庫表間關聯視圖
      。在entity bean中還可以考慮包含廠商的增強功能,如對象--關系映射的集成。

      通常用entity類代表一個數據庫表比代表多個相關聯的表更簡單且更有效。反過
      來可以輕易地向entity類的定義中增加關聯,這樣可以最大地復用cache并減小舊
      數據的表現。

      III. entity bean和session bean的比較
      看起來session bean好象沒什么用處,尤其對于數據驅動的應用程序。當然事實
      并不是這樣。因為entity bean(譬如說)代表底層數據庫的一行,則entity be
      an實例和數據庫記錄間就是一對一的關系。因為多個客戶端必須訪問底層記錄,
      這意味著,不同于session bean,客戶端必須共享entity bean。因為是共享的,
      所以entity bean不允許保存每個客戶端的信息。session bean允許保存客戶端的
      狀態信息,客戶端和session bean實例間是一對一的。entity bean允許保存記錄
      的信息,entity bean實例和記錄間是一對一的。一個理想的情況是客戶端通過s
      ession bean連接服務器,然后session bean通過entity bean訪問數據庫。這使
      得既可以保存客戶端的信息又可以保存數據庫記錄的信息!
      同時session bean也不能提供在相同或不同的EJB類調用間進行全局的事務控制。
      沒有session bean,應用程序開發者(客戶端開發者)就必須理解EJB類的事務要
      求,并使用客戶端的事務劃分來提供事務控制。EJB的主要好處就是應用開發者不
      需知道EJB類的事務需求。一個session bean可以代表一個商業操作,進行事務控
      制,不需要客戶端進行事務劃分。
      以下我們作為EJB provider的角色來討論Enterprise javaBean的開發。

      3,EJB 開發

      A) Enterprise JavaBean的由如下部分構成
      Enterprise Bean 類: 包含ejb 組件的詳細實現,對于session Bean它代表了
      與業務處理相關的邏輯的實現,而對于entity Bean 它代表了與數據邏輯相關的
      實現
      EJB Object :是由EJB Container來實現的遠程接口,它是客戶端和bean 實例之
      間的中介,傳遞客戶端調用到bean 實例;
      Home 接口:充當EJB Object工廠的java接口,創建EJB Object,Home接口的實現
      由EJB Container負責。
      Deploy descriptor:描述你的ejb 中間件的相關要求,包括:通知EJB Containe
      r如何管理你的bean,事務的需要,安全需要等等。
      特定于bean 的屬性: 利用該屬性,bean可以在運行時讀取并調整自己的功能
      Ejb-jar 文件:將生成的bean 類,home接口,Ejb object,deployment descrip
      tor和bean 的properties 打包進ejb jar 文件,這樣就可以deploy了。

      B) Enterprise JavaBean編程的具體步驟
      實現javax.ejb.EnterpriseBean接口:
      對于session bean 可以直接實現javax.ejb.SessionBean接口,對于entity bea
      n 可以直接實現javax.ejb.EntityBean接口,而后實現本bean特有的功能。
      擴展javax.ejb.EJBObject接口:
      增加在Enterprise Bean實現類中供客戶調用的方法的相應的方法,必須相同
      擴展javax.ejb.EJBHome接口:
      增加創建上述擴展的javax.ejb.EJBObject接口的相應的create()方法。
      編寫deploy descriptor文件:
      目前EJB 1.1規范規定了用XML文件來描述它,并提供了相應的DTD.
      生成EJB jar 文件:
      利用jar命令將上述生成的相應文件進行打包。


      在第二部分給出了ejb開發的詳細說明及相關注意事項
      二 例子程序

      以下的例子程序是以weblogic server(ver5.1)作為EJB Server(EJB Container)
      的, 不同的EJB Server 在一些方面有所不同 (不同的地方另加注釋)

      例子一. Hello, world (Stateless Session Bean)
      包括EJB相應接口的擴展和實現、deploy descriptor文件的生成以及.jar文件生
      成;

      服務器端EJB開發

      EJB相應接口的擴展和實現:(與EJB Server無關)
      第一步: 實現javax.ejb.SessionBean 接口,并提供該Bean的特定功能, "Hel
      lo, world" Stateless SessionBean 僅僅向客戶端返回“Hello,world!”字符串


      注意:除了要實現javax.ejb.SessionBean接口外(ejbActivate(),ejbPassivat
      e(), ejbRemove(), setSessionContext()),必須:
      1).實現公共方法ejbCreate(),該方法對于stateless SessionBean 無需帶任何
      參數而對stateful SessionBean則根據需要自定;
      2)提供給客戶調用的方法, 如:本例的hello()方法

      package com.jsper.ejbexample.session.helloworld;

      import javax.ejb.*;
      import java.rmi.RemoteException;

      public class HelloBean implements SessionBean {
      public HelloBean() {
      super();
      }
      /**
      *由EJB Server(EJB Container) 調用,用于激活SessionBean的實例
      */
      public void ejbActivate() throws EJBException, java.rmi.RemoteExceptio
      n
      {
      System.out.println("ejbActivate()");
      }
      /**
      *由EJB Server(EJB Container) 調用,用于創建本SessionBean的實例
      * 創建日期:(2000-8-1 16:00:45)
      */
      public void ejbCreate() throws javax.ejb.CreateException
      {
      System.out.println("ejbCreate()");
      }
      /**
      * 由EJB Server(EJB Container) 調用,用于惰化SessionBean的實例
      */
      public void ejbPassivate() throws EJBException, java.rmi.RemoteExcepti
      on
      {
      System.out.println("ejbPassivate()");
      }
      /**
      * 由EJB Server(EJB Container) 調用,用于刪除SessionBean的實例
      */
      public void ejbRemove() throws EJBException, java.rmi.RemoteException

      {
      System.out.println("ejbRemove()");
      }
      /**
      * 本SessionBean提供給客戶調用的方法,但不能由客戶直接調用,而是通過Ejb
      Object遠程接口調用
      * 創建日期:(2000-8-1 16:04:58)
      * @return java.lang.String
      */
      public String hello() {
      return "Hello, World!";
      }
      /**
      * 由EJB Server(EJB Container) 調用,用于設置SessionBean的上下文
      */
      public void setSessionContext(SessionContext arg1) throws EJBException
      , java.rmi.RemoteException
      {
      System.out.println("setSessionContext()");
      }
      }
      第二步:擴展javax.ejb.EJBObject接口,增加在第一步SessionBean 接口實現中
      提供給客戶調用 的方法, 如本例的hello()方法
      注意:1)增加的方法名稱必須與相應的SessionBean實現中方法相同(case-sen
      sitive);
      2) 增加的方法必須拋出java.rmi.RemoteException異常

      package com.jsper.ejbexample.session.helloworld;

      import java.rmi.*;
      import javax.ejb.*;
      public interface Hello extends EJBObject {
      /**
      * 由客戶端直接調用,返回“hello,world!”,實現由相應的SessionBean完成
      * 創建日期:(2000-8-1 15:56:25)
      * @return java.lang.String
      * @exception java.rmi.RemoteException 異常說明。
      */
      String hello() throws java.rmi.RemoteException;
      }
      第三步:擴展javax.ejb.EJBHome接口,增加創建EJBHome接口對象的create()方法


      注意: 1)create()方法中參數的有無無關緊要,但必須與SessionBean接口實現
      類中ejbCreate()方法相對應,包括從方法的個數上和參數上;例如:若SessionB
      ean接口實現類中有ejbCreate(),ejbCreate(int nVal)方法,則該接口擴展中必
      須增加create(),create(int nVal)方法
      2)create()方法必須拋出javax.ejb.CreateException 和java.rmi.RemoteExce
      ption 異常

      package com.jsper.ejbexample.session.helloworld;

      import java.rmi.*;
      import javax.ejb.*;
      public interface HelloHome extends EJBHome {
      /**
      * 創建EJBObject擴展對象Hello
      * 創建日期:(2000-8-1 16:13:53)
      * @return com.jsper.ejbexample.session.helloworld.Hello
      * @exception javax.ejb.CreateException 異常說明。
      * @exception java.rmi.RemoteException 異常說明。
      */
      Hello create() throws javax.ejb.CreateException, java.rmi.RemoteExcept
      ion;
      }

      ? deploy descriptor文件的生成

      EJB1.1規范規定了必須利用xml文件構造deploy descriptor文件,并給出了相應
      的DTD。本例的ejb-jar.xml文件如下:




      images/green-cube.gif
        
         
      images/orange-cube.gif
      helloworld
      com.jsper.ejbexample.session.helloworld.HelloHome
      com.jsper.ejbexample.session.helloworld.Hello
      com.jsper.ejbexample.session.helloworld.HelloBean
      Stateless
      Container

       BEAS
       java.lang.Double
       100.0


       MSFT
       java.lang.Double
       150.0

         
        
        
         

       helloworld
       Remote
       *

      Required
         
        
       

      對于weblogic Server還必須構造一個名為weblogic-ejb-jar.xml的文件,BEA公
      司給出了相應的DTD.它描述了相應的EJB的名稱以及JNDI的名稱(**該部分與EJB
      Server有關,ejb開發人員可省去,而由DEPLOYER來完成**)



        
         helloworld
         
      100
         
         hello.HelloHome
        
       
      ? 提供用于標示本EJB的大小圖標(icon),注意:圖像的格式必須是JPEG 或 GI
      F。
      本例提供了圖像文件:orange-cube.gif和green-cube.gif(見附件)
      ? 構造.jar文件
      第一步:編譯相應的.java文件
      本例中包括:Hello.java,HelloBean.java,HelloHome.java ,位于包com.jsper
      .ejbexample.session.helloworld中。編譯后相應的.class文件放在相對目錄co
      m\jsper\ejbexample\session\helloworld 中。
      第二步:創建與com的同級目錄META-INF,將相應的.xml文件拷貝到該目錄下;將相
      應的圖標文件拷貝到相對目錄(相對于該.xml文件父目錄)中(本例為與com的同
      級目錄images)
      第三步:利用JAR命令將目錄com,images,META-INF中的內容做成.jar文件
      本例JAR文件名成為std_hello.jar
      jar cv0f std_hello.jar META-INF com images

      至此, 對于EJB Provider的工作已經完成。
      但是由于我們的開發人員在開發ejb的時候需要進行本地調試等工作,因此其既充
      當ejb provider的角色,又充當其他的腳色, 因此,其可能需要作如下工作(僅
      供參考,接上述工作):
      ? 生成可deployable的jar文件
      前邊生成的jar文件(若不含weblogic-ejb-jar.xml文件)是不依賴于ejb serve
      r(ejb container)的,而如前所述,不同的ejb server對于ejb的配置是不同的
      ,因此需要加上特定的信息
      對于weblogic server則是通過相應的ejbc命令或deploy utility在原.jar文件的
      基礎上生成新的可deployable的.jar文件。(關于ejbc的詳細使用請參見有關資料
      ):
      java –classpath e:\weblogic\classes;e:\weblogic\lib\weblogicaux.jar
      -Dweblogic.home=e:\weblogic weblogic.ejbc -compiler javac std_hello.ja
      r ejb_helloworld.jar
      ? 設定weblogic的環境
      將最終的jar文件(本例ejb_helloworld.jar)放在weblogic的某一子目錄下(例如
      :myserver),而后將.jar文件所在的路徑( e:/weblogic/myserver/ ejb_hel
      loworld.jar)添加到weblogic.properties文件的入口weblogic.ejb.deploy中(
      weblogic.ejb.deploy=e:/weblogic/myserver/ejb_helloworld.jar)
      ? 啟動weblogic server, 在其啟動的控制臺中可以見到相應的ejb的裝載成功的
      信息。


      ? 客戶端調用 





      標簽:EJB內部資參1 
      日韩精品一区二区三区高清