發第一個分布式的j2ee應用

          Posted on 2007-11-15 23:03 yukui 閱讀(147) 評論(0)  編輯  收藏 所屬分類: 技術
          作者 :翁馳原


          4. 編寫和運行HelloWorld程序
          J2EE應用程序一般使用RMI(遠程方法調用)來完成客戶端與服務器的交互。當然,其間也少不了EJB的作用。本例為一個J2EE應用程序:客戶端向服務器發送一個問候語:“Hello,Remote Object”。服務器收到該問候語后打印該問候語,并返回一字符串作為應答。客戶端收到此應答后打印它。

          RemoteInterface.java

          /**
          * 第一步:
          * 定義一個新的接口繼承javax.ejb.EJBObject。新定義的接口中的每一個方法都必須拋出
          * java.rmi.RemoteException異常。
          */
          public interface RemoteInterface extends javax.ejb.EJBObject
          {
          public String message(String str)throws java.rmi.RemoteException;
          }

          RemoteObject.java

          /**
          * 第二步:
          * 定義一個類來實現javax.ejb.SessionBean接口。并在該類中實現在第一步中編寫的接口中所定義的方法。
          */
          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+"\""); //打印(從客戶端)接收到的字符串。
          return "Hello,I'm Remote Object,I received your message: \'"+str+"\'"; //返回一應答字符串。
          }

          public RemoteObject() {}
          public void ejbCreate() {}
          public void ejbRemove() {}
          public void ejbActivate() {}
          public void ejbPassivate() {}
          public void setSessionContext(javax.ejb.SessionContext sc) {}
          }

          RemoteHome.java

          /**
          * 第三步:
          * 定義一個類繼承javax.ejb.EJBHome 。
          */
          public interface RemoteHome extends javax.ejb.EJBHome
          {
          RemoteInterface create()throws java.rmi.RemoteException,javax.ejb.CreateException;
          }

          Client.java

          /**
          * 第四步:
          * 定義客戶端類。
          */
          public class Client
          {
          public static void main(String[] args)
          {
          try
          {
          javax.naming.Context initContext=new javax.naming.InitialContext();
          Object obj=initContext.lookup("HelloWorld"); //遠程查找,由名字得到對應的對象。
          RemoteHome home=(RemoteHome)javax.rmi.PortableRemoteObject.narrow(obj,RemoteHome.class);
          RemoteInterface remote=home.create();
          String receiveFromRemote=remote.message("Hello,Remote Object!"); //遠程方法調用
          System.out.println("Client Received From Remote Object: \""+receiveFromRemote+"\"");
          }
          catch(Exception e)
          {
          e.printStackTrace();
          }
          }
          }

          假設以上四個Java文件存于C:\HelloWorld\下,編譯它們如:C:\HelloWorld>javac *.java 。

          5. 部署應用程序
          啟動Application Dopolyment Tool:新開一個Dos窗口,鍵入以下命令,%J2EE_HOME%\bin\deploytool 。該工具啟動速度可能比較慢,要耐心等待。啟動成功后會出現主界面(此時不要關閉Dos窗口)。在該界面中選 擇 File菜 單 ,再選New Application項。在 Application File Name 輸 入 :C:\HelloWorld\HelloWorld.ear 。在 Application Disply Name 輸 入 你所喜歡的顯示名如:HelloWorld。點 擊 OK,在主界面的樹形結構Files-->Applications下將增加新的一項:HelloWorld。這意味著產生了一個新的應用程序。接下來我們要做的就是部署該應用程序。在主界面的樹形結構下選中HelloWorld,然后再在主界面的File菜單中選取New-->Enterprise Bean,在彈出的名為“New Enterprise Bean - Introduction”窗口中選取Next跳過第一步,在接下來的一步中,Create New EJB File in Application項中選HelloWorld,在EJB Display Name中填上你喜歡的名字如:Hello World EJB,點擊Edit按鈕,在彈出的窗口中,Start Directory中填:C:\HelloWorld\,在Available Files中展開樹形結構C:\HelloWorld\,選取RemoteInterface.class、RemoteObject.class、RemoteHome.class、Client.class四項,點Add按鈕添加,然后按OK確定。此時在Contents框中增加了該四個class。點Next進入下一步。Session項選Stateless,意為不保存session狀態。Enterprise Bean Class選RemoteObject。Enterprise Bean Name中填上你喜歡的名字如:Hello World Bean。Remote Home Interface中選RemoteHome,Remote Interface中選RemoteInterface。選Next進入下一步。接下來的步驟可直接點Finish。這時主界面的樹形結構中Files-->Application-->Hello World中將出現Hello World EJB-->Hello World Bean子項。在主界面的樹形結構下選中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進入下一步,在Application框的JNDI Name框中雙擊并填上HelloWorld,注意必須與Client.java中Object obj=initContext.lookup("HelloWorld")的“HelloWorld”保持一致。點Next進入下一步。點Finish完成。這時將出現Deployment Progress窗口。如果有誤,該窗口將出現異常信息。如果一切正常,點OK便完成了部署工作。

          6. 運行應用程序
          新開一個Dos窗口。進入C:\HelloWorld\Classes目錄下運行:C:\ HelloWorld\Classes>java -classpath %J2EE_HOME%\lib\j2ee.jar;.;HelloWorldClient.jar; Client 。運行成功則出現如下信息:Client Received From Remote Object: "Hello,I'm Remote Object,I received your message: 'Hello,Remote Object!'" 。而服務端Dos窗口(j2ee -verbose)中出現如下信息:Remote Object Received From Client: "Hello,Remote Object!" 。


          好,到了這里大家應該都開始了一個真正的j2ee程序了吧?
          可是現在有一個問題,ejb和j2ee的優點是在哪兒?什么是分布式的,在一臺機器上那還叫什么分布系統嗎?是不是有點可笑》現在下面我就教大家怎么把上面的程序變成分布式的。
          如果您直接把client.class copy 到其他的機器上,肯定執行不了。因為你還需要一個home和remote接口,這兩個文件在什么地方呢?在helloclient.jar這個包里面!:)所以你還需要這個包。把那個包也copy過去,執行一下,還是不可以。因為你的jndi名,只是個名字,程序怎么知道你要連的服務器在哪兒呀?所以原來的client代碼你需要做如下的改動。
          改成

          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"); //遠程查找,由名字得到對應的對象。
          RemoteHome home=(RemoteHome)javax.rmi.PortableRemoteObject.narrow(obj,RemoteHome.class);
          RemoteInterface remote=home.create();
          String receiveFromRemote=remote.message("Hello,Remote Object!"); //遠程方法調用
          System.out.println("Client Received From Remote Object: \""+receiveFromRemote+"\"");

          重新編譯javac *.java成功后。把這個新的類copy到其他的機器上
          打入java -classpath %J2EE_HOME%\lib\j2ee.jar;.;HelloWorldClient.jar; Client

          這樣就成功了。

          posts - 131, comments - 12, trackbacks - 0, articles - 32

          Copyright © yukui

          主站蜘蛛池模板: 台州市| 镇沅| 米脂县| 台北市| 连南| 宁阳县| 庄浪县| 巫山县| 饶河县| 黄石市| 方山县| 繁昌县| 本溪市| 紫云| 托里县| 天柱县| 元谋县| 光山县| 洞头县| 若羌县| 德格县| 蒙阴县| 常熟市| 望谟县| 大庆市| 彭山县| 登封市| 新平| 双鸭山市| 阿克陶县| 平顶山市| 抚宁县| 赤壁市| 曲沃县| 宜春市| 慈溪市| 安福县| 舟山市| 锡林浩特市| 宜州市| 兴宁市|