Oracle Application Server アプリケーション開発者ガイド 10gリリース2(10.1.2) B15629-01 |
|
前の章では、サンプル・アプリケーション1がMVC(Model-View-Controller)設計パターンに基づいていることを説明しました。この章では、アプリケーション内のモデル(Model)およびコントローラ(Controller)について説明します。ビュー(View)については、第5章「プレゼンテーション・ページの作成」で説明します。
サンプル・アプリケーション1のビジネス・ロジックは、特定の従業員についての従業員情報の表示、給付項目の追加、および給付項目の削除で構成されます(「サンプル・アプリケーション1の要件」を参照)。
このアプリケーションのデータベース・スキーマを復習しておくと、この章の内容を理解するために役立ちます。「データベース・スキーマ」を参照してください。
JSPページにはプレゼンテーション・データが含まれています。また、JSPページによって、特定の処理(従業員情報の問合せ、給付項目の追加および給付項目の削除)を実行するためのビジネス・ロジック・オブジェクトが起動されます。これらのオブジェクトとして、プレーンなJavaクラスまたはEJBオブジェクトを使用できます。
サンプル・アプリケーション1では、今後ユーザーに追加の機能を提供する予定であるため、EJBを使用します。EJBコンテナは、アプリケーションが必要とするサービスを提供します。
サンプル・アプリケーション1では、次のEJBが必要です。
アプリケーションでは、データベースに問い合せて、取得したデータを表示する必要があります。この場合、Entity Beanを使用します。
アプリケーションでは、このオブジェクトを使用して、ユーザーに割り当てられていない給付項目をチェックします。
DAOは、データ・ソースへの接続に使用します。EJBからデータ・ソースには直接接続しません。
ActionHandler
オブジェクトこれらは、アプリケーションのMVC設計パターンを実装するために必要なオブジェクトです。
アプリケーションでは、ユーティリティ・オブジェクトを使用して、特定のタスクを実行します。デバッグ・メッセージを出力するクラス、アプリケーションの他のクラスで使用される定数を定義するクラスなどがあります。
アプリケーションでは、EJBをまったく使用せずに、プレーンなJavaクラスを使用してデータを保持することもできます。しかし、アプリケーションの規模が大きくなって機能が増えた場合には、EJBを使用する方が便利です。その理由は、EJBの構成要素であるコンテナによって、永続性やトランザクションなどのサービスを提供できるからです。
EJBを使用することの利点として、EJB標準に慣れている開発者が多いこともあげられます。自社開発の独自のシステムを開発者が習得するには時間がかかるものです。
EJB、サーブレットおよび通常のJavaオブジェクトの中から、目的にかなうオブジェクトを選び出すためのガイドラインを次に示します。
次の場合には、EJBの使用が適しています。
次の場合には、サーブレットの使用が適しています。
HttpSession
オブジェクト)。
次の場合には、Javaオブジェクトの使用が適しています。
コントローラ・サーブレットは、リクエストを最初に処理するアプリケーションのオブジェクトです。コントローラには、アクションとクラスのマッピングが保持されます。ここで実行される処理は、リクエストを対応するクラスにルーティングすることのみです。
マッピングは、サーブレットの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(); } } }
コントローラ・サーブレットのprocess
メソッドは、リクエストにマップされたクラスをチェックし、ActionHandlerFactory
クラスのcreateActionHandler
をコールして、マップされたクラスのインスタンスをインスタンス化します。
アプリケーションでは、3つのアクションを3つのクラスにマップします。これらのクラスは、ActionHandler
インタフェースを実装するAbstractActionHandler
抽象クラスのサブクラスになります。また、performAction
メソッドを実装する必要があります。図4-1にこれらのクラスの関係を示します。
performAction
メソッドは、リクエストがブラウザまたはワイヤレス・デバイスのいずれから発信されたものであるかをチェックして、リクエストを適切なJSPファイルに転送します。そのJSPファイルから、ブラウザの場合にはHTMLが戻され、ワイヤレス・デバイスの場合にはXMLが戻されます。たとえば、ブラウザからのリクエストの場合、QueryEmployee.java
のperformAction
メソッドはリクエストをqueryEmployee.jsp
ファイルに転送します。ワイヤレス・デバイスからのリクエストの場合、このメソッドはリクエストをqueryEmployeeWireless.jsp
ファイルに転送します。
従業員データは、Employee
Entity Beanにマップされます。Beanのホーム・インタフェースまたはリモート・インタフェースによって、従業員データを取得するメソッド、給付項目を追加するメソッド、および給付項目を削除するメソッドを宣言します。
Beanの各インスタンスは各従業員のデータを表します。これらのインスタンスはクライアント間で共有できます。EJBコンテナでは、Entity Beanをインスタンス化して、Beanにアクセスするリクエストを待機します。EJBコンテナでは、Beanインスタンスを共有し、それらが必要になる前にインスタンス化しておくことで、インスタンスをより効率よく使用し、より高いパフォーマンスを提供できます。これは、多数のクライアントを持つアプリケーションにとっては重要なことです。
employees表が非常に大きい場合は、Entity Beanの有効性が低下します。その理由は、アプリケーションで多数の細かなオブジェクトを使用することになるためです。
Employee
Beanは従業員データをタイプEmployeeModel
のm_emp
と呼ばれるメンバー変数に内部的に格納します。このクラスには、個々のデータ項目(電子メール・アドレス、職種ID、電話番号など)を取得するためのメソッドがあります。
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をキーにして問合せ処理を実行します。
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を使用してデータベースにアクセスし、必要な処理を実行します。
getDetails
メソッドは、EmployeeModel
のインスタンスを戻します。このインスタンスには従業員情報が含まれます。問合せ処理時に、このメソッドをコールして、従業員データを取得および表示します。JSPページからはEmployeeManager
のgetEmployeeDetails
メソッドをコールします。そして、getEmployeeDetails
メソッドがgetEmployee
メソッドをコールします(図4-4を参照)。getEmployee
メソッドはEmployee
オブジェクトを戻し、EmployeeManager
はこのEmployee
オブジェクトでgetDetails
メソッドを起動します。getDetails
メソッドは、EmployeeManager
にEmployeeModel
オブジェクトを戻します。EmployeeManager
は、それをJSPに戻します。
Employee
Entity Beanでは、コンテナ管理の永続性ではなく、Bean管理の永続性(BMP)を使用します。BMPの場合には、Beanが、データベース内のデータを更新するタイミングを制御します。
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()); } }
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
データ・アクセス・オブジェクト(DAO)は、データベース(一般的には、データ・ソース)と通信するアプリケーションの唯一のクラスです。アプリケーションのEntity BeanおよびSession Beanは、データ・ソースとは通信しません。
ビジネス・ロジックをデータ・アクセス・ロジックと分離することで、データ・ソースを独立して容易に変更できます。たとえば、データベース・スキーマまたはデータベース・ベンダーが変更された場合、更新する必要があるものはDAOのみです。
DAOには、インタフェースおよび実装があります。EJBからDAOにアクセスするときには、インタフェースで宣言されたメソッドを起動します。実装には、データ・ソースに固有のコードが含まれています。
DAOの詳細は、次のWebサイトを参照してください。
http://java.sun.com/blueprints/patterns/DAO.html
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; }
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などの異なるメカニズムを使用してデータ・ソースにアクセスする場合もあります。
Employee
Beanは、給付項目を追加または削除した後に、EmployeeDAOImpl
のload
メソッドをコールします。
// 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
を自動的にコールすることに注意してください。
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を多くのクライアントで共有できます。
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
メソッドは、BenefitCatalogBean
にejbCreate
として実装されます。このメソッドは、データベース内のBENEFITS
表への問合せを実行し、給付項目のマスター・リストを取得します。戻されたデータ(給付ID、給付名、給付内容)は、BenefitModel
オブジェクトに保存されます。各レコード(すなわち、各給付項目)は、1つのBenefitModel
オブジェクトに保存されます。
アプリケーションでは、給付データが必要になったときではなく、EJBコンテナがBeanを作成するときに給付データを取得することで、パフォーマンスが向上します。その後、アプリケーションでは、データが必要になったときにBeanへの問合せを実行できます。
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
メソッドによって)コールされます。ユーザーの選択している給付項目がマスター・リストと比較され、選択していない給付項目が表示されます。これによって、ユーザーは、このリストの中から追加する給付項目を選択できます。
BenefitCatalog
Beanには、BenefitModelのコレクションが含まれます。BenefitModel
クラスには、各給付項目の詳細情報(給付ID、給付名および給付内容)が含まれます。
BenefitCatalog
Beanには、Collectionタイプのm_benefits
と呼ばれるクラス変数が含まれます。コレクションの中のデータは、BenefitModel
タイプです。個々のBenefitModel
には給付項目に関する情報(給付ID、給付名、給付内容など)が含まれます。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 %>
EmployeeManager
はEmployee
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のメソッドが起動されます。
処理 | メソッド |
---|---|
従業員データの問合せおよび表示 |
|
給付項目の追加 |
|
給付項目の削除 |
|
例:
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のクラス
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
メソッドでは、なにも実行されません。
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; }
EmployeeManager
のgetUnelectedBenefitItems
は、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
が取得されます。次に、EmployeeModel
のgetBenefits
メソッドがコールされ、その従業員の給付項目のリストが表示されます。これによって、ユーザーは、このリストの中から削除する給付項目を選択できます。
// 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 %>
アプリケーションでは、次のユーティリティ・クラスを使用します。
AppJNDINames
: Beanおよびクラスのロケーティングに使用する定数を定義します。
SessionHelper
: 問合せ文字列のパラメータ名の識別に使用する定数を定義します。
|
Copyright © 2003, 2004, Oracle. All Rights Reserved. |
|