前言
本文是為想在JBOSS環(huán)境下進(jìn)行EJB開發(fā)的讀者而寫的,在閱讀本文之前,你最好對(duì)EJB有一個(gè)基本了解。
JBOSS是一個(gè)開放源碼的免費(fèi)EJB服務(wù)器,它實(shí)現(xiàn)了其它J2EE所規(guī)定的大多數(shù)功能,現(xiàn)在sun公司已經(jīng)把JBOSS作為J2EE1.4的標(biāo)準(zhǔn)實(shí)現(xiàn)服務(wù)器了,本文就帶領(lǐng)大家從Jboss3.2.6的安裝開始,一直到開發(fā)出一個(gè)完整的”hello,world”的ejb為止。
JBOSS的安裝與啟動(dòng)
如果你是第一次使用JBOSS,你一定會(huì)感到很沮喪,因?yàn)樗m然是開放源碼,并可以免費(fèi)下載,但是它的文檔或技術(shù)培訓(xùn)卻是收費(fèi)的,而且對(duì)于國人來說高不可及(幾天的培訓(xùn)大約要10000美元,文檔也要幾十至幾百美一份)!如果你試圖在網(wǎng)上找一些關(guān)于JBOSS下簡(jiǎn)單入門的文章,可只是那么寥寥可數(shù)的幾篇,而且很少有菜鳥級(jí)的文章。相反,對(duì)其核心設(shè)計(jì)等高深理論性的文章倒是居多,這樣反倒讓你越看越糊涂。因此,本文的目的就是:讓你的JBOSS盡快地跑起來,并馬上可以在其之上開發(fā)出簡(jiǎn)單的EJB!
在安裝JBOSS之前,首先要確定你已經(jīng)安裝了jdk1.3或以上版本,由于JBOSS不像weblogic等其它應(yīng)用服務(wù)器捆綁了JDK,因此JBOSS非要jdk的支持才能運(yùn)行。然后在 http://www.jboss.org網(wǎng)站上下載一個(gè)jboss的發(fā)行版(我下載的是jboss-3.2.6.zip),在本文中我使用的其穩(wěn)定的發(fā)行版JBOSS3.2.6 (集成了tomcat4.1),需要附帶一句的是tomcat是apache基金會(huì)旗下著名的開源jsp/servlet服務(wù)器,如果要更多的了解tomcat,請(qǐng)?jiān)L問http://jakarta.apache.org 以獲得更詳細(xì)的信息。
當(dāng)你把jboss-3.2.6.zip下載之后,下一步就是將它解壓縮,如果你是在windows上,可以用winzip或winrar;如果是在linux下,就用unzip命令,以我自己為例,假設(shè)我將它解壓到了如下目錄
c:\ jboss-3.2.6
相對(duì)于weblogic,websphere等j2ee服務(wù)器來說,JBOSS的啟動(dòng)是簡(jiǎn)單得出乎意料,如果你是windows用戶,只需要進(jìn)入c:\ jboss-3.2.6\bin下面,輸入run.bat命令,JBOSS就跑起來啦;如果是linux用戶的話,只需要進(jìn)入c:\ jboss-3.2.6\bin下面,輸入run.sh,那么JBOSS也同樣運(yùn)行。怎么樣?是挺簡(jiǎn)單的吧?
當(dāng)你輸入run.bat或run.sh后,你會(huì)發(fā)現(xiàn)屏幕上會(huì)不斷地滾動(dòng)一些提示信息,過大約1分鐘之后(依賴于你機(jī)器的配置,我的是P4 1.7G,128M),提示信息就會(huì)停止?jié)L動(dòng)。(注意:如果你是在windows下,那么請(qǐng)讓這個(gè)DOS窗口一直保持這種狀態(tài),千萬不可將其中止!)等到它自己停止。
這樣,JBOSS就已經(jīng)處于運(yùn)行狀態(tài)了。和其它J2EE服務(wù)器一樣,JBOSS也提供了一個(gè)WEB方式控制臺(tái),使用方法是在IE瀏覽器中輸入http://127.0.0.1:8080/web-console/,看見歡迎界面,就成功了。
編寫第一個(gè)EJB:”hello,world”
下面我們正式開始EJB編程。在編寫我們的第一個(gè)EJB之前,你應(yīng)該對(duì)EJB有一個(gè)大致的了解,如果沒有的話,建議你先到網(wǎng)上找一些這方面的文章來看,否則你將無法理解下面要講述的內(nèi)容。
遠(yuǎn)程接口
遠(yuǎn)程接口是指對(duì)于客戶端而言所能看到了調(diào)用接口
//HelloWorld.java
package?sample;

/**//*這是一個(gè)遠(yuǎn)程接口,客戶端調(diào)用這個(gè)接口來使真正的ejb工作*/
public?interface?HelloWorld?extends?javax.ejb.EJBObject


{
public?String?hello()?throws?java.rmi.RemoteException;
}?

Home接口
我們可以把Home接口看做是一個(gè)制造EJB的工廠,Home接口告訴EJB容器:“嗨,我的客戶要我生成一個(gè)EJB,現(xiàn)在我把這個(gè)任務(wù)交給你啦!”
//HelloWorldHome.java
package?sample;

/**//*Home接口告訴EJB容器怎樣生成或銷毀EJB的實(shí)例*/
public?interface?HelloWorldHome?extends?javax.ejb.EJBHome


{
HelloWorld?create()?throws?java.rmi.RemoteException,javax.ejb.CreateException;
}?

EJB的實(shí)現(xiàn)
這里才是真正的EJB的實(shí)現(xiàn)
//HelloWorldBean.java
package?sample;
import?javax.ejb.SessionContext;

/**//*這個(gè)類具體實(shí)現(xiàn)的遠(yuǎn)程接口HelloWorld*/
pubic?class?HelloWorldBean?implements?javax.ejb.SessionBean


{
private?SessionContext?ctx;
public?void?setSessionContext(SessionContext?ctx)

{
this.ctx?=?ctx;
}
pubic?void?ejbRemove()

{
System.out.println(“ejbRemove()”);
}
public?void?ejbActivate()

{
System.out.println(“ejbActivate()”);
}
public?void?ejbPassivate()

{
System.out.println(“ejbPassivate()”);
}

/**//*hello方法是實(shí)際的業(yè)務(wù)邏輯,它可以在客戶端顯示“hello,world”這個(gè)字符串*/
public?String?hello()

{
System.out.println(“hello()”);
return?“hello,world”;
}
}?

好了,這個(gè)會(huì)話EJB的全部代碼編寫完畢,下一步我們要做的是編寫它的部署文件:
ejb-jar.xml
<?xml?version="1.0"?encoding="UTF-8"?>
<ejb-jar>
<description>JBoss?Hello?World?Application</description>
<display-name>Hello?World?EJB</display-name>
<enterprise-beans>
<session>
<ejb-name>Hello</ejb-name>
<home>sample.HelloHome</home>
<remote>sample.Hello</remote>
<ejb-class>sample.HelloBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>?
這樣我們就完成了一個(gè)簡(jiǎn)單的會(huì)話EJB的編寫,但其實(shí)JBOSS還提供了一個(gè)額外的配置文件:JBoss.xml,利用它可以對(duì)JBOSS服務(wù)器進(jìn)行更多的定制,但由于本例實(shí)在是太簡(jiǎn)單了,因此我們可以將它省略不寫。
雖然我們完成了這個(gè)會(huì)話EJB的編寫,但還有最后的一步工作要做:打包。首先我們進(jìn)入當(dāng)前項(xiàng)目的根目錄:
cd F:\project\jboss-tutorial
然后執(zhí)行jar命令將所有的類及ejb-jar.xml打包:
jar cf HelloWorld.jar sample META-INF
這時(shí)你會(huì)發(fā)現(xiàn),在當(dāng)前目錄下多了一個(gè)名為HelloWorld.jar的文件,這就是我們的最終成品。
部署我們的EJB
部署EJB在JBOSS中是一件非常容易的事,你只需簡(jiǎn)單將HelloWorld.jar拷貝到c:\ jboss-3.2.6\server\default\deploy目錄下就可以了。
這時(shí),你可以切換到JBOSS運(yùn)行的那個(gè)DOS窗口下,你會(huì)發(fā)現(xiàn)屏幕上會(huì)新出現(xiàn)如下提示信息:
15:09:21,184 INFO [MainDeployer] Starting deployment of
package: file:/F:/jboss
-3.2.3/server/default/deploy/HelloWorld.jar
15:09:21,324 INFO [EjbModule] Creating
15:09:21,354 INFO [EjbModule] Deploying HelloWorld
15:09:21,464 INFO [EjbModule] Created
15:09:21,484 INFO [EjbModule] Starting
15:09:21,555 INFO [EjbModule] Started
15:09:21,555 INFO [MainDeployer] Successfully completed
deployment of package: file:/F:/jboss-3.2.6/server/default/deploy/HelloWorld.jar
客戶端代碼
如果沒有客戶端代碼的話,那么EJB對(duì)我們來說幾乎毫無用處。以下我們將編寫客戶端代碼來調(diào)用這個(gè)HelloWorld。
如果你在同一臺(tái)機(jī)器上運(yùn)行客戶端代碼和JBOSS服務(wù)器的話,那以下代碼無須任何修改就可以運(yùn)行,但你的客戶端在另一臺(tái)機(jī)器上運(yùn)行的話,那你要將源碼中的相應(yīng)行改變一下:
/*以下是客戶端源碼中需要修改的行*/
env.put(Context.PROVIDER_URL, "localhost:1099");
假設(shè)EJB部署在一臺(tái)IP地址為192.168.0.1的機(jī)器上,那么就應(yīng)該將以上源碼改為如下:
/*以下是客戶端源碼中修改后的行*/
env.put(Context.PROVIDER_URL, "192.168.0.1:1099");

/**//*HelloWorldClient.java*/
package?sample;
import?javax.naming.Context;
import?javax.naming.InitialContext;
import?java.util.Hashtable;
public?class?HelloWorldClient


{
public?static?void?main(?String?[]?args?)

{
Hashtable?env?=?new?Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL,?"localhost:1099");
env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
try

{
Context?ctx?=?new?InitialContext(env);
Object?obj?=?ctx.lookup(?"HelloWorld"?);
HelloWorldHome?home?=(HelloWorldHome)javax.rmi.PortableRemoteObject.narrow(
obj,?HelloWorldHome.class?);
HelloWorld?helloWorld?=?home.create();
System.out.println(?helloWorld.hello());
helloWorld.remove();
}
catch?(?Exception?e?)

{
e.printStackTrace();
System.out.println(?"Exception:?"?+?e.getMessage()?);
}
}
}?
好了,下面我就就可以編譯并運(yùn)行這個(gè)客戶端了,如果你在編譯的時(shí)候JVM報(bào)告找不到某些類的話,則可能是你沒有將j2ee.jar這個(gè)包放在CLASSPATH這個(gè)路徑變量中。客戶端的執(zhí)行結(jié)果雖然只是簡(jiǎn)單的在屏幕上打印一行“hello,world”,但它是來自于另一個(gè)世界
——JBOSS的聲音!
實(shí)例代碼下載
本文是為想在JBOSS環(huán)境下進(jìn)行EJB開發(fā)的讀者而寫的,在閱讀本文之前,你最好對(duì)EJB有一個(gè)基本了解。
JBOSS是一個(gè)開放源碼的免費(fèi)EJB服務(wù)器,它實(shí)現(xiàn)了其它J2EE所規(guī)定的大多數(shù)功能,現(xiàn)在sun公司已經(jīng)把JBOSS作為J2EE1.4的標(biāo)準(zhǔn)實(shí)現(xiàn)服務(wù)器了,本文就帶領(lǐng)大家從Jboss3.2.6的安裝開始,一直到開發(fā)出一個(gè)完整的”hello,world”的ejb為止。
JBOSS的安裝與啟動(dòng)
如果你是第一次使用JBOSS,你一定會(huì)感到很沮喪,因?yàn)樗m然是開放源碼,并可以免費(fèi)下載,但是它的文檔或技術(shù)培訓(xùn)卻是收費(fèi)的,而且對(duì)于國人來說高不可及(幾天的培訓(xùn)大約要10000美元,文檔也要幾十至幾百美一份)!如果你試圖在網(wǎng)上找一些關(guān)于JBOSS下簡(jiǎn)單入門的文章,可只是那么寥寥可數(shù)的幾篇,而且很少有菜鳥級(jí)的文章。相反,對(duì)其核心設(shè)計(jì)等高深理論性的文章倒是居多,這樣反倒讓你越看越糊涂。因此,本文的目的就是:讓你的JBOSS盡快地跑起來,并馬上可以在其之上開發(fā)出簡(jiǎn)單的EJB!
在安裝JBOSS之前,首先要確定你已經(jīng)安裝了jdk1.3或以上版本,由于JBOSS不像weblogic等其它應(yīng)用服務(wù)器捆綁了JDK,因此JBOSS非要jdk的支持才能運(yùn)行。然后在 http://www.jboss.org網(wǎng)站上下載一個(gè)jboss的發(fā)行版(我下載的是jboss-3.2.6.zip),在本文中我使用的其穩(wěn)定的發(fā)行版JBOSS3.2.6 (集成了tomcat4.1),需要附帶一句的是tomcat是apache基金會(huì)旗下著名的開源jsp/servlet服務(wù)器,如果要更多的了解tomcat,請(qǐng)?jiān)L問http://jakarta.apache.org 以獲得更詳細(xì)的信息。
當(dāng)你把jboss-3.2.6.zip下載之后,下一步就是將它解壓縮,如果你是在windows上,可以用winzip或winrar;如果是在linux下,就用unzip命令,以我自己為例,假設(shè)我將它解壓到了如下目錄
c:\ jboss-3.2.6
相對(duì)于weblogic,websphere等j2ee服務(wù)器來說,JBOSS的啟動(dòng)是簡(jiǎn)單得出乎意料,如果你是windows用戶,只需要進(jìn)入c:\ jboss-3.2.6\bin下面,輸入run.bat命令,JBOSS就跑起來啦;如果是linux用戶的話,只需要進(jìn)入c:\ jboss-3.2.6\bin下面,輸入run.sh,那么JBOSS也同樣運(yùn)行。怎么樣?是挺簡(jiǎn)單的吧?
當(dāng)你輸入run.bat或run.sh后,你會(huì)發(fā)現(xiàn)屏幕上會(huì)不斷地滾動(dòng)一些提示信息,過大約1分鐘之后(依賴于你機(jī)器的配置,我的是P4 1.7G,128M),提示信息就會(huì)停止?jié)L動(dòng)。(注意:如果你是在windows下,那么請(qǐng)讓這個(gè)DOS窗口一直保持這種狀態(tài),千萬不可將其中止!)等到它自己停止。
這樣,JBOSS就已經(jīng)處于運(yùn)行狀態(tài)了。和其它J2EE服務(wù)器一樣,JBOSS也提供了一個(gè)WEB方式控制臺(tái),使用方法是在IE瀏覽器中輸入http://127.0.0.1:8080/web-console/,看見歡迎界面,就成功了。
編寫第一個(gè)EJB:”hello,world”
下面我們正式開始EJB編程。在編寫我們的第一個(gè)EJB之前,你應(yīng)該對(duì)EJB有一個(gè)大致的了解,如果沒有的話,建議你先到網(wǎng)上找一些這方面的文章來看,否則你將無法理解下面要講述的內(nèi)容。
遠(yuǎn)程接口
遠(yuǎn)程接口是指對(duì)于客戶端而言所能看到了調(diào)用接口











Home接口
我們可以把Home接口看做是一個(gè)制造EJB的工廠,Home接口告訴EJB容器:“嗨,我的客戶要我生成一個(gè)EJB,現(xiàn)在我把這個(gè)任務(wù)交給你啦!”











EJB的實(shí)現(xiàn)
這里才是真正的EJB的實(shí)現(xiàn)













































好了,這個(gè)會(huì)話EJB的全部代碼編寫完畢,下一步我們要做的是編寫它的部署文件:
ejb-jar.xml















這樣我們就完成了一個(gè)簡(jiǎn)單的會(huì)話EJB的編寫,但其實(shí)JBOSS還提供了一個(gè)額外的配置文件:JBoss.xml,利用它可以對(duì)JBOSS服務(wù)器進(jìn)行更多的定制,但由于本例實(shí)在是太簡(jiǎn)單了,因此我們可以將它省略不寫。
雖然我們完成了這個(gè)會(huì)話EJB的編寫,但還有最后的一步工作要做:打包。首先我們進(jìn)入當(dāng)前項(xiàng)目的根目錄:
cd F:\project\jboss-tutorial
然后執(zhí)行jar命令將所有的類及ejb-jar.xml打包:
jar cf HelloWorld.jar sample META-INF
這時(shí)你會(huì)發(fā)現(xiàn),在當(dāng)前目錄下多了一個(gè)名為HelloWorld.jar的文件,這就是我們的最終成品。
部署我們的EJB
部署EJB在JBOSS中是一件非常容易的事,你只需簡(jiǎn)單將HelloWorld.jar拷貝到c:\ jboss-3.2.6\server\default\deploy目錄下就可以了。
這時(shí),你可以切換到JBOSS運(yùn)行的那個(gè)DOS窗口下,你會(huì)發(fā)現(xiàn)屏幕上會(huì)新出現(xiàn)如下提示信息:
15:09:21,184 INFO [MainDeployer] Starting deployment of
package: file:/F:/jboss
-3.2.3/server/default/deploy/HelloWorld.jar
15:09:21,324 INFO [EjbModule] Creating
15:09:21,354 INFO [EjbModule] Deploying HelloWorld
15:09:21,464 INFO [EjbModule] Created
15:09:21,484 INFO [EjbModule] Starting
15:09:21,555 INFO [EjbModule] Started
15:09:21,555 INFO [MainDeployer] Successfully completed
deployment of package: file:/F:/jboss-3.2.6/server/default/deploy/HelloWorld.jar
客戶端代碼
如果沒有客戶端代碼的話,那么EJB對(duì)我們來說幾乎毫無用處。以下我們將編寫客戶端代碼來調(diào)用這個(gè)HelloWorld。
如果你在同一臺(tái)機(jī)器上運(yùn)行客戶端代碼和JBOSS服務(wù)器的話,那以下代碼無須任何修改就可以運(yùn)行,但你的客戶端在另一臺(tái)機(jī)器上運(yùn)行的話,那你要將源碼中的相應(yīng)行改變一下:
/*以下是客戶端源碼中需要修改的行*/
env.put(Context.PROVIDER_URL, "localhost:1099");
假設(shè)EJB部署在一臺(tái)IP地址為192.168.0.1的機(jī)器上,那么就應(yīng)該將以上源碼改為如下:
/*以下是客戶端源碼中修改后的行*/
env.put(Context.PROVIDER_URL, "192.168.0.1:1099");








































——JBOSS的聲音!
實(shí)例代碼下載