程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> 建立你的第一個無狀態會話Bean--HelloWorld之三

建立你的第一個無狀態會話Bean--HelloWorld之三

編輯:J2EE

企業JavaBeansTM學習指南:
建立你的第一個無狀態(stateless)會話Bean


  • 關於本學習指南

  • 關於示例

    • 步驟1: 安裝企業JavaBeans 服務器
    • 步驟2: 指定企業JavaBeans 遠程界面
    • 步驟3: 指定宿主界面
    • 步驟4: 編寫企業JavaBean 類
    • 步驟5: 創建ejb-jar 文件
    • 步驟6: 配置DemoBean企業JavaBeans
    • 步驟7: 編寫企業JavaBean 客戶程序
    • 步驟8: 運行客戶程序

3. 如何建立你的第一個無狀態(stateless)會話Bean

步驟 5: 創建 ejb-jar 文件

企業JavaBeans 的巨大優勢之一是能夠以與 GUI 組件相同的移植方式捆綁和分布服務器端邏輯。在這一步中,我們將把在前面幾步中所做的源文件進行編譯,然後捆綁在一個 ejb-jar 文件中。在完成了以下四項工作後,你將可以生成 Demo.jar這樣一個ejb-jar 文件, 這就為將其配置或安裝到 Enterprise JavaBeans Container(企業JavaBeans容器)做好了准備。

1) 編譯 .Java 文件

在你剛剛創建的文件上運行 javac ,也就是在宿主界面和遠程界面、以及企業JavaBeans 的 bean 本身上面運行。
  Javac ejb/Demo/demohome.java

  Javac ejb/Demo/demo.java

  Javac ejb/Demo/demobean.Java


2) 創建Deployment Descriptor(配置描述符)

注意: Deployment(配置) 是企業JavaBeans 中的專用術語,它表示將企業 JavaBeans 組件安裝到一個企業 JavaBeans 容器這樣一個過程。

配置描述符的任務是要使 bean 的 deployer (配置者)能夠在配置之前客戶化 bean 的許多屬性。配置描述符在Enterprise JavaBeans Specification (企業JavaBeans規范)(15.2節)中被描述為javax.ejb.deployment.SessionDescriptor 的一個實例,或為 javax.ejb.deployment.EntityDescriptor的一個實例。在示例 DemoBean 中,它是Javax.ejb.deployment.SessionDescriptor 的一個實例。下面是一個輸入到WebLogic的實用程序中的文本文件的例子,它將生成配置描述符的序列化實例。

應該注意的是,創建配置描述符的方法沒有被指定,因而用來生成和配置企業 JavaBeans 的工具相互間可能也會有很大區別,但不影響 beans 本身在跨平台上的配置能力。 下面的例子繼續用WebLogic工具來創建配置描述符。BEA Weblogic Tengah 服務器實現可提供命令行和GUI配置工具,因此要使用命令行工具來配置企業JavaBean,執行如下命令:

Java weblogic.ejb.utils.DDCreator -dir ejb/demo DeploymentDescriptor.txt

它將在ejb/demo 目錄下創建DemoBeanDD.ser。

下面是輸入到BEA Weblogic 工具的DeploymentDescriptor.txt 文本文件的一個例子(源代碼):
(SessionDescriptor 

  ; This file must start with SessionDescriptor or 

  ; EntityDescriptor

  

  ; Indicate the name which the bean will be bound 

  ; into the JNDI name as 

  beanHomeName                    demo.DemoHome 



  ; The enterprise Java Bean class (see step 4)

  enterpriseBeanClassName         ejb.demo.DemoBean

  

  homeInterfaceClassName          ejb.demo.DemoHome

  ; The home interface implemented by a class 

  ; generated by the container provided tools 

  ; see step 3

 

  remoteInterfaceClassName        ejb.demo.Demo

  ; See step 2



  isReentrant                     false 

  ; Always false for session beans 



  stateManagementType             STATELESS_SESSION

  ; Either STATELESS_SESSION or STATEFUL_SESSION.

  ; DemoBean is a stateless session bean



  sessionTimeout                  5

                                  ; seconds



  (controlDescriptors

  ; This section decides the run-time properties when 

  ; a method is called. The DEFAULT sub-section applIEs 

  ; to all methods, but can be overridden on a per-method 

  ; basis, similar to the "AccessControlEntries" above.

    (DEFAULT

       isolationLevel             TRANSACTION_SERIALIZABLE



       transactionAttribute       TX_REQUIRED





       runAsMode                  CLIENT_IDENTITY

    )

    ; end isolationLevel



  )

  ; end controlDescriptors



  (environmentProperties



    maxBeansInFreePool            100



  )

  ; end environmentPropertIEs

)

; end SessionDescriptor

注意: 這個例子是為 BEA Weblogic 服務器編寫的,它使用分號(;) 來作為注釋行的標記。

3) 確認你已具有所有程序件(pIEces)

下面是企業JavaBeans 開發人員和供應商需要提供的用來創建一個有效 ejb-jar 文件的程序件。也就是企業 JavaBeans 的 bean:
    · 企業 bean 類 + bean 所依賴的所有其它類(步驟 4)。
    · 企業bean的遠程界面 (步驟 2)。
    · 企業bean的宿主界面 (步驟 3)。
    · 一個配置描述符(見上)。
    · Java.util.PropertIEs 的一個實例(如果 bean 需要的話)。
    · 一個在 ejb-jar 文件中用來鑒別配置描述符的清單文件。

欲了解更詳細的信息,請參閱企業 JavaBeans 規范,第16節。

企業JavaBeans 的 bean 供應商負責將所有類裝入 ejb-jar 文件, 但是我們期望大多數提供容器和服務器的供應商都能提供工具來進行包裝和組合的工作。

清單文件(Manifest)

清單文件是由 jar 實用程序自動生成的, 但它將使用一個模板,因此可用下面的行文創建一個文本文件 (例如, ejb/demo/manifest.txt) 。參考下一節有關包裝 bean 的內容,看看這個文本文件是如何被使用的。 有關清單文件的描述,請見Enterprise JavaBeans Specification(企業JavaBeans規范), 15.3節。
Name: ejb/demo/DemoBeanDD.ser

Enterprise-Bean: True

4) 創建 ejb-jar 文件

在這個例子中,你直接將所有的程序件經過 jar 操作後集中到一起,制作了一個被稱作Demo.jar 的 jar 文件。人們期望將來的工具會使得包裝和ejb-jar 文件的生成更容易些。 你可以想象將來會有一個GUI wizard 引導你輕松地通過並檢查這裡的依賴關系(dependencIEs)。

要為這個例子創建 ejb-jar 文件 Demo.jar ,你可以假定 jar 文件的程序件都在 ejb 目錄下,然後直接創建一個關於這個目錄結構的jar 文件。

注意: 使用 m 標記進行 jar 操作並使用 ejb/demo/manifest.txt 作為清單文件的一個模板。不必將 manifest.txt 裝入 jar 文件。
     jar cvfm Demo.jar ejb/demo/manifest.txt ejb/demo/*.class \

     ejb/demo/*.ser 

    

    對 Demo.jar 的檢查應該產生類似於下面的輸出: 



    jar tf Demo.jar



    META-INF/MANIFEST.MF

    Ejb/demo/Demo.class

    Ejb/demo/DemoBean.class

    Ejb/demo/DemoHome.class

    Ejb/demo/DemoBeanDD.ser


正如你所看到的,關於ejb-jar 文件,沒有什麼太特殊的地方。

步驟6: 配置DemoBean 企業JavaBean

在這一步裡,DemoBean 企業JavaBean 將被安裝(或配置)到一個企業JavaBeans 容器。值得注意的是,各個服務器供應商為完成這個安裝過程,都開發了自己獨特的和越來越精巧的工具。 按照下面的說明,將 DemoBean 安裝到你在步驟1中安裝的 BEA Weblogic/Tengah 服務器上。

BEA WebLogic/Tengah 的配置

在最新發布的BEA WebLogic/Tengah 服務器上,企業 JavaBeans bean 的配置的含義是 "將 bean 類放在 Tengah 服務器能夠找到它們的地方"。這並不是一件很難的事,但做起來也並不輕松。 人們期望將有新的工具來進一步簡化這項工作,同時使在此過程中所發生的事情更透明一些。

注意: 這個例子假定 Tengah 服務器安裝在 /export 目錄下。

1) 生成實現

這一步用來創建早些時候指定的界面實現,以及對DemoBean 的特定的BEA WebLogic支持類。注意它們沒有捆綁在你的 bean 中。例如,被生成的類是宿主界面和遠程界面,以及被用來支持通信協議的類。 這些類是在配置階段被生成,並且不是由bean供應商(程序員)所編寫的,這樣一個事實是使 Enterprise JavaBeans 協議獨立的主要原因。

注意: 假定 Tengah 服務器已被安裝到 /export 目錄下。如果它被安裝在其它什麼地方的話,你需要更改目標目錄(即下面的 -d 參數)。

為使用 BEA WebLogic 工具生成 DemoBean 實現, 請使用: Java weblogic.ejbc -d /export/weblogic/classes ejb/demo/DemoBeanDD.ser 這個工具可創建名稱與下面的類相似的類,並把它們放在/export/weblogic/classes 目錄下。
    

    ejb/demo/DemoBeanEOImpl.class

    ejb/demo/DemoBeanHomeImpl.class

    ejb/demo/Skel5k5x705r2x671nd1i1vy2v524ua5y.class

    ejb/demo/Skel5q585f5sfzo601q4e725b233m5140.class

    ejb/demo/Stub5k5x705r2x671nd1i1vy2v524ua5y.class

    ejb/demo/Stub5q585f5sfzo601q4e725b233m5140.class


2) 將Demo.jar 放到Tengah 服務器的類路徑上

這件事有幾種做法,但最簡單的做法是,將 Demo.jar 文件放到 /export/weblogic/classes 目錄上,然後編輯/export/weblogic/startTengah.sh 腳本,使之包含Demo.jar 文件。
    /export/weblogic/startTengah.sh

  #!/bin/sh

  # 

  # Shell script to manually start Tengah 

  # Server on UNIX systems

  CLASSPATH=$CLASSPATH:/export/weblogic/classes/Demo.jar

  echo $CLASSPATH

  Java -ms16m -mx16m -verbosegc weblogic.Server




3) 將DeploymentDescriptor 放到位

現在,Tengah 服務器看來不能在ejb-jar文件內發現序列化的配置描述符,該描述符應該從 jar 文件中拷出到服務器的類路徑上。

例如:
cd /export/weblogic/classes

jar xvf Demo.jar ejb/demo/DemoBeanDD.ser

4) 編輯weblogic.propertIEs 文件
    包括新的企業JavaBeans 的裝載和啟動的有關說明。 



    /export/weblogic/weblogic.properties



  # # # # # # # # # # # # # # # # # # # # # # # # # #

  # Tengah Enterprise JavaBeans DEMO PROPERTIES

  # -------------------------------------------------

  # Uncomment the appropriate lines below and modify 

  # DBMS-related info and paths to match your particular 

  # installation.

  #

  # Deploys the Enterprise JavaBean examples. Uncomment to use:

  weblogic.ejb.deploy=\

  /export/weblogic/classes/beanManaged.jar,\

  /export/weblogic/classes/containerManaged.jar,\

  /export/weblogic/classes/statefulSession.jar,\

   /export/weblogic/classes/ejb/demo/DemoBeanDD.ser

  #

  # weblogic.propertIEs file continues below...

  #

5) 終止並重新啟動 Tengah 服務器

你可以使用 BEA Weblogic 工具來終止並重新啟動 Tengah 服務器,或在一定的環境中,直接殺掉主 Tengah 進程,並使用/expot/weblogic/startTengah.sh 腳本來重新啟動。詳見BEA Weblogic tools documentation

步驟7: 編寫企業JavaBean 客戶程序(ClIEnt)

如果你已經成功地完成了步驟 1 至步驟 6 ,DemoBean 現在應該已被配置到了企業JavaBeans 容器,並准備接受客戶程序(clIEnt)對任何在遠程界面上指定的方法的調用。

1)閱讀下面的客戶程序代碼。
2)將這些代碼存儲到指定文件。

編寫客戶程序概述

編寫客戶程序是在本課程中又一個需要你編寫代碼的地方(除企業 JavaBeans bean 事務邏輯本身之外)。一個企業 JavaBeans bean 的客戶程序可能是各種各樣的。例如,一個servlet, 一個applet, 或是一個 C/C++ 程序。下面的例子 DemoClIEnt.java 是在上幾步中創建的 DemoBean 企業 JavaBean的客戶程序。這個程序應該注意的幾個重要地方是:
    · 建立 JNDI 初始上下文環境。
    · 用 JNDI 對 Enterprise JavaBean 的宿主界面定位。
    · 用宿主界面指示容器來創建一個 Enterprise JavaBean 實例。
    · 用遠程界面指示容器來執行 Enterprise JavaBeans bean的方法。

另外需要注意的是,當你在不同的容器/服務器中配置 bean 時,可能需要有不同版本的客戶代碼。客戶代碼的區別可能不大,但畢竟會有一些問題,如獲得初始連接的正確的串。例如,考慮下列代碼,它為 BEA WebLogic 設置屬性對象來檢索 JNDI initialContext 對象。它可能與檢索initialContext 對象的 Oracle屬性串不同。
p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.T3InitialContextFactory");

這裡存在各種各樣其它的小問題,可能需要某些調整和客戶代碼的再編譯,但它們的工作量都不大。 在下面的樣本中,企業JavaBeans 客戶程序演示了如何定位一個企業JavaBean 並啟動它的遠程方法。
DemoClient.java (源代碼) 



  /**

  * DemoClient -- demonstrates using a minimal 

  * Java application to talk to the DemoBean 

  * stateless session bean

  */

  

  package ejb.demo;

  

  import javax.ejb.*;

  import javax.naming.*;

  import java.rmi.*;

  import java.util.Properties;

  

  import examples.ejb.statelessSession.interfaces.*;

  

  /**

  * DemoClient demonstrates using a minimal stateless session

  * bean.

  * Remember view session beans as an extension of your client

  * running in the server.

  */

  

  public class demoClient {

   public static void main(String[] args) {

   System.out.println("\nBegin demoClient...\n");

  

   parseArgs(args);

   try {

   // Create A DemoBean object, in the server

   // Note: the name of the class corresponds to the JNDI

   // property declared in the DeploymentDescriptor

   // From DeploymentDescriptor ...

   // beanHomeName demo.DemoHome

   Context ctx = getInitialContext();

   DemoHome dhome = (DemoHome) ctx.lookup("demo.DemoHome");

  

   // Now you have a reference to the DemoHome object factory

   // use it to ask the container to creat an instance of

   // the Demo bean

   System.out.println("Creating Demo\n");

   Demo demo = dhome.create();

  

   // Here is the call that executes the method on the

   // server side object

   System.out.println("The result is "

  + demo.demoSelect();

  

  

   }

   catch (Exception e) {

   System.out.println(" = Error <=");

   e.printStackTrace();

   }

   System.out.println("\nEnd demoClIEnt...\n");

   }

  

   static void parseArgs(String args[]) {

   if ((args == null) || (args.length == 0))

   return;

   for (int i = 0; i < args.length; i++) {

   if (args[i].equals("-url"))

   Integer.parseInt(args[++i]);

   else if (args[i].equals("-user"))

   user = args[++i];

   else if (args[i].equals("-password"))

   password = args[++i];

   }

   }

  

   static String user = null;

   static String passWord = null;

   static String url = "t3://localhost:7001";

  

   /**

   * Gets an initial context.

   *

   * @return Context

   * @exception Java.lang.Exception if there is

   * an error in getting a Context

   */

   static public Context getInitialContext() throws Exception {

   Properties p = new PropertIEs();

   p.put(Context.INITIAL_CONTEXT_FACTORY,

   "weblogic.jndi.T3InitialContextFactory");

   p.put(Context.PROVIDER_URL, url);

   if (user != null) {

   System.out.println ("user: " + user);

   p.put(Context.SECURITY_PRINCIPAL, user);

   if (password == null)

   password = "";

   p.put(Context.SECURITY_CREDENTIALS, passWord);

   }

   return new InitialContext(p);

   }

  }

步驟 8: 編譯並運行客戶程序(ClIEnt)

所余下來要作的就是編譯並運行 ClIEnt 程序以確認安裝在服務器上的企業 JavaBeans 的功能是否正確。

1). 編譯客戶程序

編譯和運行客戶程序對所有的平台是等同的,就象運行客戶程序的結果對所有平台也應該是等同的一樣。
javac ejb/Demo/democlIEnt.Java

2). 運行客戶程序

"Hello World" 串出自企業JavaBeans的 DemoSelect() 方法。運行客戶程序應給出下列消息:
Java ejb.Demo.democlIEnt 

Begin DemoClient... 

Creating Demo 

The result is Hello World 

End DemoClIEnt... 


4. 小結

你現在有了可以運行的 DemoBean 例子,並且你還成功地運行了客戶程序。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved