Enterprise JavaBeans Distilled(1) |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
http://www.javaresearch.org/article/showarticle.jsp?column=107&thread=10469 Enterprise JavaBeans Distilled(1) worldheart 原創 寫作動因: 鑒於Enterprise JavaBeans(簡稱,EJB)技術本身的魅力,EJB開發者,企業商 務J2EE應用系統,現有中文資料的缺乏,個人的興趣等等構成了本人寫作本文的 源泉。本人水準有限,不對的地方,望來函、來信批評指正!謝謝! 另一方面,EJB技術現在成了很多產品的賣點,所以對於開發者來說,掌握這種 技能變得很重要。EJB技術誕生的時間不長,在國內應用也剛剛起步,國內也有 不少這方面的資料、書籍,但都有這樣幾個毛病。第一,內容沒有深度,比如用 什麼工具開發一個EJB實例,一步一步教會讀者具體應用,這種內容對於初學者 而言有一定幫助。第二,EJB技術是很好的,為什麼好呢?我們都會去用它,我 想很多人都忽視了技術本身的內部機理。第三,每個技術領域都有自己的核心內 容,這些資料都沒有教會讀者如何面對新技術快熟的切入到核心層的方法,如果 以後出現了“Java 3”呢?等等這些問題,是我們值得考慮的。在國外,EJB技 術用的很多,通過http://java.sun.com 中提供的EJB郵件列表內容就知道別人 的水準了。 其實,EJB技術儘管複雜、難學,但還是有很好的辦法來學的,就像UML一樣,抓 住根本、先不管細節部分,這也是本文的題目用意所在! 帶上這些問題,開始我們的EJB技術之旅。希望大家旅途愉快。 開題 EJB技術是Sun公司發明的,從發明至今已經發佈了3個版本的EJB規範,1.0,1.1,2.0。 EJB 2.1版已經發佈了被提義的最終草案(http://java.sun.com/products/ejb/ ,詳細地址) 。EJB規範定義了元件開發者和EJB伺服器廠商各自的職責。元件開發者根據EJB 規範中定義的編程模型編寫EJB。遵循EJB規範的EJB在各個EJB伺服器中都可以移 植。這樣的一種編程模型給EJB開發者提供了很好的便利,EJB的產生背景是如何 呢? EJB技術將TP monitors和distributed-component services中的優點吸收過來, 同時把它們的缺點拋棄掉。TP monitors是一種運行用過程語言,比如COBOL、 PL/1,編寫的應用程式可靠、功能強大的平臺,該平臺管理應用環境,比如事務 性、安全性、資源管理、負載均衡、容錯等方面。所以這種平臺優勢給” mission-critical”企業級應用程式提供了很好的基礎架構。同時,TP monitors採用業界先進的3層體系結構,即由表示層、商業邏輯層和後端資源組 成。distributed-component services提供了更為先進的3層體系結構,即把商 業物件、元件放置在中間層,其他的進程可以通過其提供的romote proxies來訪 問本身(熟悉CORBA、Java RMI、DCOM的朋友,都知道這一點)。 分散式元件和負荷在傳統的TP monitors的基於過程的應用程式相比,其優點在 於,它提供了更好的重用性和靈活性,因為它們可以將不同種類的商業物件集成 起來,但這樣的元件很難編寫,同時缺少TP monitors所提供的健壯的基礎框 架。如果能夠將兩者的優勢結合起來,便構成EJB出現的緣由。EJB伺服器給 distributed components提供了類似TP monitors的環境。EJB伺服器中,類似 TP monitors環境的給出減少了開發的複雜度、distributed components的給出 使得開發者的開發效率大大提高。 EJB客戶通過JNDI、Java RMI-IIOP來訪問。這種客戶可能是Java應用程式、JSP (Servlets)、其他的EJB或者用其他語言寫的應用。 Sun公司給EJB Architecture下的定義: “The Enterprise JavaBeans architecture is a component architecture for the development and deployment of componentbased distributed business applications. Applications written using the Enterprise JavaBeans architecture are scalable, transactional, and multi-user secure. These applications may be written once, and then deployed on any server platform that supports the Enterprise JavaBeans specification.” 這樣一種定義反映出,EJB適合“mission-critical”企業級應用。 文章組織結構: 該系列文章主要以EJB 2.0規範涉及到的技術為主。開發工具建議採用JBuilder 7、伺服器自己隨意。本人採用WebLogic 7.0。關於兩者的集成,建議大家最好 看看Borland提供的集成白皮書,鏈結位址本人前面的文章中給出過。 每一次文章都會給出EJB中一個關鍵技術的分析,或者是設計實例。 ------------------------------------------------------------- 設計實例的深入分析 ------------------------------------------------------------- 要求: 本文假設讀者對EJB技術有一定熟悉,對SQL有一定瞭解就可以了。由於EJB 涉及到的技術很多,儘管每次只講述一種技術,但各種技術是相關的,所以希望 讀者諒解,因為這樣不是很好組織。 實例背景 資料庫: SQL Server 2000 作業系統: Windows 2000 開發工具; JBuilder 7 EJB伺服器: WebLogic 7.0 機器IP地址,10.11.12.58 實例綜述:通過無狀態Session Beans得到容器管理的Entity Beans中的資料, 然後把無狀態Session Beans得到的資料給JSP頁面,從而客戶可以看到所要的結 果。通過這樣一種過程使得您知道編寫EJB元件是多麼簡單的事情。 準備工作 配置好SQL Server 2000的JDBC驅動(微軟網站有下載,或者用BEA提供的也可 以!該例子中用的是微軟的JDBC)、JBuilder 7 + WebLogic 7集成環境,其他 的也可以。 開發過程 1. 配置JDBC資料源:這個過程包括兩個步驟,首先配置連接池(Connection Pools)。(為什麼採用連接池:開發人員不想編寫Database方面的代碼、更換資 料庫系統變得簡單、限制資料庫的連接數量、不需要為每個客戶建立新連接。這 種池的概念在J2EE中有很多地方出現了,比如EJB本身)配置的參數如下: Name: cacd URL: jdbc:microsoft:sqlserver://10.11.12.58:1433;user=sa;password=cacd; Driver ClassName: com.microsoft.jdbc.sqlserver.SQLServerDriver Initial Capacity: 3 Maximum Capacity: 10 其次,配置JDBC資料源,在Tx Data Sources中配置的參數如下: Name: cacd JNDI Name: cacd Pool Name: cacd(要與前面的相匹配!) (Tx Data Sources與一般的Data Sources 區別何在?讀給讀者思考、討論。) 其中,在URL中,你需要為SQL Server 2000配置一個用戶名sa,密碼為cacd,因 為這裏用的是Type 4的JDBC,所以需要將SQL Server 2000的用戶認證修改為: NT+SQL Server 2000混合認證。 2. 資料庫的建立:Entity Beans代表了Database中的資料,所以需要資料庫支 援,但一般情況下,我們知道,可以根據容器管理的Entity Beans導出SQL DDL。另一方面,可以根據SQL DDL生成容器管理的Entity Beans。兩種方法都可 以。比如JBuilder 7兩種方法都提供了。但我想,資訊模型(資料庫)的建立在 編碼之前就應該存在,所以建議採用第二種辦法。當然有些時候第一種會較為合 理些,因為並不是表中所有的欄位都會映射到Entity Beans中。該例子中建立了 這樣這樣一個Table: /*===================================================*/ /* Table : techniquespec */ /*===================================================*/ create table techniquespec ( techniqueitem char(100) not null, units char(10) null, minvalue decimal(16,6) null, maxvalue decimal(16,6) null, types char(1) null, signon char(1) null, constraint PK_TECHNIQUESPEC primary key (techniqueitem) ) 其中,開發人員在建表的過程中,不需要手工去寫SQL DDL語句,一般都可以借 助於工具進行,比如PowerDesigner、ERWin等工具。用用就會了,不要對工具產 生不好的情緒,但前提是你熟悉資料庫理論。 用戶建好Table後,可以填入資料,中文的也可以。 3. 容器管理的Entity Beans的開發:JBuilder對EJB開發支援的比較好,提供 了圖形化的方式。由於我們已經建立好了Database,前面的techniquespec表, 我們可以借助於Import Schema From Database,將SQL DLL引入進來。(由於這 裏不能貼出操作圖片,所以只能用文字說明梗概,大家在設計過程中有什麼問 題,可以發郵件給我,我盡力而為。)在這個過程中,一定要注意JNDI的名字和 資料源中的JNDI要一致。得到SQL DLL後,我們可以根據techniquespec表生成 CMP 2.0 Entity Beans,在這裏我們採用LocalHome訪問Entity Beans,為什麼 採用?後續文章中都會詳細闡述。現在想返回表techniquespec中列 techniqueitem的所有內容。首先,真假一個findByTypes Finder方法,EJB QL 語句為: SELECT OBJECT(p) from Techniquespec AS p,其中返回值為 Collection。下面給出代碼。 LocalHome介面: package cacdsystem;import javax.ejb.*;import java.util.*;public interface TechniquespecHome extends javax.ejb.EJBLocalHome{public Techniquespec create(String techniqueitem) throws CreateException;public Collection findByTypes() throws FinderException;//添加的Finder方法public Techniquespec findByPrimaryKey(String techniqueitem) throws FinderException;} Local介面: package cacdsystem;import javax.ejb.*;import java.util.*;import java.math.*;public interface Techniquespec extends javax.ejb.EJBLocalObject{public String getTechniqueitem();public void setUnits(String units);public String getUnits();public void setMinvalue(BigDecimal minvalue);public BigDecimal getMinvalue ();public void setMaxvalue(BigDecimal maxvalue);public BigDecimal getMaxvalue();public void setTypes(String types);public String getTypes();public void setSignon(String signon);public String getSignon();} bean類: package cacdsystem;import javax.ejb.*;abstract public class TechniquespecBean implements EntityBean{EntityContext entityContext;public java.lang.String ejbCreate(java.lang.String techniqueitem) throws CreateException {setTechniqueitem (techniqueitem);return null;}public void ejbPostCreate (java.lang.String techniqueitem) throws CreateException {}public void ejbRemove() throws RemoveException {}public abstract void setTechniqueitem(java.lang.String techniqueitem);public abstract void setUnits(java.lang.String units);public abstract void setMinvalue (java.math.BigDecimal minvalue);public abstract void setMaxvalue (java.math.BigDecimal maxvalue);public abstract void setTypes (java.lang.String types);public abstract void setSignon (java.lang.String signon);public abstract java.lang.String getTechniqueitem();public abstract java.lang.String getUnits();public abstract java.math.BigDecimal getMinvalue();public abstract java.math.BigDecimal getMaxvalue();public abstract java.lang.String getTypes();public abstract java.lang.String getSignon();public void ejbLoad(){}public void ejbStore(){}public void ejbActivate(){}public void ejbPassivate(){}public void unsetEntityContext() {this.entityContext = null;}public void setEntityContext (EntityContext entityContext){this.entityContext = entityContext;}} 4. 無狀態Session Beans的開發: 通過EJB 圖形設計器,生成一個Session Bean,代碼如下。 Home介面: package cacdsystem;import javax.ejb.*;import java.util.*;import java.rmi.*;public interface VocHome extends javax.ejb.EJBHome {public Voc create() throws CreateException, RemoteException;} Remote介面: package cacdsystem;import javax.ejb.*;import java.util.*;import java.rmi.*;public interface Voc extends javax.ejb.EJBObject {public Collection getVocTechnique() throws RemoteException;} bean類: package cacdsystem;import javax.ejb.*;import java.util.*;public class VocBean implements SessionBean {SessionContext sessionContext;TechniquespecHome techniquespecHome;public void ejbCreate() throws CreateException {}public void ejbRemove() {}public void ejbActivate() {}public void ejbPassivate() {}public void setSessionContext(SessionContext sessionContext) {this.sessionContext = sessionContext;try{javax.naming.Context context = new javax.naming.InitialContext();techniquespecHome = (TechniquespecHome) context.lookup("Techniquespec");}catch (Exception ex) {System.out.println("Techniquespecs調用出錯!");throw new EJBException (ex);}}public java.util.Collection getVocTechnique() {/**@todo Complete this method*//*** 獲得全部技術需求項函數! */System.out.println("調用getVocTechnique()!");java.util.Collection collection = null;java.util.List results = new ArrayList();try {collection= techniquespecHome.findByTypes();if(collection.size() > 0) {System.out.println(collection.size());Iterator iter = collection.iterator();String tempStr = null;Techniquespec techniqu = null;while(iter.hasNext()){techniqu = (Techniquespec) iter.next ();tempStr = techniqu.getTechniqueitem();tempStr = charASC.chinTOISO (tempStr);results.add(tempStr);}}}catch (Exception ex) {ex.printStackTrace();throw new EJBException(ex);}return results;}} 說明:(1)我們在Session Bean中添加了一個商務方法,getVocTechnique(), 以獲得techniqueitem中的全部內容。(2)setSessionContext中,我們完成了 EJB的一些初始化工作。(3) charASC.chinTOISO是用於中文轉換的靜態方法, 代碼如下: package cacdsystem;public class charASC{static private String results = null;public charASC(){}static public String chinTOISO(String temp) {if(temp == null){results = "";}else{try{results = new String (temp.getBytes("ISO-8859-1"),"gb2312");results = results.trim();}catch (Exception ee){System.out.println("中文轉換失敗!");}}return results;}} 5. JSP頁面的開發:針對Session Bean,我編寫了一個JSP頁面。 <%@page contentType="text/html;charset=gb2312"%> <%@page import="java.text.*" %> <%@page import="java.util.*"%> <%@page import="java.sql.*" %> <%@page import="javax.naming.*" %> <%@page import="java.lang.*" %> <%@page import="javax.rmi.PortableRemoteObject" %> <%@page import="javax.ejb.* "%> <%@page import="cacdsystem.*"%> <html> <head> <title>產品技術需求提取</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> <form id=form name=form1 method=post> <input type=hidden id=pageFlag name=pageFlag value='input'>
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |