Posted on 2007-11-15 23:03
yukui 閱讀(144)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
技術(shù)
作者 :翁馳原
4. 編寫(xiě)和運(yùn)行HelloWorld程序
J2EE應(yīng)用程序一般使用RMI(遠(yuǎn)程方法調(diào)用)來(lái)完成客戶(hù)端與服務(wù)器的交互。當(dāng)然,其間也少不了EJB的作用。本例為一個(gè)J2EE應(yīng)用程序:客戶(hù)端向服務(wù)器發(fā)送一個(gè)問(wèn)候語(yǔ):“Hello,Remote Object”。服務(wù)器收到該問(wèn)候語(yǔ)后打印該問(wèn)候語(yǔ),并返回一字符串作為應(yīng)答。客戶(hù)端收到此應(yīng)答后打印它。
RemoteInterface.java
/**
* 第一步:
* 定義一個(gè)新的接口繼承javax.ejb.EJBObject。新定義的接口中的每一個(gè)方法都必須拋出
* java.rmi.RemoteException異常。
*/
public interface RemoteInterface extends javax.ejb.EJBObject
{
public String message(String str)throws java.rmi.RemoteException;
}
RemoteObject.java
/**
* 第二步:
* 定義一個(gè)類(lèi)來(lái)實(shí)現(xiàn)javax.ejb.SessionBean接口。并在該類(lèi)中實(shí)現(xiàn)在第一步中編寫(xiě)的接口中所定義的方法。
*/
public class RemoteObject implements javax.ejb.SessionBean
{
public String message(String str)throws java.rmi.RemoteException
{
System.out.println("Remote Object Received From Client: \""+str+"\""); //打印(從客戶(hù)端)接收到的字符串。
return "Hello,I'm Remote Object,I received your message: \'"+str+"\'"; //返回一應(yīng)答字符串。
}
public RemoteObject() {}
public void ejbCreate() {}
public void ejbRemove() {}
public void ejbActivate() {}
public void ejbPassivate() {}
public void setSessionContext(javax.ejb.SessionContext sc) {}
}
RemoteHome.java
/**
* 第三步:
* 定義一個(gè)類(lèi)繼承javax.ejb.EJBHome 。
*/
public interface RemoteHome extends javax.ejb.EJBHome
{
RemoteInterface create()throws java.rmi.RemoteException,javax.ejb.CreateException;
}
Client.java
/**
* 第四步:
* 定義客戶(hù)端類(lèi)。
*/
public class Client
{
public static void main(String[] args)
{
try
{
javax.naming.Context initContext=new javax.naming.InitialContext();
Object obj=initContext.lookup("HelloWorld"); //遠(yuǎn)程查找,由名字得到對(duì)應(yīng)的對(duì)象。
RemoteHome home=(RemoteHome)javax.rmi.PortableRemoteObject.narrow(obj,RemoteHome.class);
RemoteInterface remote=home.create();
String receiveFromRemote=remote.message("Hello,Remote Object!"); //遠(yuǎn)程方法調(diào)用
System.out.println("Client Received From Remote Object: \""+receiveFromRemote+"\"");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
假設(shè)以上四個(gè)Java文件存于C:\HelloWorld\下,編譯它們?nèi)纾篊:\HelloWorld>javac *.java 。
5. 部署應(yīng)用程序
啟動(dòng)Application Dopolyment Tool:新開(kāi)一個(gè)Dos窗口,鍵入以下命令,%J2EE_HOME%\bin\deploytool 。該工具啟動(dòng)速度可能比較慢,要耐心等待。啟動(dòng)成功后會(huì)出現(xiàn)主界面(此時(shí)不要關(guān)閉Dos窗口)。在該界面中選 擇 File菜 單 ,再選New Application項(xiàng)。在 Application File Name 輸 入 :C:\HelloWorld\HelloWorld.ear 。在 Application Disply Name 輸 入 你所喜歡的顯示名如:HelloWorld。點(diǎn) 擊 OK,在主界面的樹(shù)形結(jié)構(gòu)Files-->Applications下將增加新的一項(xiàng):HelloWorld。這意味著產(chǎn)生了一個(gè)新的應(yīng)用程序。接下來(lái)我們要做的就是部署該應(yīng)用程序。在主界面的樹(shù)形結(jié)構(gòu)下選中HelloWorld,然后再在主界面的File菜單中選取New-->Enterprise Bean,在彈出的名為“New Enterprise Bean - Introduction”窗口中選取Next跳過(guò)第一步,在接下來(lái)的一步中,Create New EJB File in Application項(xiàng)中選HelloWorld,在EJB Display Name中填上你喜歡的名字如:Hello World EJB,點(diǎn)擊Edit按鈕,在彈出的窗口中,Start Directory中填:C:\HelloWorld\,在Available Files中展開(kāi)樹(shù)形結(jié)構(gòu)C:\HelloWorld\,選取RemoteInterface.class、RemoteObject.class、RemoteHome.class、Client.class四項(xiàng),點(diǎn)Add按鈕添加,然后按OK確定。此時(shí)在Contents框中增加了該四個(gè)class。點(diǎn)Next進(jìn)入下一步。Session項(xiàng)選Stateless,意為不保存session狀態(tài)。Enterprise Bean Class選RemoteObject。Enterprise Bean Name中填上你喜歡的名字如:Hello World Bean。Remote Home Interface中選RemoteHome,Remote Interface中選RemoteInterface。選Next進(jìn)入下一步。接下來(lái)的步驟可直接點(diǎn)Finish。這時(shí)主界面的樹(shù)形結(jié)構(gòu)中Files-->Application-->Hello World中將出現(xiàn)Hello World EJB-->Hello World Bean子項(xiàng)。在主界面的樹(shù)形結(jié)構(gòu)下選中Hello World,然后再在主界面的Tools菜單中選取Deploy,將彈出新的窗口名為“Deploy Hello World - Introduction”。Object to deploy中選Hello World,Target server中選localhost,選中Retuen Client Jar,在Client Jar File Name中填上:C:\HelloWorld\HelloWorldClient.jar。選Next進(jìn)入下一步,在Application框的JNDI Name框中雙擊并填上HelloWorld,注意必須與Client.java中Object obj=initContext.lookup("HelloWorld")的“HelloWorld”保持一致。點(diǎn)Next進(jìn)入下一步。點(diǎn)Finish完成。這時(shí)將出現(xiàn)Deployment Progress窗口。如果有誤,該窗口將出現(xiàn)異常信息。如果一切正常,點(diǎn)OK便完成了部署工作。
6. 運(yùn)行應(yīng)用程序
新開(kāi)一個(gè)Dos窗口。進(jìn)入C:\HelloWorld\Classes目錄下運(yùn)行:C:\ HelloWorld\Classes>java -classpath %J2EE_HOME%\lib\j2ee.jar;.;HelloWorldClient.jar; Client 。運(yùn)行成功則出現(xiàn)如下信息:Client Received From Remote Object: "Hello,I'm Remote Object,I received your message: 'Hello,Remote Object!'" 。而服務(wù)端Dos窗口(j2ee -verbose)中出現(xiàn)如下信息:Remote Object Received From Client: "Hello,Remote Object!" 。
好,到了這里大家應(yīng)該都開(kāi)始了一個(gè)真正的j2ee程序了吧?
可是現(xiàn)在有一個(gè)問(wèn)題,ejb和j2ee的優(yōu)點(diǎn)是在哪兒?什么是分布式的,在一臺(tái)機(jī)器上那還叫什么分布系統(tǒng)嗎?是不是有點(diǎn)可笑》現(xiàn)在下面我就教大家怎么把上面的程序變成分布式的。
如果您直接把client.class copy 到其他的機(jī)器上,肯定執(zhí)行不了。因?yàn)槟氵€需要一個(gè)home和remote接口,這兩個(gè)文件在什么地方呢?在helloclient.jar這個(gè)包里面!:)所以你還需要這個(gè)包。把那個(gè)包也copy過(guò)去,執(zhí)行一下,還是不可以。因?yàn)槟愕膉ndi名,只是個(gè)名字,程序怎么知道你要連的服務(wù)器在哪兒呀?所以原來(lái)的client代碼你需要做如下的改動(dòng)。
改成
Properties env = new Properties();
env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory");
env.put(javax.naming.Context.PROVIDER_URL,"iiop://wcy:1050");
//javax.naming.Context initContext=new javax.naming.InitialContext(env);
Context initContext = new InitialContext(env);
Object obj=initContext.lookup("HelloWorld"); //遠(yuǎn)程查找,由名字得到對(duì)應(yīng)的對(duì)象。
RemoteHome home=(RemoteHome)javax.rmi.PortableRemoteObject.narrow(obj,RemoteHome.class);
RemoteInterface remote=home.create();
String receiveFromRemote=remote.message("Hello,Remote Object!"); //遠(yuǎn)程方法調(diào)用
System.out.println("Client Received From Remote Object: \""+receiveFromRemote+"\"");
重新編譯javac *.java成功后。把這個(gè)新的類(lèi)copy到其他的機(jī)器上
打入java -classpath %J2EE_HOME%\lib\j2ee.jar;.;HelloWorldClient.jar; Client
這樣就成功了。