基於EJB技術的商務預訂系統的開發
作者:Eve Cole
更新時間:2009-07-02 17:12:35
技術已經越來越多地應用到大型網路系統開發中,本文中,筆者將介紹EJB(Enterprise Java Beans)的定義、基於EJB技術的應用系統結構模型以及EJB元件的內容和分類,最後結合基於EJB的結構模型和EJB組件開發了一個商務預訂系統。
EJB從技術上而言不是一種“產品”,而是一種技術規格。 SUN公司對EJB的定義是:EJB的結構是開發和配置基於元件的分散式商務應用程式的一種元件結構。用EJB結構開發的應用程式是可伸縮的、事務型的、多用戶安全的。這些應用程式可能只需編寫一次,卻可以在支援EJB規範的任務伺服器平台上進行設定。總的來說,EJB是一個組件事務監控的標準伺服器端的元件模型。
基於EJB技術的系統結構模型
EJB結構是一個服務端元件結構,是一個層次性結構,其結構模型如圖1所示。此結構模型在通常情況下可分為客戶層、業務邏輯層和資料層,以下筆者對此作一簡單介紹。
圖1:基於EJB的應用結構模型
客戶層 主要是用來滿足整個系統的各種存取需求並處理以下工作:
接收使用者的輸入,也可以對使用者的輸入進行分析檢查並作對應的處理;
顯示由伺服器端高層傳來的運作結果。
客戶層通常由客戶進程組成,這些進程由瀏覽器動態地建立和撤銷。
業務邏輯層 這是整個系統最關鍵的部分。業務邏輯層在通常情況下會分為兩層,其高層是請求接收層(一般稱為Web層),用於接收從瀏覽器傳來的請求並將請求交給底層進行處理,同時將請求處理結果傳送給瀏覽器。這些過程主要由JSP頁面、基於Web的Applets以及顯示 HTML頁面的Servlets組成。底層是請求處理層(一般稱為EJB層),包括監聽進程、處理進程和資料庫操作進程,負責處理請求接收層傳來的客戶請求並對它進行處理,同時將請求結果傳遞給請求接收層,如果需要的話還需要將處理結果交給資料層儲存。
資料層主要是為業務邏輯層提供資料服務,例如儲存業務邏輯層處理結果、傳回業務邏輯層檢索的資料結果,同時也是為了實現屏蔽資料來源的變化,從而實現當資料庫發生變化時我們只需修改連接資料來源的語句就可以。
EJB元件的分類通常情況下,服務端的EJB元件有兩種基本類型:Entity Bean(實體Bean)和Session Bean(會話Bean)。
圖2:商務預訂系統的架構
Entity Bean是為了現實世界的物件而建造的模型,這些物件通常是資料庫的一些持久記錄。 Entity Bean為那些可以表達成名詞的商務概念建立模型,它既描述了真實世界物件的狀態,也描述了它們的行為,同時允許開發者封裝與具體概念有關的資料和商務規則。 Session Bean是一種透過Home Interface建立並對客戶端連接專有的Enterprise Bean,Session bean實例一般不與其它客戶端共用。 Session Bean是客戶端應用程式的擴展,並負責管理整個流程或任務。 Session Bean可以管理Entity Bean之間的交互,描述它們如何一起工作來完成一個特殊任務。
Entity Bean根據管理持久性的方式可以分為容器管理的Bean和使用Bean管理的Bean。容器管理的Bean由EJB容器自動管理它們的持久性,容器知道Bean實例的欄位是怎樣映射到資料庫中去,並自動管理插入、更新和刪除資料庫中與實體有關的資料;使用Bean管理持久性的Bean需要明確地完成所有這些工作。 Bean的開發者必須編寫程式碼操作資料庫,EJB容器只告訴Bean實例什麼時候可以在資料庫中安全地插入、更新和刪除數據,除此之外,它不提供任何別的幫助。 Bean實例自己完成所有持久性的工作。
Session Bean依是否有狀態可分為無狀態Bean和有狀態Bean。無狀態Session Bean傾向於通用且可重複使用;有狀態Session Bean是客戶應用程式的擴展,它代表客戶完成任務並維護客戶的相關狀態。
商務預訂系統的開發客艙預訂系統是在J2EE平台上開發的基於EJB組件技術的商務預訂系統,其主要流程是用戶登錄以後,將被依次帶領著通過顧客選擇頁和導航選擇頁,並將為顧客選擇一個可獲得的客艙(從TraveAgentBean處獲得可供選擇的客艙列表,TravelAgentBean的listAvailableCabin()方法由生成此網頁的Servlet調用,客艙列表將用於裝載到用戶瀏覽器的網頁上創建HTML列錶框) ,當使用者選擇一間客艙並提交了選擇時,一個HTTP請求將會傳送到EJB伺服器(Websphere Application Server),伺服器接到此請求後,將其分派給ReservationServlet,此Servlet呼叫TravelAgent.BookPassage()方法做實際的預訂,BookPassage()方法傳回的標籤資訊將用於建立另一個送回使用者瀏覽器的網頁。如果預約成功,則由ProcessPaymentServlet去呼叫ProcessPaymentBean中的付款方法,從而實現對客戶的收費過程。其具體架構見圖2。
預定係統中的EJB組件主要包括以下幾個部分:
CabinBean:實體Bean,主鍵是CabinPK,是用來封裝現實世界中的航船客艙的一個實體Bean。
CustomerBean:實體Bean,主鍵是CustomerPK,是用來封裝現實世界中需要預訂航船客艙的消費者的一個實體Bean。
CruiseBean:實體Bean,主鍵是CruisePK,是用來封裝現實世界中航船航線的一個實體Bean。 ReservationBean:實體Bean,主鍵是CruiseID,CabinID,它代表了資料庫中不變的記錄,即預訂,它記錄了預訂系統的歷史事件,主要是用來防止雙重預訂,即兩個客戶預訂相同航線的相同客艙,產生這種問題的原因是因為客戶選擇客艙和航線的時刻與呼叫bookPassage()方法的時刻之間有一段間隔時間。 TravelAgentBean:有狀態會話Bean,一個負責預訂航行艙位工作流程的會話Bean,它封裝了完成一條航線的一個預訂操作的過程並在全世界的旅行代理的客戶端應用程式中使用。 TravelAgentBean不僅符合消費者預訂票據的需要,還可提供在航行中剩餘客艙的消息。為了完成此任務,Bean需要知道預訂是由哪一條航線、客艙,以及客戶組成,收集到這些資訊後,由bookPassage()方法來完成處理預訂過程,它為客戶帳戶的計費負責,在正確航線的正確船隻上預訂選擇的客艙,並透過Ticket類來為客戶產生一張票據。在這裡,我們需使用CreditCard類別儲存有關客戶信用卡的相關信息,同時,ListAvailableCabins()方法用來顯示可用的尚未被預訂的客艙。
ProcessPaymentBean:無狀態會話Bean,它是在事務系統中向消費者收費的過程。它定義了支票、現金和信用卡支付方式的三個事務方法,即ByCheck()、ByCash()和ByCredit()。
商務預訂系統的程式碼範例整個商務預約系統的開發是在IBM VisualAge for Java下面開發完成的,在該IDE開發環境中,實體Bean相對會話Bean要容易開發得多,以下就以TravelAgentBean為例,介紹EJB元件的開發流程:
1. TravelAgent遠端介面它提供了設定客戶希望預訂的航線和客艙ID的方法。此外,也設定boolPassage()方法來為客戶的預訂進行計費,並為客戶產生一張票據。具體代碼如下:
package com.titan.travelagent;
import java.rmi.RemoteException;
import javax.ejb.FinderException;
import com.titan.cruise.Cruise;
import com.titan.customer.Customer;
import com.titan.processpayment.CreditCard;
public interface TravelAgent extends javax.ejb.EJBObject
{
public void setCruiseID(int cruise) throws RemoteException, FinderException;
public int getCruiseID( ) throws RemoteException, IncompleteConversationalState;
public void setCabinID(int cabin) throws RemoteException, FinderException;
public int getCabinID()throws RemoteException, IncompleteConversationalState;
public int getCustomerID()throws RemoteException, IncompleteConversationalState;
public Ticket boolPassage(CreditCard card,double price) throws RemoteException, IncompleteConversationalState;
}
2. TravelAgent Home介面
TravelAgent Home介面程式碼如下:
puckage com.titan.tracelagent;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import com.titan.customer.Customer;
public interface TravelAgentHome extends javax.ejb.EJBHome {
public TravelAgent create(Customer cust) throws RemoteException,CreateException;}
3. TravelAgent Bean類別它需要實現TravelAgent的遠端介面和Home介面中的所有行為,限於篇幅,本文將不再介紹其實作程式碼,有興趣的讀者可自行加以完成。
透過以上步驟,我們就完成了一個商務預定係統的EJB組件的開發。