很多人都知道J2EE,但有多少人真正知道它的含義呢?簡單的說,J2EE是一套商業應用系統模型或者說是一種規范,它包含java遠程方法調用(RMI)、企業級javaBean(EJB)、java消息服務(JMS),java服務器頁面(JSP)等等。利用J2EE的資源我們可以方便、迅速的創建一個強大的企業級應用,比如電信的收費系統,企業的知識管理系統等。你可能會想,開發這麼強大的系統,一定需要大量的投資吧?其實不然,我們利用現有的網絡找就可以找到免費甚至是開源的部件,再將他們組裝成一個可用的系統。我們的目標是白手起家!當然買電腦的錢你得自己掏:
本文以下列組件為例來構建我們的J2EE系統。請大家注意各組件的版本號,否則可能出現組件間的兼容問題:底層數據庫用mySQL3.23.35,EJB和Web服務器用Jboss3.2.3,而開發環境我們選用最近很流行的eclipse2.1+lomboz2.1.3。
下面我們就來一步一步配置好開發J2EE所需的各部分組件,並且實際創建一個實體EJB調用底層數據庫中的內容,並用一個JSP頁面將其顯示出來
一、 安裝與配置
1.首先我們需要的是SUN的JDK,去SUN的網站(http://java.sun.com/)上看看,找到最新的JDK,把它下載回來。然後將其釋放到到一個方便的目錄裡,比如說D:\worktools\jdk1.4。右健單擊"我的電腦"選擇"高級"->"環境變量"如圖一所示:
(圖一)
環境變量分為兩個部分:上面是用戶變量區;下面是系統變量區。在用戶變量區中,我們新建一個名為JAVA_HOME的變量,它的值指向剛才生成的JDK的目錄,比如D:\worktools\jdk1.4,下文我們用%JAVA_HOME代指。新建建一個CLASSPATH值為%JAVA_HOME\LIB;%JAVA_HOME\TOOLS.JAR;在系統變量區中,我們對PATH這個環境變量進行修改,添加一個值%JAVA_HOME\bin,中間";"隔開。ok,一路確定下來,至此我們便搞定了一切JAVA開發的基礎----JDK的設置。(本文以WINXP為例,若使用WIN9X系統則設置需要重啟一下計算機)
2.幾乎所有的企業級應用都需要數據的存儲系統,我們也將使用一個大名鼎鼎的開源數據庫:mySQL。.本文使用的版本是mySQL3.23.35,大家可以到mySQL的網站(http://www.mysql.com)去下載。
安裝mySQL非常簡單,解開下載下來的壓縮包,運"SETUP.EXE",一路"Next"便可搞定,建議將其安裝在C:\MYSQL中。安裝完畢後,在MYSQL\BIN中有一個名為"WINMYSQLADMIN.EXE"的程序。運行這個程序,輸入你的用戶名和密碼(自己設定)後,MYSQL就已經可以用了。現在你可以同過它的默認用戶名"ROOT"密碼為空來操縱數據庫。
3.對數據庫的操作一般有兩種方式,一種是控制台;另一種是圖形化操作。簡單起見,我們選用後一種方式。而選擇的軟件是mySQL-Control-Center0.9.4,它也是mysql Group出品的,最大的優點就是免費!我們在mysql的網站上下載安裝mysql-cc後,會在桌面上生成一個快捷方式。我們由此進入mysql-cc,用戶名"ROOT"密碼為空,默認的端口號為"3306",主機名添入"localhost"。確定後,右健選擇連接。現在我們就可以操縱自己的mysql數據庫了。
(圖二)
使用EJB的目的就是要以一種對象的方式操縱底層的數據,所以我們要先建立自己的底層數據。如圖三所示,右健單擊MYSQL-CC左側的“databases”,選擇"new",起名為“mytest”。
(圖三)
在新建的數據庫基礎上,我們在建立一個數據表。如圖四所示,新增兩個字段"id"、"context",類型均為"varchar",保存的時候起名為"myejb"。
(圖四)
打開剛才建好的數據表中添加幾個數據,"id"依次為1,2,3;"context"與"id"為應為"time","blank","talk"。
4.是我們的應用服務器JBoss出場的時候了。從JBoss的sourceForge的子項目(http://sourceforge.net/projects/jboss/)下載Jboss3.2.3。把它解壓到某個文件夾下,比如D:\worktools\Jboss3.2.3。將其中的\docs\examples\jca下的mysql_ds.xml拷貝到\server\default\deploy中,用記事本打開進行編輯。有幾項修改如圖五所示:
(圖五)
保存以後,將其重命名為"mytest-ds.xml",這就是我們編寫EJB時要用到的數據源。
由Jboss連接我們的mySQL數據庫,需要用到mySQL的JAVA驅動程序。我們還是得從mySQL的主頁上下載mysql-connector-java-3.0.11-stable。解壓這個壓縮文件包,從中提取mysql-connector-java-3.0.11-stable-bin.jar,將其放入Jboss目錄下的\server\default\lib目錄中,並把這個文件重命名為mySQL.jar。
5.至此,我們就可以進行實際的開發了。可能你會問,那用什麼來編輯我們的程序呢,難到用Windows自帶的記事本嗎?當然可以!但是各種繁瑣、重復的操作很不利於我們新手的成長。我們需要的是一個集成開發工具(IED)來幫助自己處理一些低級的操作,迅速編寫出一個可用的系統,提高我們學習J2EE的信心。等到對J2EE了解的更深入了解以後,我們回過頭來再用一個文本編輯工具編寫每個所需的文件,然後編譯、部署,可以迅速提高自己的水平。
這裡我向大家推薦一款優秀的開發工具,就是前面提到過的Eclipse。其實它本身可以想象成一個很友好的框架,通過向其中安裝各種兼容的插件,來達到我們各式各樣的開發需求。你要知道,它的後台可是IBM阿,但對於我們更重要的是它完全免費,我們甚至可以開發自己的插件!
從Eclipse主頁(http://www.eclipse.org)下載Eclipse2.1,然後到www.objectlearn.org下載Lomboz2.1.3,這是開發J2EE過程中的一個強大的Eclipse插件。首先解壓Eclipse和Lomboz,再把由Lomboz壓縮包生成的com.objectlearn.jdt.j2ee和com.objectlearn.jdt.j2ee.editors這兩個文件夾拷貝到Eclipse主目錄下\plugins文件夾中。運行Eclipse,選擇"Windos"->"customize perspective..."。如圖六所示:
展開所有節點,選中所有有關lomboz的選項,然後點擊"ok"。(圖六)選擇"Window"->"preference"。單擊lomboz,在JDK Tolls .jar中選擇你的jdk目錄下的\lib\tools.jar,點擊Apply。因為我們的應用服務器選擇的是支持熱部署的JBoss,所以確保Restart Server After Depoly選項沒有被選中。如圖七所示,在左邊展開lomboz這個選項,選中Server Definition.在Server types中我們選擇JBoss 3.2.x。而Application Server Directoty和Classpath Variable中同樣的選擇JBoss的主目錄,並點擊Apply。
(圖七)
還是在"Window"->"preference",展開java類,選擇New Project在Source and output folder中我們將其改成folders,如圖八所示。
(圖八)
點擊apply,最後點擊ok。
呼呼~長出一口氣吧,至此我們已經把開發J2EE系統所需的所有軟件都安裝配置好了。喝杯茶,馬上開發我們的第一個EJB!
二、 開發第一個EJB
EJB2.0規范中定義了3種企業Bean。分別為會話Bean(Session Bean)、實體Bean(Entity Bean)和消息驅動Bean(Message Driven Bean)。會話Bean模擬一個商務過程;實體Bean模擬商務數據;而消息驅動Bean與會話Bean類似也是在模擬一個商務過程,但消息驅動Bean只接受消息的調用。
本文著重介紹如何快速開發一個實體Bean。因為會話Bean相對簡單,在理解了實體Bean後,自己很容易就能編寫出來。而消息驅動Bean在用到的時候學也不遲。
1. Eclipse中,運行"file"-> "new"-> "project"選擇Lomboz J2EE Project。在project name中填入我們的工程名"EJBTest"。點擊next後,會出現java setting的對話框,我們不做任何修改,直接next。在這一步,我們將建立一個EJB的模塊。如圖九所示,在ejb Module選項卡中,我們新建一個名為myEJB的EJB Module。
(圖九)
然後在Targent Server中,選擇我們剛剛配置好的Jboss3.2.x。add以後再選擇finish,我們工程就建立好了。
2. 現在用Lomboz的向導來生成我們EJB,選擇"file"-> "new"->"Lomboz EJB Creation Wizard"。如圖十所示:
(圖十)
在package 中填入包名,比如"Rip.ejb.cmp";在name中,我們給這個EJB起個名字,比如"mytest"。Select EJB Type選項裡,選擇"Container Managed Entity EJB",表明要創建一個由容器管理的實體EJB。如圖十一所示
(圖十一)
這一步中我們要聲明數據表名稱,數據源名稱,以及表中各個字段。參照圖十二:
將各項內容填入相應的地方。注意,每添加一個字段都要點擊add一次,將其放入下方的已加入的字段列表中。最後選中id這一字段,點擊Make Primary Key,將其標記為主健。其中,table name項對應著我們先前在mySQL中建立的數據表myejb;datasource對應著我們在jBoss中設定的數據源mytest-ds.xml。
點擊finish後,就可以在左側src目錄下Rip.ejb.cmp包中找到並打開我們剛剛生成的mytestBean.java(mytest後的Bean是Lomboz自動添加的)文件。找到ejbCreate()方法,添加兩個字符串型的輸入變量"id"和"context,並添加兩個方法setId(id)和setContext(context),具體實現如圖十三:
(圖十三)
如果更改過程中出現載入包或者捕捉異常的錯誤,單擊錯誤符號,選擇載入或直接拋出異常即可。
這個新建立的EJB需要被放入一個模塊中才可以被裝載、執行。如圖十四所示:
(圖十四)
右健點擊mytestBean.java,選擇lomboz J2EE...->Add EJB to Module,再在剛才建立的myEJB這個模塊前打勾,點擊ok後,便實現了裝載。一個完整的實體EJB是由多個不同功用的文件組合起來的,但這裡它們由加了標簽的mytestBean.java自動生成。所使用的是XDoclet技術,感興趣的讀者可以到網上去搜索一下,有很多的相關介紹,我們就不再介紹具體細節了。如圖十五所示:右健點擊myEJB這個模塊,選擇lomboz J2EE...->Generate EJB Classes。
(圖十五)
顯示成功之後,在ejbsrc目錄下的Rip.ejb.cmp包中,你就可以看到mytestHome.java等六個文件。在mytest這個模塊下面的META-INF文件夾中,有許多xml文件。其中,jboss.xml、jbosscmp-jdbc.xml和ejb-jar.xml是部署EJB最關鍵的三個配置文件。而我們現階段需要更改的只是jbosscmp-dbc.xml這個文件,它描述了對數據源的描述,其他的文件都已經由lomboz 配置好了。我們將這個文件的相關部分修改為:
<jbosscmp-jdbc>
<enterprise-beans>
<defaults>
<datasource>java:/mytestDS</datasource>
<datasource-mapping>mySQL</datasource-mapping>
<preferred-relation-mapping>foreign-key</preferred-relation-mapping>
</defaults>
<enterprise-beans>
其他部分不做改變。至此,我們完成了所有的EJB開發工作。右健點擊myEJB這個模塊,選擇lomboz J2EE...->Deploy Module將這個模塊裝載到服務器中。然後,選擇lomboz J2EE...->Debug Server運行服務器。萬事俱備,只欠調用!
三、 EJB的調用-使用JSP顯示數據
現在我們將使用JSP作為業務層和表示層來調用EJB,將一些數據存儲到數據庫中,並把數據庫裡已有的數據全部打印到客戶端的浏覽器上。
1. 如上文介紹過的,我們再建立一個名為"myEJB"的Web模塊。target Server還是選擇我們配置好的Jboss3.2.x,確定後將生成一個myWeb的目錄。
2. 打開myWeb的目錄,將以下的代碼替換掉index.jsp的原有代碼。
<%@ page import="javax.ejb.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.ejb.*"%>
<%@ page import="Rip.ejb.cmp.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.rmi.RemoteException"%>
<html>
<head>
<title>Welcome Every body,This is my firstEJB for qiqi</title>
</head>
<body>
<center><%
/*初始化系統的上下文,並查找jidi名為mytestBean的實體Bean*/
InitialContext Context = new InitialContext(System.getProperties());
mytestHome Home = (mytestHome) Context.lookup("mytestBean");
try {
/*調用EJB的Create()方法在在數據庫中生成數據,如果你不需要調用EJB時在底層數據庫中產生數據,則不需要調用Create()方法*/
mytest myBean = Home.create("18","Hello,I am Rip");
/*根據前面的定義,findAll()方法將返回myejb表中的所有數據;如果你想使用不同的find方法,比如要返回id<5的數據,你可以編寫自己的finder方法。*/
Collection col = Home.findAll();
String outString = "";
/*使用循環的方式遍歷所有的數據,並把它們打印出來*/
Iterator it = col.iterator();
while(it.hasNext()){
mytest element =(mytest)it.next();
outString = element.getId()+":"+element.getContext()+"<br>";
out.println(outString);
}
/*捕捉並拋出給中異常*/
} catch (RemoteException e) {
e.printStackTrace();
} catch (CreateException e) {
e.printStackTrace();
} catch (FinderException e){
e.printStackTrace();
}
%></center>
</body>
</html>
3. 右健點擊myWEB這個模塊,選擇lomboz J2EE...->Deploy Module將這個WEB模塊裝載到服務器中。
4. 打開浏覽器,在地址欄中輸入"http://localhost:8080/myWEB/index.jsp"。如果一切順利的話,將可以看到如同圖十六 的頁面輸出。
(圖十六)
至此,我們就結束了這次對J2EE的入門學習。
四、 結束語
全文來看,真正在EJB開發上面花的功夫比較少,僅僅幾行代碼而已,所以EJB很適合應用系統的快速開發。可是,EJB從誕生以來就是一項重量級的應用,尤其是使用遠程調用(為了說明問題,本文使用的就是這種方法),大量的使用了系統的資源。所以在一般情況下,使用本地接口可以大大的減少對資源的使用。或者,你還可以使用其他O-R映射組件,比如說Hibernate等等。
由於篇幅有限,筆者不可能將所有可能出現的錯誤和解決辦法一一列舉出來,如有任何意見或問題,請發送email到我的郵箱kknd0669@sina.com。