kapok

          垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            455 隨筆 :: 0 文章 :: 76 評(píng)論 :: 0 Trackbacks

          Enterprise JavaBean (EJB) 是一些應(yīng)用程式元件,它們實(shí)現(xiàn)了 EJB 體系結(jié)構(gòu)規(guī)範(fàn),並且是 Java 2 Enterprise Edition (J2EE) 平臺(tái)的一部分。EJB 是開發(fā)和部署分散式的、可伸縮的、交易型的、安全的、可移植的、基於元件的商業(yè)應(yīng)用的理想選擇。

          Enterprise JavaBean (EJB)是一些應(yīng)用程式元件,它們實(shí)現(xiàn)了EJB體系結(jié)構(gòu)規(guī)範(fàn),並且是Java 2 Enterprise Edition (J2EE) 平臺(tái)的一部分。EJB是開發(fā)和部署分散式的、可伸縮的、交易型的、安全的、可移植的、基於元件的商業(yè)應(yīng)用的理想選擇。

          基於EJB的商業(yè)應(yīng)用需要一個(gè)EJB容器,用於運(yùn)行時(shí)的執(zhí)行。所有遵從J2EE規(guī)範(fàn)的應(yīng)用伺服器,包括WebLogic 8.1在內(nèi),都提供了EJB容器。

          EJB體系結(jié)構(gòu)背後的主要?jiǎng)訖C(jī)是關(guān)係的分離:它將與應(yīng)用程式基礎(chǔ)設(shè)施相關(guān)的部分(例如交易處理和安全性)與核心應(yīng)用程式部分(例如業(yè)務(wù)邏輯)分離開來(lái)。簡(jiǎn)言之,EJB體系結(jié)構(gòu)通過(guò)指定EJB容器與EJB開發(fā)者之間職責(zé)的區(qū)別,從而達(dá)到這種關(guān)係上的分離。例如,透明地實(shí)現(xiàn)交易處理是EJB容器的職責(zé),而實(shí)現(xiàn)業(yè)務(wù)邏輯則應(yīng)由EJB開發(fā)者負(fù)責(zé)。雖然EJB容器執(zhí)行任務(wù)時(shí)可能需要某些線索(hint),但是,比起實(shí)際地實(shí)現(xiàn)這些與基礎(chǔ)設(shè)施相關(guān)的活動(dòng)來(lái),提供這類線索(通過(guò)基於XML的部署描述符)的代價(jià)是非常少的。總之,這種關(guān)係分離的規(guī)則使得商業(yè)應(yīng)用的開發(fā)比其他方式要高效得多。

          EJB體系結(jié)構(gòu)規(guī)範(fàn)有4種版本:1.0、1.1、2.0和2.1。事實(shí)上,EJB version 1.0已經(jīng)過(guò)時(shí)了,而最新版本,即2.1,由於剛剛才出現(xiàn),所以還沒(méi)有廣泛提供。BEA WebLogic Server 8.1同時(shí)支援1.1和2.0這兩種版本。我們強(qiáng)烈建議在WebLogic Server 8.1中進(jìn)行開發(fā)時(shí)使用EJB version 2.0。

          實(shí)體bean是一種EJB。除了EJB背後的一般動(dòng)機(jī)外,使用實(shí)體bean的特定動(dòng)機(jī)是為持久儲(chǔ)存中的業(yè)務(wù)域(business-domain)實(shí)體提供一種駐留在記憶體中的、可共用的、物件導(dǎo)向的視圖。通常,業(yè)務(wù)域物件就是關(guān)聯(lián)資料庫(kù)中一個(gè)表裏面的一行。在本文中,我們討論了關(guān)於在WebLogic Server 8.1環(huán)境下Entity EJB的設(shè)計(jì)、開發(fā)和部署的特定問(wèn)題。至於關(guān)於EJB技術(shù)的綜合教程,我們推薦http://java.sun.com/j2ee上的J2EE教程。

          概述

          實(shí)體bean是設(shè)計(jì)用來(lái)管理關(guān)聯(lián)資料庫(kù)中的資料的。在BEA WebLogic Server 8.1環(huán)境下,Entity EJB的開發(fā)包括EJB的設(shè)計(jì)、生成、打包和部署。

          從設(shè)計(jì)的角度來(lái)看,實(shí)體bean可以由兩條正交軸線來(lái)分類:持久性和讀取。順著持久性這條軸線,有兩種類型的實(shí)體bean:Bean管理的持久性(Bean-managed persistence,BMP)和容器管理的持久性(Container-managed persistence,CMP)。如果是CMP,則EJB容器將管理實(shí)體bean的持久性。而對(duì)於BMP,則由實(shí)體bean的開發(fā)者通過(guò)指定的Java原始碼來(lái)管理實(shí)體bean的持久性。CMP和BMP之間的選擇是互斥的。順著讀取這條軸線,又有兩種類型的bean:遠(yuǎn)端的和本地的。遠(yuǎn)端實(shí)體bean提供了定位的透明性,並且可以從不同的Java虛擬機(jī)上讀取。相反,本地實(shí)體bean只能在同一應(yīng)用伺服器內(nèi)讀取。本地和遠(yuǎn)端之間的選擇不是互斥的,因此可以設(shè)計(jì)具有雙重介面的bean。

          在EJB體系結(jié)構(gòu)規(guī)範(fàn)中,每個(gè)實(shí)體EJB元件都是由一組指定的Java類和一組指定的XML部署描述符組成。EJB的打包過(guò)程包括將所有指定的EJB Java類檔和XML部署描述符檔打包到一個(gè)Java Archive (JAR)檔中。如果實(shí)體EJB還要依賴於一些Java助手類檔,那麼也可以將這樣的類檔包括到EJB JAR檔中,或者將它們單獨(dú)打包到一個(gè)不同的JAR檔中。

          EJB的部署可分為兩種方式,要麼是在BEA WebLogic Server 8.1內(nèi)直接部署EJB JAR檔以及所依賴的任何JAR檔,要麼是首先將EJB jar檔和所有依賴的JAR檔打包到一個(gè)企業(yè)應(yīng)用歸檔(enterprise application archive,EAR)檔內(nèi),然後再在WebLogic Server 8.1內(nèi)部署這個(gè)EAR檔。

          設(shè)計(jì)EJB

          在設(shè)計(jì)一個(gè)實(shí)體時(shí),需要考慮的幾個(gè)重要選擇是:

          1. 是設(shè)計(jì)一個(gè)CMP實(shí)體bean還是一個(gè)BMP實(shí)體bean。
          2. 是設(shè)計(jì)一個(gè)本地實(shí)體bean,還是設(shè)計(jì)一個(gè)遠(yuǎn)端實(shí)體bean,抑或是設(shè)計(jì)一個(gè)雙重介面的實(shí)體bean。
          3. 是設(shè)計(jì)一個(gè)粗粒度(coarse-grained)的實(shí)體bean,還是一個(gè)細(xì)粒度(fine-grained)的實(shí)體bean。
          4. 是使用資料傳輸物件,還是使用get和set方法來(lái)讀取實(shí)體EJB中的資料。

          下面將討論在開發(fā)實(shí)體EJB時(shí)要面臨的這些設(shè)計(jì)選擇。

          • CMP與BMP
            記住,雖然可能存在一些很合理的例外,但是一般情況下我們強(qiáng)烈推薦使用CMP這種設(shè)計(jì)。至於為什麼要選擇CMP,而不是BMP,這裏有三大主要原因。
          1. 與BMP相比,CMP提供了跨多種不同資料庫(kù)的可攜性,因?yàn)镃MP實(shí)體bean不包含任何特定於資料庫(kù)的持久性原始碼。CMP易於設(shè)計(jì)、實(shí)現(xiàn)和維護(hù)。
          2. 通常,CMP擁有好於BMP的性能,因?yàn)镋JB容器將自動(dòng)生成特定於資料庫(kù)的原始碼,並且這些原始碼將為目標(biāo)資料庫(kù)而最佳化。
          3. CMP通過(guò)使用本地介面,使得在相關(guān)EJB的網(wǎng)路中程式性地(programmatically)進(jìn)行瀏覽變得非常容易。
          • 本地介面、遠(yuǎn)端介面和雙重介面
          因?yàn)镃MP通過(guò)本地介面管理著實(shí)體EJB之間的關(guān)係,所以我們強(qiáng)烈建議總是提供一個(gè)本地介面。我們認(rèn)為遠(yuǎn)端介面需要的時(shí)候很少,但是如果仔細(xì)評(píng)估一下就會(huì)證明遠(yuǎn)端介面也是需要的。所以,我們還是設(shè)計(jì)一個(gè)雙重介面吧。

          本地介面通過(guò)本地客戶機(jī)提供了對(duì)EJB的最佳化的讀取;遠(yuǎn)端方法呼叫(remote method invocation,RMI)的語(yǔ)義不要求通過(guò)本地客戶機(jī)、使用本地介面來(lái)讀取EJB。

          遠(yuǎn)端客戶機(jī)與EJB容器位於不同的虛擬機(jī)上,它需要RMI和遠(yuǎn)端介面來(lái)讀取EJB。從理論上講,單單設(shè)計(jì)一個(gè)本地實(shí)體存在著一個(gè)明顯的缺點(diǎn),那就是只有在相同應(yīng)用伺服器內(nèi)的客戶機(jī)才能讀取該實(shí)體bean。然而,這只是一個(gè)理論上的缺點(diǎn),因?yàn)閷?shí)際上很少需要從應(yīng)用伺服器之外讀取實(shí)體EJB。

          • 粗粒度與細(xì)粒度

            這是一個(gè)非常有爭(zhēng)議的專題,所以還應(yīng)根據(jù)您個(gè)人的經(jīng)驗(yàn)小心地評(píng)價(jià)關(guān)於此專題的一些不同觀點(diǎn)。我們的選擇是,實(shí)體EJB最常用於表示應(yīng)用程式業(yè)務(wù)域中各個(gè)實(shí)體,所以應(yīng)該讓實(shí)體EJB儘量地細(xì)粒度,不過(guò)也應(yīng)將設(shè)計(jì)限定為僅提供一個(gè)本地介面。關(guān)於這個(gè)問(wèn)題的爭(zhēng)論始於EJB體系結(jié)構(gòu)規(guī)範(fàn)1.x版本,當(dāng)時(shí)只能通過(guò)一個(gè)遠(yuǎn)端介面來(lái)讀取實(shí)體EJB。建立在EJB 1.x版本基礎(chǔ)上的任何反對(duì)使用細(xì)粒度實(shí)體EJB的觀點(diǎn),雖然當(dāng)時(shí)也有合理之處,但是在EJB體系結(jié)構(gòu)規(guī)範(fàn)2.0 中卻已不合時(shí)宜了,並且最終遭到反對(duì)。請(qǐng)謹(jǐn)記:有些專家可能不同意我們的觀點(diǎn),所以我們鼓勵(lì)您通過(guò)實(shí)驗(yàn)進(jìn)行考證,並在此專題上形成自己的觀點(diǎn)。
          • 資料傳輸物件與Get和Set方法
            這又是一個(gè)有爭(zhēng)議的專題。我們的觀點(diǎn)如下所述:
            • 在實(shí)體EJB的本地介面中暴露CMP持久欄位的所有g(shù)et讀取器(accessor)方法。
            • 為不屬於實(shí)體EJB主鍵的一部分的每個(gè)CMP持久欄位建立包裝器(wrapper)set方法,並且在實(shí)體EJB的本地介面中暴露這些包裝器方法。使用這些包裝器方法背後的動(dòng)機(jī)是,CMP要求所有持久欄位都具有抽象方法setXXX,如果需要在這些setXXX方法內(nèi)進(jìn)行任何驗(yàn)證,那麼就可以先在包裝器方法內(nèi)完成驗(yàn)證,然後再呼叫相應(yīng)的setXXX方法。如果不需
              這樣的驗(yàn)證,那麼省掉包裝器方法而直接包括setXXX方法也無(wú)不可。
            • 在某些少見的環(huán)境下,可能要求實(shí)體EJB有一個(gè)遠(yuǎn)端介面,這時(shí)可以為每個(gè)實(shí)體EJB定義一個(gè)資料傳輸物件,將該資料傳輸物件作為實(shí)體EJB的遠(yuǎn)端介面中的一個(gè)參數(shù),暴露其get和set方法。

          生成和打包EJB

          在EJB體系結(jié)構(gòu)規(guī)範(fàn)中,每個(gè)實(shí)體EJB元件都由一組指定的Java類和一組指定的XML部署描述符組成:

          1. 一個(gè)必需的實(shí)現(xiàn)實(shí)體bean核心功能的bean類。
          2. 一個(gè)遠(yuǎn)端介面、本地介面或雙重介面,該介面為實(shí)體bean提供了適當(dāng)?shù)目蛻魴C(jī)視圖。
          3. 一個(gè)遠(yuǎn)端主介面(home interface)、本地主介面或者雙重主介面,該介面為實(shí)體bean的生命週期管理提供了適當(dāng)?shù)慕槊妗?
          4. 如果是具有組合主鍵的實(shí)體bean,那麼還有一個(gè)必需的主鍵類。
          5. 一個(gè)ejb-jar XML部署描述符檔,EJB體系結(jié)構(gòu)規(guī)範(fàn)version 2.0對(duì)此作了規(guī)定。
          6. 一個(gè)特定於供應(yīng)商的 weblogic-ejb-jar XML部署描述符檔,BEA WebLogic Server 8.1 對(duì)此有規(guī)定。
          7. 如果是CMP實(shí)體bean,那麼還應(yīng)有一個(gè)特定於供應(yīng)商的weblogic-cmp-rdbms-jar XML 部署描述符檔,BEA WebLogic Server 8.1對(duì)此有規(guī)定。

          這裏使用的例子實(shí)體EJB是一個(gè)CMP實(shí)體EJB,它有一個(gè)遠(yuǎn)端介面,它的名稱是AccountEJB。在隨WebLogic Server 8.1一起安裝的示例檔中,即 /weblogic81/samples/server/examples/src/examples/ejb20/basic/containerManaged目錄下,可以找到這個(gè)實(shí)體EJB。

          實(shí)體bean EJB類和介面可以用EJBGen工具來(lái)生成。

          • EJBGen
            EJBGen是一種EJB 2.0原始碼生成器,它能夠從一個(gè)EJB bean類生成本地介面/遠(yuǎn)端介面、本地主介面/遠(yuǎn)端主介面、主鍵類和部署描述符。在EJB bean類中使用EJBGen標(biāo)記來(lái)指定不同的EJB設(shè)計(jì)設(shè)定(例如,本地/遠(yuǎn)端和CMP/BMP)。在WebLogic Server 8.1 SP01 中,EJBGen 類被包括在/weblogic81/server/lib/weblogic.jar中。在WebLogic Server 8.1 SP02 & SP03中,EJBGen類被包括在/weblogic81/server/lib/ejbgen.jar文件中。將ejbgen.jar添加到Classpath中,以便使用EJBGen工具。

            EJBGen通過(guò)以下命令來(lái)呼叫:

            javadoc -docletpath ejbgen.jar -doclet weblogic.tools.ejbgen.EJBGen
            <EjbBeanClass>.java

            該命令有一些選項(xiàng):

            • d [directory]: 建立EJB類/介面和部署描述符時(shí)所在的目錄。
            • descriptorDir [directory]: 建立部署描述符時(shí)所在的目錄。
            • wls7: 有了–wls7這個(gè)選項(xiàng),就會(huì)生成WebLogic Serve 7.1部署描述符。

              如果要將更早版本的BEA WebLogic Server部署描述符轉(zhuǎn)換成WebLogic Server 8.1部署描述符,那麼可以使用DDConverter。

          • DDConverter
            DDConverter是一個(gè)命令行工具,用於將更早版本的XML部署描述符(ejb-jar.xml、weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml)轉(zhuǎn)換成當(dāng)前版本的WebLogic Server。 DDConverter可以用以下命令來(lái)呼叫:

          java weblogic.ejb20.utils.DDConverter [options] –d destDir file1 [file2...]

          在這個(gè)命令中,file是指包含EJB 1.1部署描述符的一個(gè)EJB 1.0部署描述符檔或JAR檔。DDConverter的一部分選項(xiàng)有:

            • d destDir:部署描述符輸出到的目錄。
            • EJBVer output EJB version: 指定輸出EJB版本。缺省版本是2.0。
              在部署EJB之前,必須將其打包到一個(gè)JAR檔或EAR檔中。
          • EJB JAR文件

            EJB JAR檔的結(jié)構(gòu)由EJB類和介面以及包含部署描述符的 META-INF目錄組成。建立一個(gè)目錄source/ejb20/basic/containerManaged和一個(gè)目錄source/ejb20/basic/containerManaged/META-INF。將Account.java、AccountBean.java、AccountHome.java 和ProcessingErrorException.java從/weblogic81/samples/server/examples/src/examples/ejb20/basic/containerManaged目錄複製到source/ejb20/basic/containerManaged目錄。將ejb-jar.xml、weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml從/weblogic81/samples/server/examples/src/examples/ejb20/basic/containerManaged目錄複製到source/ejb20/basic/containerManaged/META-INT目錄。

          通過(guò)Apache Ant使用編譯好的EJB Java類檔和部署描述符建立一個(gè)JAR檔,Apache Ant 是一種基於Java的聯(lián)編(build)工具。Apache Ant工具需要一個(gè)聯(lián)編檔。建立一個(gè)帶有目標(biāo)的build.xml檔(參見清單1),以便編譯EJB原始檔案並利用編譯好的類檔生成一個(gè)JAR 檔。

          將build.xml檔複製到/source目錄。運(yùn)行build.xml中的ejb-jar目標(biāo)。EJB JAR檔生成在source/dist目錄中。EJB JAR可以使用BEA WebLogic appc編譯器來(lái)編譯。用appc編譯器來(lái)編譯並不是必需的,但這是BEA WebLogic推薦的。

          • appc
            appc編譯器利用EJB JAR檔生成容器類,並驗(yàn)證部署描述符。在部署EJB JAR檔之前用 appc編譯EJB JAR類的好處是,這樣可以識(shí)別出在部署EJB JAR時(shí)可能發(fā)生的錯(cuò)誤。要運(yùn)行 appc編譯器,應(yīng)保證weblogic.jar被包括在Classpath中。appc可以通過(guò)以下命令來(lái)呼叫:

          java weblogic.appc [options] <jar file or directory>

          appc有一些選項(xiàng):

            • output<file>:指定輸出目錄。
            • keepgenerated: 保留生成的.java文件。
            • compiler<java>: 將Java編譯器設(shè)置成可用。
          • 部署EJB

            要部署一個(gè)實(shí)體EJBJAR檔,必須有一個(gè)帶有Java命名和目錄介面(Java Naming and Directory Interface,JNDI)名稱的資料源。在我以前的文章(WLDJ, Vol. 3, issue 1)中我已解釋了如何建立連結(jié)池(Connection Pool)。用JNDI名 "examples-dataSource-demoPool" 建立一個(gè)Tx Datasource。這個(gè)JNDI 名應(yīng)該與weblogic-cmp-rdbms-jar.xml部署描述符檔的 <data-source-name>元素中指定的名稱相一致。

          為了部署實(shí)體EJB JAR檔,在管理控制臺(tái)(administration console)中選擇Deployments>EJB Modules節(jié)點(diǎn)。單擊Deploy a new EJB Module鏈結(jié)(見圖1)。

          這時(shí)會(huì)顯示出Deploy an EJB Module表單(見圖2)。在Deploy an EJB Module 表單中選擇 upload your files(s) 鏈結(jié)。接著將會(huì)顯示一個(gè)Upload and Install an Application or Module 表單。選擇一個(gè)要上載的EJB JAR檔,並單擊Upload按鈕。

          這時(shí)會(huì)顯示出Deploy an EJB Module表單。選擇myserver鏈結(jié)。接著可以看到myserver目錄中的子目錄列表。單擊upload directory鏈結(jié)。在upload目錄中選擇要部署的EJB JAR,並單擊Target Module按鈕(見圖3)。這時(shí)會(huì)顯示一個(gè)Select Targets for this EJB module表單(見圖4)。



          在Select targets for this EJB module表單中選擇一個(gè)或多個(gè)目標(biāo)伺服器,並單擊Continue按鈕。在接著顯示出的表單中,在Name欄位中指定用於要部署的EJB模組的名稱(見圖5)。

          單擊Deploy按鈕以部署EJB JAR檔。這樣一來(lái),EJB JAR將被部署到伺服器上,並且有一個(gè)EJB節(jié)點(diǎn)被添加到EJB Modules節(jié)點(diǎn)中(見圖6)。

          EJB應(yīng)用程式還可以部署到BEA WebLogic Server上,方法是將EJB JAR檔複製到該應(yīng)用程式要部署到的那個(gè)域上的applications目錄中。

          BEA WebLogic為在 WebLogic伺服器上部署EJB提供了一些建議。

          1. 應(yīng)該將EJB作為企業(yè)歸檔應(yīng)用程式(EAR應(yīng)用程式)中的一個(gè)EJB JAR來(lái)部署,以利於應(yīng)用程式的移植和修改。
          2. 引用了其他EJB的EJB應(yīng)該部署在相同的應(yīng)用程式中;weblogic-ejb-jar.xml中的enable-call-by-reference元素應(yīng)該設(shè)置成True,以獲得更好的性能。
          3. 部署在WebLogic伺服器叢集上的EJB應(yīng)該其次地(homogeneously)部署到叢集內(nèi)每一臺(tái)受管的伺服器上。如果一個(gè)EJB只需部署到叢集內(nèi)的一臺(tái)伺服器上,那麼在部署之前應(yīng)使用appc編譯器先對(duì) EJB進(jìn)行編譯。

          結(jié)束語(yǔ)

          EJB應(yīng)用程式的開發(fā)包括建立EJB類、編譯EJB類和利用編譯好的EJB類建立一個(gè)JAR檔,以及將EJBJAR部署到BEA WebLogic Server。通過(guò)遵循關(guān)於設(shè)計(jì)、生成和部署EJB JAR到BEA WebLogic Server上的一些建議,EJB應(yīng)用程式的性能得到了提高。

          參考資料

          l Programming WebLogic Enterprise JavaBeans: http://edocs.bea.com/wls/docs8.1/ejb/index.html

          關(guān)於作者

          Deepak Vohra 是一名 Web 開發(fā)人員,同時(shí)也是一名 NuBean 顧問(wèn)。
          Ajay Vohra 是Compuware 公司的一名高級(jí)軟體工程師。

          Listing 1: build.xml file
          <project name="example-entity-ejb" default="all" basedir=".">
          <property name="source" value="."/>
          <property name="ejb" value="ejb20/basic/containrManaged"/>
          <property name="build" value="{source}/build"/>
          <property name="j2sdkee" value="c:/j2sdkee1.3.1"/>
          <property name="dist" value="{source}/dist"/>

          <target name="init">
          <!-- Create the time stamp -->
          <tstamp/>
          <mkdir dir="{build}"/>
          <mkdir dir="{build}/META-INF"/>
          <mkdir dir="{dist}"/>
          </target>
          <target name="ejb">
          <javac srcdir="{source}" classpath="{j2sdkee}/lib/j2ee.jar"
          destdir="{build}" includes="{ejb}/*.java"/>
          <copy todir="{build}/META-INF">
          <fileset dir="META-INF" includes="*.xml" />
          </copy>
          </target>
          <target name="ejb-jar" depends="ejb">
          <jar jarfile="{dist}/entityejb.jar" includes="META-INF/*.xml,
          {ejb}/*.class" basedir="{build}"/>
          </target>
          </project>

          posted on 2005-06-15 15:26 笨笨 閱讀(2681) 評(píng)論(0)  編輯  收藏 所屬分類: J2EEALLWeblogic Portal
          主站蜘蛛池模板: 辛集市| 常宁市| 屯昌县| 浦城县| 绵竹市| 富源县| 阿拉善盟| 周口市| 宣城市| 东丽区| 汉沽区| 舞阳县| 芮城县| 文安县| 古浪县| 洛宁县| 石柱| 淮阳县| 通渭县| 灯塔市| 颍上县| 邵阳市| 文昌市| 阿克苏市| 长春市| 来宾市| 富平县| 长岭县| 滨海县| 汉寿县| 广水市| 凤凰县| 钟祥市| 顺昌县| 涟水县| 右玉县| 贵定县| 梁河县| 大庆市| 五台县| 江达县|