範例:使用 Access Bean

這個範例會顯示三個現有 CMP Entity Bean 的 EJB 1.1 Access Bean。

如果要瞭解如何建立 Access Bean,請假設您有一個簡單的 EJB 1.1 範例,在這個範例中,您需要建立名稱如下的三個現有 CMP EJB 的 Access Bean:

下表是這些 EJB 的 CMP 欄位和關係以及每個 EJB 需要產生的 Access Bean 類型:

EJB 名稱 CMP 欄位 關係 Access Bean 類型 Access Bean 名稱
Employee id name salary Manager 的 Super 類別。與 Department 形成 1:N 關聯(Employee 員工有一個部門,但 Department 有多個員工) Rowset EmployeeAccessBean
Manager parkinglotnum Employee 的子類別(繼承自 Employee) Copy Helper ManagerAccessBean
Department id name projectcode 與 Employee 形成 1:N 關聯(Department 有多個員工,但 Employee 只有一個部門) Copy Helper DepartmentAccessBean

這個主題的其餘部分會顯示下面這三個 Access Bean 的大量範例程式碼:

範例程式碼包括 EJB 介面、Access Bean 方法簽章及用戶端程式。

這個範例假設所有類別都在名稱為 empexample 的套件中,且各 EJB 都在名稱為 ABExample 的 EJB 群組中。您可以在下列各節中,找到關聯於 Department、Employee 和 Manager Access Bean 的範例程式碼:

EJB 介面

下列程式碼範例提供 EJB 介面:

public interface Employee extends javax.ejb.EJBObject {
    empexample.Department getDepartment() throws java.rmi.RemoteException,
                    javax.ejb.FinderException;    empexample.DepartmentKey getDepartmentKey() throws java.rmi.RemoteException;
    java.lang.String getName() throws java.rmi.RemoteException;
    float getSalary() throws java.rmi.RemoteException;
    void privateSetDepartmentKey(empexample.DepartmentKey inKey) throws
           java.rmi.RemoteException;
    void secondarySetDepartment(empexample.Department aDepartment) throws
           java.rmi.RemoteException;
    void setDepartment(empexample.Department aDepartment) throws
           java.rmi.RemoteException;
    void setName(java.lang.String newValue) throws java.rmi.RemoteException;
    void setSalary(float newValue) throws java.rmi.RemoteException;
}
public interface EmployeeHome extends javax.ejb.EJBHome {
    empexample.Employee create(int argId) throws javax.ejb.CreateException,
           java.rmi.RemoteException;
    empexample.Employee create(int argId, int depId) throws
          javax.ejb.CreateException, java.rmi.RemoteException;
    empexample.Employee findByPrimaryKey(empexample.EmployeeKey key) throws
     java.rmi.RemoteException, javax.ejb.FinderException;    java.util.Enumeration findEmployeeByDepartment(empexample.DepartmentKey inKey) throws
     java.rmi.RemoteException, javax.ejb.FinderException;}
public interface Manager extends Employee {
    int getParkinglotnum() throws java.rmi.RemoteException;
    void setParkinglotnum(int newValue) throws java.rmi.RemoteException;
}
public interface ManagerHome extends javax.ejb.EJBHome {
    empexample.Manager create(int argId) throws javax.ejb.CreateException,
           java.rmi.RemoteException;
    empexample.Manager findByPrimaryKey(EmployeeKey key) throws
     java.rmi.RemoteException, javax.ejb.FinderException;}
public interface Department extends javax.ejb.EJBObject {
    void addEmployee(empexample.Employee anEmployee) throws
           java.rmi.RemoteException;
    java.util.Enumeration getEmployee() throws java.rmi.RemoteException,
                    javax.ejb.FinderException;    java.lang.String getName() throws java.rmi.RemoteException;
    int getProjectcode() throws java.rmi.RemoteException;
    void secondaryAddEmployee(empexample.Employee anEmployee) throws
           java.rmi.RemoteException;
    void secondaryRemoveEmployee(empexample.Employee anEmployee) throws
            java.rmi.RemoteException;
    void setName(java.lang.String newValue) throws java.rmi.RemoteException;
    void setProjectcode(int newValue) throws java.rmi.RemoteException;
}
public interface DepartmentHome extends javax.ejb.EJBHome {
    empexample.Department create(int argId) throws javax.ejb.CreateException,
           java.rmi.RemoteException;
    empexample.Department findByPrimaryKey(empexample.DepartmentKey key) throws
     java.rmi.RemoteException, javax.ejb.FinderException;}

EJB Access Bean 方法簽章

這時範例程式碼假設 CMP EJB 是完整的。Manager EJB 繼承 Employee EJB,Employee EJB 與 Department EJB 形成 1:N 關聯。

現在,您將產生您的 Access Bean:Department 和 Manager EJB 的 Copy Helper 及 Employee EJB 的 Rowset。 您可以假設所有 CMP 欄位都在快取記憶體內,除了相關 CMP EJB 的索引鍵 getter 之外,沒有使用 getter 和 setter 的字串轉換器。

下列程式碼範例提供 Access Bean 的方法簽章:

public class EmployeeAccessBean extends com.ibm.ivj.ejb.runtime.AbstractEntityAccessBean
      implements EmployeeAccessBeanData {
  /**
      * 用來起始設定 Access Bean 的零引數建構子。
   *
      * 這個建構子對應於下列 Home 介面方法:
   *
      * public abstract empexample.Employee empexample.EmployeeHome.create(int) throws
      *    javax.ejb.CreateException,java.rmi.RemoteException
   *
      * 在呼叫任何商業方法之前,必須呼叫下列 setter 方法
   * 來設定 Home 介面方法內容:
   * setInit_argId( int )
      * setInit_depId( int )
   */
      public EmployeeAccessBean()
      public EmployeeAccessBean(empexample.EmployeeKey arg0) throws
            java.rmi.RemoteException, javax.ejb.FinderException,
            javax.naming.NamingException
      public EmployeeAccessBean ( javax.ejb.EJBObject o ) throws
            java.rmi.RemoteException
      public EmployeeAccessBean ( int arg0 ) throws javax.ejb.CreateException,
            java.rmi.RemoteException, javax.naming.NamingException
      public void commitCopyHelper() throws java.rmi.RemoteException,
             javax.ejb.CreateException, javax.ejb.FinderException,
            javax.naming.NamingException
      protected String defaultJNDIName()
      private empexample.EmployeeHome ejbHome() throws
            java.rmi.RemoteException, javax.naming.NamingException
      private empexample.Employee ejbRef() throws java.rmi.RemoteException
      public java.util.Enumeration findEmployeeByDepartment(empexample.DepartmentKey arg0)
      throws java.rmi.RemoteException, javax.ejb.FinderException, 
            javax.naming.NamingException
      public empexample.DepartmentAccessBean getDepartment() throws
            java.rmi.RemoteException, javax.ejb.FinderException,
            javax.ejb.CreateException, javax.naming.NamingException
      public empexample.DepartmentKey getDepartmentKey() throws
            java.rmi.RemoteException, javax.ejb.CreateException,
            javax.naming.NamingException
      public java.lang.String getName() throws java.rmi.RemoteException, 
             javax.ejb.CreateException, javax.ejb.FinderException,
            javax.naming.NamingException
      public float getSalary() throws java.rmi.RemoteException, 
             javax.ejb.CreateException, javax.ejb.FinderException,
            javax.naming.NamingException
      protected void instantiateEJB() throws javax.ejb.CreateException, 
            java.rmi.RemoteException, javax.naming.NamingException
      protected boolean instantiateEJBByPrimaryKey() throws 
            java.rmi.RemoteException, javax.ejb.CreateException,
            javax.naming.NamingException
      public void privateSetDepartmentKey(empexample.DepartmentKey arg0) throws
            java.rmi.RemoteException, javax.ejb.CreateException,
            javax.naming.NamingException
      public void refreshCopyHelper() throws java.rmi.RemoteException, 
             javax.ejb.CreateException, javax.ejb.FinderException,
            javax.naming.NamingException
      public void secondarySetDepartment(empexample.Department arg0) throws
            java.rmi.RemoteException, javax.ejb.CreateException,
            javax.naming.NamingException
      public void setDepartment(empexample.Department arg0) throws
            java.rmi.RemoteException, javax.ejb.CreateException,
            javax.naming.NamingException
      public void setInit_argId( int newValue )
      public void setInit_depId( int newValue )
      public void setName( java.lang.String newValue )
      public void setSalary( float newValue )
}
public class ManagerAccessBean extends
      com.ibm.ivj.ejb.runtime.AbstractEntityAccessBean implements ManagerAccessBeanData {
  /**
      * 用來起始設定 Access Bean 的零引數建構子。
   *
      * 這個建構子對應於下列 Home 介面方法:
   *
      * public abstract empexample.Manager empexample.ManagerHome.create(int) throws
      *    javax.ejb.CreateException, java.rmi.RemoteException
   *
      * 在呼叫任何商業方法之前,必須呼叫下列 setter 方法
   * 來設定 Home 介面方法內容:
   * setInit_argId( int )
   */
      public ManagerAccessBean ()
      public ManagerAccessBean(empexample.EmployeeKey arg0) throws
            java.rmi.RemoteException, javax.ejb.FinderException,
            javax.naming.NamingException
      public ManagerAccessBean ( javax.ejb.EJBObject o ) throws
            java.rmi.RemoteException
      public void commitCopyHelper() throws java.rmi.RemoteException,
             javax.ejb.CreateException, javax.ejb.FinderException,
            javax.naming.NamingException
      protected String defaultJNDIName()
      private empexample.ManagerHome ejbHome() throws java.rmi.RemoteException,
            javax.naming.NamingException
      private empexample.Manager ejbRef() throws java.rmi.RemoteException
      public empexample.DepartmentAccessBean getDepartment() throws
            java.rmi.RemoteException, javax.ejb.FinderException,
            javax.ejb.CreateException, javax.naming.NamingException
      public empexample.DepartmentKey getDepartmentKey() throws
            java.rmi.RemoteException, javax.ejb.CreateException,
            javax.naming.NamingException
      public java.lang.String getName() throws java.rmi.RemoteException, 
             javax.ejb.CreateException, javax.ejb.FinderException,
            javax.naming.NamingException
   public int getParkinglotnum() throws java.rmi.RemoteException, 
             javax.ejb.CreateException, javax.ejb.FinderException,
            javax.naming.NamingException
      public float getSalary() throws java.rmi.RemoteException, 
             javax.ejb.CreateException, javax.ejb.FinderException,
            javax.naming.NamingException
      protected void instantiateEJB() throws javax.ejb.CreateException, 
            java.rmi.RemoteException, javax.naming.NamingException
      protected boolean instantiateEJBByPrimaryKey() throws 
            java.rmi.RemoteException, javax.ejb.CreateException,
            javax.naming.NamingException
      public void privateSetDepartmentKey(empexample.DepartmentKey arg0) throws
            java.rmi.RemoteException, javax.ejb.CreateException,
            javax.naming.NamingException
      public void refreshCopyHelper() throws java.rmi.RemoteException, 
             javax.ejb.CreateException, javax.ejb.FinderException,
            javax.naming.NamingException
      public void secondarySetDepartment(empexample.Department arg0) throws
            java.rmi.RemoteException, javax.ejb.CreateException,
            javax.naming.NamingException
      public void setDepartment(empexample.Department arg0) throws
            java.rmi.RemoteException, javax.ejb.CreateException,
            javax.naming.NamingException
      public void setInit_argId( int newValue )
      public void setName( java.lang.String newValue )
      public void setParkinglotnum( int newValue )
      public void setSalary( float newValue )
}
public class DepartmentAccessBean 
      extends com.ibm.ivj.ejb.runtime.AbstractEntityAccessBean
      implements DepartmentAccessBeanData {
  /**
      * 用來起始設定 Access Bean 的零引數建構子。
   *
      * 這個建構子對應於下列 Home 介面方法:
   *
      * public abstract empexample.Department empexample.DepartmentHome.create(int)
      *    throws javax.ejb.CreateException,java.rmi.RemoteException
   *
      * 在呼叫任何商業方法之前,必須呼叫下列 setter 方法
   * 來設定 Home 介面方法內容:
   * setInit_argId( int )
   */
      public DepartmentAccessBean ()
      public DepartmentAccessBean(empexample.DepartmentKey arg0) throws
            java.rmi.RemoteException, javax.ejb.FinderException,
            javax.naming.NamingException
   public DepartmentAccessBean ( javax.ejb.EJBObject o ) throws 
            java.rmi.RemoteException
      public void addEmployee(empexample.Employee arg0) throws
            java.rmi.RemoteException, javax.ejb.CreateException,
            javax.naming.NamingException
      public void commitCopyHelper() throws java.rmi.RemoteException,
             javax.ejb.CreateException, javax.ejb.FinderException,
            javax.naming.NamingException
      protected String defaultJNDIName()
      private empexample.DepartmentHome ejbHome() throws
            java.rmi.RemoteException, javax.naming.NamingException
      private empexample.Department ejbRef() throws
            java.rmi.RemoteException
      public java.util.Enumeration getEmployee() throws java.rmi.RemoteException,
      javax.ejb.FinderException, javax.ejb.CreateException, 
            javax.naming.NamingException
      public java.lang.String getName() throws java.rmi.RemoteException, 
             javax.ejb.CreateException, javax.ejb.FinderException,
            javax.naming.NamingException
   public int getProjectcode() throws java.rmi.RemoteException, 
             javax.ejb.CreateException, javax.ejb.FinderException,
            javax.naming.NamingException
      protected void instantiateEJB() throws javax.ejb.CreateException, 
            java.rmi.RemoteException, javax.naming.NamingException
      protected boolean instantiateEJBByPrimaryKey() throws 
             java.rmi.RemoteException, javax.ejb.CreateException,
             javax.naming.NamingException
      public void refreshCopyHelper() throws java.rmi.RemoteException, 
              javax.ejb.CreateException, javax.ejb.FinderException,
             javax.naming.NamingException
      public void secondaryAddEmployee(empexample.Employee arg0) throws
             java.rmi.RemoteException, javax.ejb.CreateException,
             javax.naming.NamingException
      public void secondaryRemoveEmployee(empexample.Employee arg0) throws
             java.rmi.RemoteException, javax.ejb.CreateException,
             javax.naming.NamingException
      public void setInit_argId( int newValue )
      public void setName( java.lang.String newValue )
      public void setProjectcode( int newValue )
}

EJB 用戶端程式

下列程式碼範例顯示在 Access Bean 上執行各種作業的 EJB 用戶端程式:

package empexample;

import javax.ejb.*;
import com.ibm.ivj.ejb.runtime.*;

public class EmpDepTest {

/**
  * Employee、Department 和 Manager Access Bean
 * 的簡單測試。
*
  * @param args 指令行引數的陣列
  * args[0] = Employee ID#
  * args[1] = Employee Name
  * args[2] = Employee Salary
  * args[3] = Department ID#
  * args[4] = Parking lot# (optional)
 */

public static void main(java.lang.String[] args) {

        EmployeeAccessBean empab = null;
        ManagerAccessBean mgrab = null;
        DepartmentAccessBean depab = null;
        int empid;
        String empname;
        float empsalary;
        int mgrparknum;
        int depid;

         try {
                empid = Integer.parseInt(args[0]);
                empname = args[1];
                empsalary = Float.parseFloat(args[2]);
                depid = Integer.parseInt(args[3]);
                mgrparknum = Integer.parseInt(args[4]);

                // 嘗試以給定的資訊來建立新員工
             try {
                        empab = new EmployeeAccessBean();
                        empab.setInit_argId(empid);
                        empab.setInit_depId(depid);

            

                        // 設定各屬性(寫入快取記憶體)
                        empab.setName(empname);
                        empab.setSalary(empsalary);

                        // 將快取記憶體沖寫到伺服器中
                        empab.commitCopyHelper();
        }

                // 如果發生重複索引鍵異常狀況,就尋找
        // 先前存在的實例
        catch ( DuplicateKeyException dke ) {
                                empab = new EmployeeAccessBean(new EmployeeKey(empid));

                                // 將所有屬性填入快取記憶體中
                                empab.refreshCopyHelper();

                                // 以新資訊更新先前存在的 Employee,
                // 並藉由沖寫快取記憶體來更新 Entity Bean
            empab.setName(empname);
                            empab.setSalary(empsalary);
                            empab.commitCopyHelper();
        }

                // 顯示員工資訊
                // 取得 Employee Bean 的索引鍵(假設索引鍵類別有
        // 索引鍵欄位的 getter )
        EmployeeKey empkey = (EmployeeKey) empab.__getKey();
                System.out.println("Employee ID#: " + empkey.getId());
                System.out.println("Employee Name: " + empab.getName());
                System.out.println("Employee Salary: " + empab.getSalary());
        
                // 取得這個 Employee 的 Department Access Bean
        // (用於相關的 EJB)
        depab = empab.getDepartment();
                if ( depab != null ) {
                        DepartmentKey depkey = (DepartmentKey) depab.__getKey();

                        // 尋找這個部門的所有員工
                        // 這也會顯示新 AccessBeanEnumeration 類別的用法,
            // 它是一個特殊的列舉類別,只有在呼叫 nextElement() 時,
            // 它才會建立 EJB 物件的實例。
            // 所有會傳回 EJBObject 列舉表的 Access Bean finder 方法
            // 現在都會傳回這個特殊列舉類別
System.out.println("\nFinding all employees for department "  
                                                                                                    + depab.getName());
                        AccessBeanEnumeration aem =
                                (AccessBeanEnumeration) empab.findEmployeeByDepartment(depkey);

                        // 利用 Access Bean 表格 (Rowset) 來組織和操作
            // Employee Access Bean 的列舉表。
            // Session Bean 通常會先建立這份表格,之後,
            // 再將它傳遞給 JSP,在 JSP 中,會利用索引
            // 將 Access Bean 的列舉表當作 Rowset 來處理。
            // 之後,就可以從 Rowset 中新增或移除列
            // (或 EJB 實例)。            EmployeeAccessBeanTable emptable = new EmployeeAccessBeanTable();

                        // 填入表格的一個可能方式是呼叫下列方法
                        //emptable.setEmployeeAccessBean(aem);

                        // 這是另一個方式
                        while ( aem.hasMoreElements() ) {
                                    EmployeeAccessBean empab_temp = (EmployeeAccessBean) aem.nextElement();
                                    emptable.addRow(empab_temp);
                                    empab_temp.refreshCopyHelper();
                                    System.out.println("    Employee Name: " + empab_temp.getName());
                                    System.out.println("    Employee Salary: " + empab_temp.getSalary());
            }

                        // 建置好表格之後,用戶端就可以使用它,
            // 執行它的各種作業,而不需要進行任何
            // 伺服器端的通訊
}

                else {
                          System.out.println("Could not find a department for employee id#" + empid);
        }

    }


        catch ( Exception e ) {
                        e.printStackTrace();
    }

}
}
相關概念
Access Bean
JSP 檔和 Servlet (Access Bean) 的程式設計模型
EJB Access Bean 和用戶端應用程式
相關工作
建立 EJB Access Bean
使用條款 | 讀者意見
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.