ヘッダーをスキップ

Oracle Application Server アプリケーション開発者ガイド
10gリリース2(10.1.2)
B15629-01
目次
目次
索引
索引

戻る 次へ

4
ビジネス・ロジックの実装

前の章では、サンプル・アプリケーション1がMVC(Model-View-Controller)設計パターンに基づいていることを説明しました。この章では、アプリケーション内のモデル(Model)およびコントローラ(Controller)について説明します。ビュー(View)については、第5章「プレゼンテーション・ページの作成」で説明します。

サンプル・アプリケーション1のビジネス・ロジックは、特定の従業員についての従業員情報の表示、給付項目の追加、および給付項目の削除で構成されます(「サンプル・アプリケーション1の要件」を参照)。

このアプリケーションのデータベース・スキーマを復習しておくと、この章の内容を理解するために役立ちます。「データベース・スキーマ」を参照してください。

4.1 サンプル・アプリケーション1で必要なオブジェクト

JSPページにはプレゼンテーション・データが含まれています。また、JSPページによって、特定の処理(従業員情報の問合せ、給付項目の追加および給付項目の削除)を実行するためのビジネス・ロジック・オブジェクトが起動されます。これらのオブジェクトとして、プレーンなJavaクラスまたはEJBオブジェクトを使用できます。

サンプル・アプリケーション1では、今後ユーザーに追加の機能を提供する予定であるため、EJBを使用します。EJBコンテナは、アプリケーションが必要とするサービスを提供します。

サンプル・アプリケーション1では、次のEJBが必要です。

4.2 考慮すべきその他のオプション

アプリケーションでは、EJBをまったく使用せずに、プレーンなJavaクラスを使用してデータを保持することもできます。しかし、アプリケーションの規模が大きくなって機能が増えた場合には、EJBを使用する方が便利です。その理由は、EJBの構成要素であるコンテナによって、永続性やトランザクションなどのサービスを提供できるからです。

EJBを使用することの利点として、EJB標準に慣れている開発者が多いこともあげられます。自社開発の独自のシステムを開発者が習得するには時間がかかるものです。

EJB、サーブレットおよび通常のJavaオブジェクトの中から、目的にかなうオブジェクトを選び出すためのガイドラインを次に示します。

4.2.1 EJBの使用が適している場合

次の場合には、EJBの使用が適しています。

4.2.2 サーブレットの使用が適している場合

次の場合には、サーブレットの使用が適しています。

4.2.3 通常のJavaオブジェクトの使用が適している場合

次の場合には、Javaオブジェクトの使用が適しています。

4.3 コントローラ

コントローラ・サーブレットは、リクエストを最初に処理するアプリケーションのオブジェクトです。コントローラには、アクションとクラスのマッピングが保持されます。ここで実行される処理は、リクエストを対応するクラスにルーティングすることのみです。

マッピングは、サーブレットのinitメソッドにより定義されています。このサンプルでは、アプリケーションは、マッピングをファイルにハードコードしています。マッピング情報をデータベースまたはファイルから取得する方が、柔軟性は高くなります。

コントローラはリクエストを受け取ると、doGetメソッドまたはdoPostメソッドを実行します。いずれのメソッドもprocessメソッドをコールします。processメソッドは、actionパラメータの値をチェックして、対応するクラスをコールします。

package empbft.mvc;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.HashMap;
import empbft.util.*;

/** MVC Controller servlet
*/
public class Controller extends HttpServlet
{
  /* Private static String here, not String creation out of the execution
     path and hence help to improve performance. */
  private static final String CONTENT_TYPE = "text/html";

  /** Hashtable of registered ActionHandler object. */
  private HashMap m_actionHandlers = new HashMap();

  /** ActionHandlerFactory, responsible for instantiating ActionHandlers.  */
  private ActionHandlerFactory m_ahf = ActionHandlerFactory.getInstance();

  /** Servlet Initialization method.
      @param - ServletConfig
      @throws - ServletException
  */

  public void init(ServletConfig config) throws ServletException
  {
    super.init(config);
    //Register ActionHandlers in Hashtable, Action name, implementation String
    //This really ought to come from a configuration file or database etc....
    this.m_actionHandlers.put(SessionHelper.ACTION_QUERY_EMPLOYEE, 
      "empbft.mvc.handler.QueryEmployee");
    this.m_actionHandlers.put(SessionHelper.ACTION_ADD_BENEFIT_TO_EMPLOYEE, 
      "empbft.mvc.handler.AddBenefitToEmployee");
    this.m_actionHandlers.put(SessionHelper.ACTION_REMOVE_BENEFIT_FROM_EMPLOYEE, 
      "empbft.mvc.handler.RemoveBenefitFromEmployee");
  }

  /** doGet. Handle an MVC request. This method expects a parameter "action"
      http://localhost/MVC/Controller?action=dosomething&
                                   aparam=data&anotherparam=moredata
      @param - HttpServletRequest request,
      @param - HttpServletResponse response,
  */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
  {
    process(request, response);
  }


  /** doPost. Handle an MVC request. This method expects a parameter "action"
      http://localhost/MVC/Controller?action=dosomething&
                                   aparam=data&anotherparam=moredata
      @param - HttpServletRequest request,
      @param - HttpServletResponse response,
  */
  public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
  {
    process(request, response);
  }

  private void process(HttpServletRequest request, HttpServletResponse response)
  {
    try
    {
      //Get the action from the request parameter
      String l_action = request.getParameter(SessionHelper.ACTION_PARAMETER);

      //Find the implemenation for this action
      if (l_action == null) l_action = SessionHelper.ACTION_QUERY_EMPLOYEE;
      String l_actionImpl = (String) this.m_actionHandlers.get(l_action);
      if (l_actionImpl == null) {
        throw new Exception("Action not supported.");
      }
      ActionHandler l_handler = this.m_ahf.createActionHandler(l_actionImpl);
      l_handler.performAction(request,response);
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
}

4.4 アクション・ハンドラ

コントローラ・サーブレットのprocessメソッドは、リクエストにマップされたクラスをチェックし、ActionHandlerFactoryクラスのcreateActionHandlerをコールして、マップされたクラスのインスタンスをインスタンス化します。

アプリケーションでは、3つのアクションを3つのクラスにマップします。これらのクラスは、ActionHandlerインタフェースを実装するAbstractActionHandler抽象クラスのサブクラスになります。また、performActionメソッドを実装する必要があります。図4-1にこれらのクラスの関係を示します。

performActionメソッドは、リクエストがブラウザまたはワイヤレス・デバイスのいずれから発信されたものであるかをチェックして、リクエストを適切なJSPファイルに転送します。そのJSPファイルから、ブラウザの場合にはHTMLが戻され、ワイヤレス・デバイスの場合にはXMLが戻されます。たとえば、ブラウザからのリクエストの場合、QueryEmployee.javaperformActionメソッドはリクエストをqueryEmployee.jspファイルに転送します。ワイヤレス・デバイスからのリクエストの場合、このメソッドはリクエストをqueryEmployeeWireless.jspファイルに転送します。

図4-1    アクション・ハンドラ


画像の説明

4.5 従業員データ(Entity Bean)

従業員データは、Employee Entity Beanにマップされます。Beanのホーム・インタフェースまたはリモート・インタフェースによって、従業員データを取得するメソッド、給付項目を追加するメソッド、および給付項目を削除するメソッドを宣言します。

Beanの各インスタンスは各従業員のデータを表します。これらのインスタンスはクライアント間で共有できます。EJBコンテナでは、Entity Beanをインスタンス化して、Beanにアクセスするリクエストを待機します。EJBコンテナでは、Beanインスタンスを共有し、それらが必要になる前にインスタンス化しておくことで、インスタンスをより効率よく使用し、より高いパフォーマンスを提供できます。これは、多数のクライアントを持つアプリケーションにとっては重要なことです。

employees表が非常に大きい場合は、Entity Beanの有効性が低下します。その理由は、アプリケーションで多数の細かなオブジェクトを使用することになるためです。

Employee Beanは従業員データをタイプEmployeeModelm_empと呼ばれるメンバー変数に内部的に格納します。このクラスには、個々のデータ項目(電子メール・アドレス、職種ID、電話番号など)を取得するためのメソッドがあります。

図4-2    Employeeのクラス


画像の説明

図4-3    EmployeeModelクラス


画像の説明

4.5.1 ホーム・インタフェース

Employee Entity Beanには、次のホーム・インタフェースがあります。

package empbft.component.employee.ejb;
import java.rmi.RemoteException;
import javax.ejb.*;

public interface EmployeeHome extends EJBHome
{
  public Employee findByPrimaryKey(int employeeID)
    throws RemoteException, FinderException;
}

findByPrimaryKeyメソッドはすべてのEntity Beanに必要なメソッドです。このメソッドによって、クライアントはEmployeeオブジェクトを検索できます。このメソッドは、従業員IDを主キーとして取ります。findByPrimaryKeyメソッドは、EmployeeBeanクラスにejbFindByPrimaryKeyとして実装されます。Employeeオブジェクトを検索するときには、データ・アクセス・オブジェクト(DAO)を使用してデータベースに接続し、従業員IDをキーにして問合せ処理を実行します。

関連項目

DAOの詳細は、「EmployeeDAOのクラス」を参照してください。 

4.5.2 リモート・インタフェース

Employee Beanのリモート・インタフェースによって、ビジネス・ロジック処理を実行するメソッドを宣言します。

package empbft.component.employee.ejb;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
import empbft.component.employee.helper.*;

public interface Employee extends EJBObject
{
    public void addBenefits(int benefits[]) throws RemoteException;
    public void removeBenefits(int benefits[]) throws RemoteException;
    public EmployeeModel getDetails() throws RemoteException;
}

addBenefitsメソッドおよびremoveBenefitsメソッドは、DAOを使用してデータベースにアクセスし、必要な処理を実行します。

関連項目

「Employee Beanのデータ・アクセス・オブジェクト」 

getDetailsメソッドは、EmployeeModelのインスタンスを戻します。このインスタンスには従業員情報が含まれます。問合せ処理時に、このメソッドをコールして、従業員データを取得および表示します。JSPページからはEmployeeManagergetEmployeeDetailsメソッドをコールします。そして、getEmployeeDetailsメソッドがgetEmployeeメソッドをコールします(図4-4を参照)。getEmployeeメソッドはEmployeeオブジェクトを戻し、EmployeeManagerはこのEmployeeオブジェクトでgetDetailsメソッドを起動します。getDetailsメソッドは、EmployeeManagerEmployeeModelオブジェクトを戻します。EmployeeManagerは、それをJSPに戻します。

関連項目

問合せ処理の詳細は、「従業員の問合せ処理」を参照してください。 

図4-4    従業員の詳細情報の取得


画像の説明

4.5.3 永続性

Employee Entity Beanでは、コンテナ管理の永続性ではなく、Bean管理の永続性(BMP)を使用します。BMPの場合には、Beanが、データベース内のデータを更新するタイミングを制御します。

関連項目

コンテナ管理の永続性を使用するEJBの例は、第10章「EJB 2.0の機能を使用するためのEJBの更新」を参照してください。 

4.5.4 loadメソッド

Employee Entity Beanでは、Bean管理の永続性を使用する一方で、ejbLoadメソッドを実装します。ejbLoadメソッドは(DAOを使用して)データベースへの問合せを実行し、データベースから取得した新しいデータでBean内のデータを更新します。これによって、Bean内のデータをデータベース内のデータと同期化できるようになります。

ejbLoadメソッドは、ユーザーが給付項目を追加または削除した後にコールされます。

// from EmployeeBean.java
public void ejbLoad() {
   try {
      if (m_dao == null)
          m_dao = new EmployeeDAOImpl();
      Integer id = (Integer)m_ctx.getPrimaryKey();
      this.m_emp = m_dao.load(id.intValue());
   } catch (Exception e) {
      throw new EJBException("¥nException in loading employee.¥n"
             + e.getMessage());
   }
}

関連項目

DAOのloadメソッドの説明は、「loadメソッド」を参照してください。 

4.5.5 EmployeeModelクラス

Employee Beanの実装では、EmployeeModelタイプの変数を使用します。EmployeeModelには、従業員の氏名や職種IDなど、すべての従業員の詳細情報が含まれています。次に示すコードは、EmployeeBeanのコードの一部です。ここでは、m_empがクラス変数として使用されています。

public class EmployeeBean implements EntityBean
{
  private EmployeeModel m_emp;
  ...
}

EmployeeModelのコードの一部

public class EmployeeModel implements java.io.Serializable
{
  protected int m_id;
  protected Collection m_benefits;
  private String m_firstName;
  private String m_lastName;
  private String m_email;
  private String m_phoneNumber;
  private Date m_hireDate;
  private String m_jobId;
...
}


図4-5    EmployeeおよびEmployeeModel


画像の説明

4.5.6 Employee Beanのデータ・アクセス・オブジェクト

データ・アクセス・オブジェクト(DAO)は、データベース(一般的には、データ・ソース)と通信するアプリケーションの唯一のクラスです。アプリケーションのEntity BeanおよびSession Beanは、データ・ソースとは通信しません。

関連項目

図2-2「アプリケーションのアーキテクチャ」 

ビジネス・ロジックをデータ・アクセス・ロジックと分離することで、データ・ソースを独立して容易に変更できます。たとえば、データベース・スキーマまたはデータベース・ベンダーが変更された場合、更新する必要があるものはDAOのみです。

DAOには、インタフェースおよび実装があります。EJBからDAOにアクセスするときには、インタフェースで宣言されたメソッドを起動します。実装には、データ・ソースに固有のコードが含まれています。

DAOの詳細は、次のWebサイトを参照してください。

http://java.sun.com/blueprints/patterns/DAO.html

4.5.6.1 インタフェース

EmployeeDAOインタフェースでは、データ・ソースへのインタフェースを宣言します。アプリケーションのEntity Bean、Session Beanおよびその他のオブジェクトはこれらのメソッドをコールして、データ・ソースの処理を実行します。

package empbft.component.employee.dao;
import empbft.component.employee.helper.EmployeeModel;

public interface EmployeeDAO {
  public EmployeeModel load(int id) throws Exception;
  public Integer findByPrimaryKey(int id) throws Exception;
  public void addBenefits(int empId, int benefits[]) throws Exception;
  public void removeBenefits(int empId, int benefits[]) throws Exception;
}

4.5.6.2 実装

DAOの実装はEmployeeDAOImplクラスに対して行われます。EmployeeDAOImplは、JDBCを使用してデータベースに接続し、データベースに対してSQL文を実行します。データ・ソースが変更された場合には、実装のみを更新する必要があります。インタフェースの更新は不要です。

EmployeeオブジェクトおよびBenefitオブジェクトはDAOのインスタンスを取得して、DAOのメソッドを起動します。次の例は、Employee BeanのaddBenefitsメソッドから、DAOのメソッドを起動する方法を示しています。

// from EmployeeBean.java
public void addBenefits(int benefits[])
{
    try {
      if (m_dao == null) m_dao = new EmployeeDAOImpl();
      m_dao.addBenefits(m_emp.getId(), benefits);
      ejbLoad();
    } catch (Exception e) {
      throw new EJBException ("¥nData access exception in adding benefits.¥n"
        + e.getMessage());
    }
}

EmployeeDAOImplクラスのaddBenefitsメソッドは、次のようになります。

public void addBenefits(int empId, int benefits[]) throws Exception
{
   String queryStr = null;
   PreparedStatement stmt = null;
   try {
      getDBConnection();
      for (int i = 0; i < benefits.length; i ++) {
         queryStr = "INSERT INTO EMPLOYEE_BENEFIT_ITEMS "
                 + " (EMPLOYEE_ID, BENEFIT_ID, ELECTION_DATE) "
                 + " VALUES (" + empId + ", " + benefits[i] + ", SYSDATE)";
         stmt = dbConnection.prepareStatement(queryStr);
         int resultCount = stmt.executeUpdate();
         if (resultCount != 1) {
            throw new Exception("Insert result count error:" + resultCount);
         }
      }
   } catch (SQLException se) {
      throw new Exception(
          "¥nSQL Exception while inserting employee benefits.¥n"
          + se.getMessage());
   } finally {
       closeStatement(stmt);
       closeConnection();
   }
}

EmployeeDAOImplのメソッドは、JDBCを使用してデータベースにアクセスします。別の実装では、SQLJなどの異なるメカニズムを使用してデータ・ソースにアクセスする場合もあります。

4.5.6.3 loadメソッド

Employee Beanは、給付項目を追加または削除した後に、EmployeeDAOImplloadメソッドをコールします。

// from EmployeeBean.java
public void addBenefits(int benefits[])
{
   try {
      if (m_dao == null)
         m_dao = new EmployeeDAOImpl();
      m_dao.addBenefits(m_emp.getId(), benefits);
      ejbLoad();
   } catch (Exception e) {
      throw new EJBException ("¥nData access exception in adding benefits.¥n"
          + e.getMessage());
   }
}



// also from EmployeeBean.java
public void ejbLoad()
{
   try {
      if (m_dao == null)
         m_dao = new EmployeeDAOImpl();
      Integer id = (Integer) m_ctx.getPrimaryKey();
      this.m_emp = m_dao.load(id.intValue());
   } catch (Exception e) {
      throw new EJBException("¥nException in loading employee.¥n"
          + e.getMessage());
   }
}

Employee BeanのejbLoadメソッドは、DAOオブジェクトのloadを起動します。給付項目を追加または削除した後にloadメソッドをコールすることで、アプリケーションでは、指定した従業員についてデータベースと同じデータをBeanインスタンスに保持できるようになります。

// from EmployeeDAOImpl.java
public EmployeeModel load(int id) throws Exception
{
   EmployeeModel details = selectEmployee(id);
   details.setBenefits(selectBenefitItem(id));
   return details;
}

EJBコンテナでは、findByPrimaryKeyメソッドを実行した後に、Employee BeanのejbLoadを自動的にコールすることに注意してください。

関連項目

「従業員の問合せ処理」 

図4-6    EmployeeDAOのクラス


画像の説明

4.6 給付データ(ステートレスSession Bean)

BenefitCatalogは、ステートレスSession Beanです。このSession Beanには、データベース内のBENEFITS表にある各給付項目についての給付ID、給付名、給付内容などのマスター給付情報が含まれます。

アプリケーションでは、給付情報をEntity Beanオブジェクトに保存することもできますが、ここではSession Beanを使用します。その理由は、マスター給付情報はアプリケーション内で変更されないためです。Session Beanを使用して、EJBコンテナがBeanを作成するときにデータを1回のみ取得する方が効率的です。

給付情報は変更されないので、BenefitCatalog Beanでは、データベースにアクセスするためのデータ・アクセス・オブジェクト(DAO)は必要ありません。Session Bean自体がデータベースと通信します。

Session Beanの各インスタンスには、すべての給付情報が含まれます。同時実行性とスケーラビリティを高めるために、複数のインスタンスを作成してプーリングすることができます。アプリケーションでEntity Beanを使用して、1つの給付項目を1つのBeanにマップした場合、給付項目ごとに1つのインスタンスが必要になります。

このSession Beanはステートレスであるため、1つのBeanを多くのクライアントで共有できます。

図4-7    BenefitCatalogのクラス


画像の説明

4.6.1 ホーム・インタフェース

BenefitCatalog Session Beanには、次のホーム・インタフェースがあります。

package empbft.component.benefit.ejb;
import java.rmi.RemoteException;
import javax.ejb.EJBHome;
import javax.ejb.CreateException;

public interface BenefitCatalogHome extends EJBHome
{
  public BenefitCatalog create() throws RemoteException, CreateException;
}

createメソッドは、BenefitCatalogBeanejbCreateとして実装されます。このメソッドは、データベース内のBENEFITS表への問合せを実行し、給付項目のマスター・リストを取得します。戻されたデータ(給付ID、給付名、給付内容)は、BenefitModelオブジェクトに保存されます。各レコード(すなわち、各給付項目)は、1つのBenefitModelオブジェクトに保存されます。

アプリケーションでは、給付データが必要になったときではなく、EJBコンテナがBeanを作成するときに給付データを取得することで、パフォーマンスが向上します。その後、アプリケーションでは、データが必要になったときにBeanへの問合せを実行できます。

4.6.2 リモート・インタフェース

BenefitCatalog Session Beanには、次のリモート・インタフェースがあります。

package empbft.component.benefit.ejb;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
import java.util.Collection;

public interface BenefitCatalog extends EJBObject
{
  public Collection getBenefits() throws RemoteException;
  public void refresh() throws RemoteException;
}

getBenefitsメソッドは、BenefitModelsのコレクションを戻します。これは、すべての給付項目のマスター・リストです。ユーザーの選択していない給付項目をアプリケーションで表示する必要があるときに、このメソッドがEmployeeManager Beanによって(getUnelectedBenefitItemsメソッドによって)コールされます。ユーザーの選択している給付項目がマスター・リストと比較され、選択していない給付項目が表示されます。これによって、ユーザーは、このリストの中から追加する給付項目を選択できます。

4.6.3 給付項目の詳細情報

BenefitCatalog Beanには、BenefitModelのコレクションが含まれます。BenefitModelクラスには、各給付項目の詳細情報(給付ID、給付名および給付内容)が含まれます。

BenefitCatalog Beanには、Collectionタイプのm_benefitsと呼ばれるクラス変数が含まれます。コレクションの中のデータは、BenefitModelタイプです。個々のBenefitModelには給付項目に関する情報(給付ID、給付名、給付内容など)が含まれます。BenefitItemは、BenefitModelのサブクラスです。

図4-8    BenefitItemクラスおよびBenefitModelクラス


画像の説明

JSPによって、BenefitModelのメソッドがコールされ、給付情報が表示されます。たとえば、queryEmployee.jspによってgetNameメソッドがコールされ、給付名が表示されます。

<%
    Collection benefits = emp.getBenefits();
    if (benefits == null || benefits.size() == 0) {
  %>
      <tr><td>None</td></tr>
  <%
    } else {
      Iterator it = benefits.iterator();
      while (it.hasNext()) {
        BenefitItem item = (BenefitItem)it.next();
  %>
        <tr><td><%=item.getName()%></td></tr>
  <%
      } // end of while
    } // end of if
  %>

4.7 EmployeeManager(ステートレスSession Bean)

EmployeeManagerEmployee Entity Beanへのアクセスを管理するためのステートレスSession Beanです。EmployeeManagerは、JSPが直接アクセスできる唯一のBeanです。その他のBean(EmployeeおよびBenefitCatalog)をJSPが直接起動することはありません。これらのBeanのメソッドを起動する場合、JSPはEmployeeManagerを介して起動します。

一般的に、JSPでは、Entity Beanのインスタンスを取得して、Entity Beanのメソッドを直接起動することはありません。その場合、クライアントのセッション状態を管理して、複数のBeanを処理するビジネス・ロジックを実装する中間Beanが必要になります。このような中間Beanがないときには、JSPにビジネス・ロジックを作成する必要があります。その場合、JSPにビジネス・ロジックを格納することはできません。JSPの唯一の機能は、データを表示することです。

このBeanには、クライアントに固有のデータは含まれないため、ステートレスとなります。

EmployeeManagerには、JSPによって起動され、ビジネス・ロジック処理を実行する(リモート・インタフェースで定義される)メソッドが含まれます。これらのメソッドによって、Employee BeanおよびBenefitCatalog Beanのメソッドが起動されます。

表4-1    ビジネス・ロジック処理を実行するためのEmployeeManagerのメソッド 
処理  メソッド 

従業員データの問合せおよび表示 

getEmployeeDetails(empID) 

給付項目の追加 

getUnelectedBenefitItems(empID) 

給付項目の削除 

getEmployeeDetails(empID): このメソッドによってEmployeeModelが戻された後に、EmployeeModelのgetBenefits()を使用します。 

例:

addBenefitToEmployee.jsp内のコード

<%
  int empId = Integer.parseInt(request.getParameter(
                              SessionHelper.EMP_ID_PARAMETER));
  EmployeeManager mgr = SessionHelper.getEmployeeManager(request);
  Collection unelected = mgr.getUnelectedBenefitItems(empId);
  ...
%>


removeBenefitFromEmployee.jsp内のコード

<%
  int empId = Integer.parseInt(request.getParameter(
                        SessionHelper.EMP_ID_PARAMETER));
  EmployeeManager mgr = SessionHelper.getEmployeeManager(request);
  Collection elected = mgr.getEmployeeDetails(empId).getBenefits();
  ...
%>


図4-9    EmployeeManagerのクラス


画像の説明

4.7.1 ホーム・インタフェース

EmployeeManagerには、次のホーム・インタフェースがあります。

package empbft.component.employee.ejb;

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

public interface EmployeeManagerHome extends EJBHome
{
  public EmployeeManager create() throws RemoteException, CreateException;
}

createメソッドでは、なにも実行されません。

4.7.2 リモート・インタフェース

EmployeeManagerには、次のリモート・インタフェースがあります。

package empbft.component.employee.ejb;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
import java.util.Collection;
import empbft.component.employee.helper.*;

public interface EmployeeManager extends EJBObject
{
  public Employee getEmployee(int id) throws RemoteException;
  public EmployeeModel getEmployeeDetails(int id) throws RemoteException;
  public Collection getUnelectedBenefitItems(int id) throws RemoteException;
}

EmployeeManagergetUnelectedBenefitItemsは、BenefitCatalog Beanのメソッドを起動して、JSPにコレクションを戻します。JSPはこのコレクションを繰り返し処理して、コレクションの内容を表示します。

EmployeeManagerのメソッドから、非Beanオブジェクトがアプリケーションに戻されることもあります。たとえば、queryEmployee.jspによってgetEmployeeDetailsメソッドが起動され、このメソッドからEmployeeModelが戻されます。これにより、JSPはEmployeeModelのメソッドを起動して、従業員データを抽出できます。

// from queryEmployee.jsp
<%
   int id = Integer.parseInt(empId);
   EmployeeManager mgr = SessionHelper.getEmployeeManager(request);
   EmployeeModel emp = mgr.getEmployeeDetails(id);
   ...
%>
...
<table>
<tr><td>Employee ID: </td><td colspan=3><b><%=id%></b></td></tr>
<tr><td>First Name: </td><td><b><%=emp.getFirstName()%></b></td>
<td>Last Name: </td><td><b><%=emp.getLastName()%></b></td></tr>

同様に、removeBenefitFromEmployee.jspの場合には、このJSPページによって、getEmployeeDetailsメソッドがコールされ、EmployeeModelが取得されます。次に、EmployeeModelgetBenefitsメソッドがコールされ、その従業員の給付項目のリストが表示されます。これによって、ユーザーは、このリストの中から削除する給付項目を選択できます。

// from removeBenefitFromEmployee.jsp
<%
  int empId = Integer.parseInt(request.getParameter(
                          SessionHelper.EMP_ID_PARAMETER));
  EmployeeManager mgr = SessionHelper.getEmployeeManager(request);
  Collection elected = mgr.getEmployeeDetails(empId).getBenefits();
  ...
%>
...
<h4>Select Elected Benefits</h4>
<%
   Iterator i = elected.iterator();
   while (i.hasNext()) {
      BenefitItem b = (BenefitItem) i.next();
%>
<input type=checkbox name=benefits value=<%=b.getId()%>><%=b.getName()%><br>
<%
   }   // end while
%>

4.8 ユーティリティ・クラス

アプリケーションでは、次のユーティリティ・クラスを使用します。


戻る 次へ
Oracle
Copyright © 2003, 2004, Oracle.

All Rights Reserved.
目次
目次
索引
索引