javascript解析xml.doc_第1頁
javascript解析xml.doc_第2頁
javascript解析xml.doc_第3頁
javascript解析xml.doc_第4頁
javascript解析xml.doc_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

本篇用實(shí)例來說明采用Java進(jìn)行RMI遠(yuǎn)程方法調(diào)用及CORBA服務(wù)調(diào)用的實(shí)現(xiàn)方法,并分析它們的異同,從而為分布應(yīng)用軟件的開發(fā)者提供參考和幫助。 Internet/Intranet的飛速發(fā)展使得Web應(yīng)用日益廣泛而復(fù)雜,Web早已不僅僅是超媒體信息的瀏覽工具,它正逐步發(fā)展成為分布異構(gòu)環(huán)境中企業(yè)應(yīng)用的通用前端和事務(wù)處理的展現(xiàn)窗口。在分布式環(huán)境異構(gòu)中,各種機(jī)器所采用的操作系統(tǒng)、網(wǎng)絡(luò)通信協(xié)議和應(yīng)用軟件千差萬別,要實(shí)現(xiàn)信息共享和軟件資源的整合十分困難,然而一個健壯的分布式計算框架能為可移植的分布式應(yīng)用軟件開發(fā)帶來巨大的便利和好處。 分布式對象技術(shù)主要是在分布式異構(gòu)環(huán)境下建立應(yīng)用系統(tǒng)框架和對象構(gòu)件。在應(yīng)用系統(tǒng)框架的支撐下,開發(fā)者可以將軟件功能封裝為更易管理和使用的對象,這些對象可以跨越不同的軟、硬件平臺進(jìn)行互操作。目前,分布式互操作標(biāo)準(zhǔn)主要有Microsoft的COM/DCOM標(biāo)準(zhǔn)、Sun公司的Java RMI標(biāo)準(zhǔn)和OMG組織的CORBA標(biāo)準(zhǔn)。 Java RMI調(diào)用實(shí)例Java RMI簡介 遠(yuǎn)程方法調(diào)用(RMI,Remote Method Invocation)是jdk1.1中引入的分布式對象軟件包,它的出現(xiàn)大大簡化了分布異構(gòu)環(huán)境中Java應(yīng)用之間的通信。 要使用RMI,必須構(gòu)建四個主要的類:遠(yuǎn)程對象的本地接口、遠(yuǎn)程對象實(shí)現(xiàn)、RMI客戶機(jī)和RMI服務(wù)器。RMI服務(wù)器生成遠(yuǎn)程對象實(shí)現(xiàn)的一個實(shí)例,并用一個專有的URL注冊。RMI客戶機(jī)在遠(yuǎn)程RMI服務(wù)器上查找服務(wù)對象,并將它轉(zhuǎn)換成本地接口類型,然后像對待一個本地對象一樣使用它。 下面是一個簡單的RMI實(shí)例,RMI客戶機(jī)通過RMI服務(wù)器提供的方法實(shí)現(xiàn)對兩個雙精度浮點(diǎn)數(shù)的加減運(yùn)算。例子雖然很簡單,但掌握了Java RMI調(diào)用的基本原理和方法,在實(shí)現(xiàn)復(fù)雜應(yīng)用時,我們需要做的也只是完善遠(yuǎn)程對象的實(shí)現(xiàn)類而已。 RMI實(shí)例分析 1.遠(yuǎn)程對象的本地接口聲明(RMIOperate.java) 該類僅僅是一個接口聲明,RMI客戶機(jī)可以直接使用它,RMI服務(wù)器必須通過一個遠(yuǎn)程對象來實(shí)現(xiàn)它,并用某個專有的URL注冊它的一個實(shí)例。 具體代碼如下: package wf.rmi;/包名import java.rmi.*; /導(dǎo)入類包/*RMI本地接口必須從Remote接口派生*/ public interface RMIOperate extends Remote /*接口中的具體方法聲明,注意必須聲明拋出RemoteException*/public double add(double x, double y) throws RemoteException; /輸入兩個浮點(diǎn)數(shù),返回其和public double minus(double x, double y) throws RemoteException; /輸入兩個浮點(diǎn)數(shù),返回其差2.遠(yuǎn)程對象實(shí)現(xiàn)類(OperateImpl.java) 這個類應(yīng)實(shí)現(xiàn)RMI客戶機(jī)調(diào)用的遠(yuǎn)程服務(wù)對象的本地接口,它必須從UnicastRemoteObject繼承,構(gòu)造函數(shù)應(yīng)拋出RemoteException異常。 具體代碼如下: package wf.rmi; /包名/導(dǎo)入需要的類包import java.rmi.*;import wf.rmi.RMIOperate;import java.rmi.server.UnicastRemoteObject;public class OperateImpl extends UnicastRemoteObject implements RMIOperate /*構(gòu)造函數(shù)*/ public OperateImpl() throws RemoteException /*實(shí)現(xiàn)本地接口中聲明的add方法*/ public double add(double x, double y) throws RemoteException double z = x + y;return z; /*實(shí)現(xiàn)本地接口中聲明的minus方法*/ public double minus(double x, double y) throws RemoteException double z = x - y;return z; 3.RMI服務(wù)器類(RMIServer.java) 該類創(chuàng)建遠(yuǎn)程對象實(shí)現(xiàn)類OperateImpl的一個實(shí)例,然后通過一個專有的URL來注冊它。所謂注冊就是通過Java.rmi.Naming.bind()方法或Java.rmi.Naming.rebind()方法,將OperateImpl實(shí)例綁定到指定的URL上。 具體實(shí)現(xiàn)代碼如下: package wf.rmi; /包名/導(dǎo)入需要的類包import java.rmi.Naming;import wf.rmi.OperateImpl;public class RMIServer public static void main(String args) try/創(chuàng)建遠(yuǎn)程對象的實(shí)現(xiàn)實(shí)例OperateImpl operObj = new OperateImpl();/提示信息 System.out.println(RMI Server Starting.);/將實(shí)例注冊到專有的URL Naming.rebind(rmi:/RMIOperate, operObj);/等待RMI客戶機(jī)調(diào)用的提示信息 System.out.println(Waiting RMI Client Invoke.); catch(Exception e)e.printStackTrace(); 4.RMI客戶機(jī)類(RMIClient.java) RMI客戶使用java.rmi.Naming.lookup()方法,在指定的遠(yuǎn)程主機(jī)上查找RMI服務(wù)對象,若找到就把它轉(zhuǎn)換成本地接口RMIOperate類型。它與CORBA不同之處在于RMI客戶機(jī)必須知道提供RMI服務(wù)主機(jī)的URL,這個URL可以通過rmi:/host/path或rmi:/host:port/path來指定,如果省略端口號,就默認(rèn)使用1099。Java.rmi.Naming.lookup()方法可能產(chǎn)生三個異常:Java.rmi.RemoteException、Java.rmi.NotBoundException、. MalformedURLException,三個異常都需要捕獲。 下面是詳細(xì)代碼: package wf.rmi; /包名/導(dǎo)入需要的類包import java.rmi.*;import .*;import java.io.*;public class RMIClientpublic static void main(String args)tryBufferedReader readIn = new BufferedReader(new InputStreamReader(System.in);String host = localhost; /默認(rèn)為本地主機(jī) /帶輸入?yún)?shù)時,將host設(shè)置為指定主機(jī)if (args.length 0) host = args0; /根據(jù)指定的URL定位遠(yuǎn)程實(shí)現(xiàn)對象RMIOperate rmiObj = (RMIOperate)Naming.lookup(rmi:/ + host + /RMIOperate);/提示輸入運(yùn)算參數(shù)1System.out.println(Please Input Data1: );String str1 = readIn.readLine(); /讀取輸入?yún)?shù)1double x = 0;try x = Double.parseDouble(str1); /分析輸入?yún)?shù)1,轉(zhuǎn)換為double類型catch(NumberFormatException nfe)x = 0; /如果轉(zhuǎn)換異常,則重置x為0 /提示輸入運(yùn)算參數(shù)2System.out.println(Please Input Data2: );String str2 = readIn.readLine();/讀取輸入?yún)?shù)2double y = 0;tryy = Double.parseDouble(str2); /分析輸入?yún)?shù)2,轉(zhuǎn)換為double類型catch(NumberFormatException nfe)y = 0; /如果轉(zhuǎn)換異常,則重置y為0 /調(diào)用遠(yuǎn)程對象的本地接口方法,實(shí)現(xiàn)輸入?yún)?shù)的加、減運(yùn)算,并輸出結(jié)果System.out.println(Data1 Add Data2 Result is: + rmiObj.add(x, y);System.out.println(Data1 minus Data2 Result is: + rmiObj.minus(x, y);catch(Exception e)e.printStackTrace();RMI Server/Client的編譯與運(yùn)行 (1).編譯所有的源代碼(如圖1) 圖1(2).生成客戶端存根和服務(wù)器框架(如圖2) 圖2這將構(gòu)造OperateImpl_Stub.class和OperateImpl_Skel.class。這時可將所有的Class文件打包成jar,并將其分別置于RMI客戶機(jī)和RMI服務(wù)器的ClassPath中(如圖3): 圖3當(dāng)然,也可以只將RMIOperate.class、RMIClient.class和OperateImpl_Stub.class復(fù)制到RMI客戶機(jī),將RMIOperate.class、OperateImpl.class 、RMIServer.class和OperateImpl_Skel.class復(fù)制到RMI服務(wù)器。 (3).啟動RMI注冊(如圖4) 圖4(4).運(yùn)行和調(diào)用 在服務(wù)器上執(zhí)行RMIServer(如圖5) 圖5 在本地客戶機(jī)上運(yùn)行RMIClient(如圖6) 圖6 在遠(yuǎn)程客戶機(jī)上運(yùn)行RMIClient(須指明RMI服務(wù)器主機(jī)名或IP地址,如圖7) 圖7至RMI從Java1.1開始,RMI使得運(yùn)行于不同JVM(包括不同主機(jī))上的Java應(yīng)用程序可以彼此通話。 即:一個JVM中的Java應(yīng)用程序可以調(diào)用另一JVM上的對象(遠(yuǎn)程對象)所定義的方法。 Java RMI有著重要的意義。RMI在Java網(wǎng)絡(luò)編程和高級編程中都有重要的應(yīng)用,如EJB, Jini等。 Java2對RMI做了很多增強(qiáng)和改進(jìn),如安全性,動態(tài)代碼下載等。 本文給出了一個最簡單的例子,以說明其中的一些基本原理。本文的特點(diǎn)是注重了實(shí)際開發(fā)和真正的運(yùn)行 環(huán)境相結(jié)合,模擬了RMI真正的開發(fā)和運(yùn)行過程。 1. 實(shí)現(xiàn)遠(yuǎn)程接口,生成遠(yuǎn)程對象,存根(Stub)和框架(Skeleton) 實(shí)現(xiàn)遠(yuǎn)程接口,遠(yuǎn)程接口告訴JVM:實(shí)現(xiàn)了該接口的對象可以遠(yuǎn)程調(diào)用及有哪些方法可以調(diào)用。 本例子中定義了sayHello()。由于遠(yuǎn)程調(diào)用會涉及到網(wǎng)絡(luò)通訊,因此這些方法都要拋出RemoteException. 遠(yuǎn)程接口和遠(yuǎn)程對象可以由A開發(fā),并把遠(yuǎn)程接口(Hello)d打包分給Client端開發(fā)者B。 建立f:server目錄,把Hello.java和HelloImpl.java拷貝到該目錄中。 / Hello.java package jdeveloper.rmi; import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote String sayHello() throws RemoteException; 生成遠(yuǎn)程對象. / HelloImpl.java package jdeveloper.rmi; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.RMISecurityManager; import java.rmi.server.UnicastRemoteObject; public class HelloImpl extends UnicastRemoteObject implements Hello public HelloImpl() throws RemoteException super(); public String sayHello() return Hello World!; public static void main(String args) / Create and install a security manager if (System.getSecurityManager() = null) System.setSecurityManager(new RMISecurityManager(); try Hello obj = new HelloImpl(); / Bind this object instance to the name HelloServer Naming.rebind(HelloServer, obj); System.out.println(HelloServer bound in registry); catch (Exception e) System.out.println(HelloImpl err: + e.getMessage(); e.printStackTrace(); 存根(Stub)和框架(Skeleton) f: cd server javac -d . Hello.java javac -d . HelloImpl.java rmic -d . jdeveloper.rmi.HelloImpl jar cvf hello.jar jdeveloperrmiHello.class 把hello.jar分發(fā)給Client端的開發(fā)者B。 存根(Stub)的存放! 存根(Stub)是動態(tài)下載的。Client通過存根(Stub)和遠(yuǎn)程對象的框架(Skeleton)通訊,對Client來 講就象操作本地對象一樣。在大多數(shù)情況下,可下載的代碼放到http服務(wù)器的某個目錄中。本例子放到http:/hjc/rmi下。 hjc:機(jī)器名,rmi:http的一個目錄。如果只是單機(jī)測試則可以放到某個目錄下 如f:serverclasses. 本文將對以上兩種方法都給出運(yùn)行的步驟(policy文件和bat文件)。 2. 實(shí)現(xiàn)Client端程序 / HelloClient.java package jdeveloper.rmi; import java.rmi.RMISecurityManager; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.NotBoundException; public class HelloClient public static void main(String args) throws Exception System.setSecurityManager(new RMISecurityManager(); Hello RemoteObj = (Hello)Naming.lookup(/+ args0 +/HelloServer); System.out.println(RemoteObj.sayHello(); 建立f:client目錄,把HelloClient.java拷貝到該目錄中。 建立f:clientclasses目錄,把hello.jar拷貝到該目錄中。 f: cd client javac -classpath %CLASSPATH%;f:clientclasseshello.jar -d . HelloClient.java 3. 運(yùn)行程序 啟動DOS窗口 set classpath= start rmiregistry A.以單機(jī)方式運(yùn)行 建立f:serverclassesjdeveloperrmi目錄 f: cd f:serverclasses copy f:serverhello.jar . copy f:serverjdeveloperrmiHelloImpl_Stub.class f:serverclassesjdeveloperrmi jar xvf hello.jar 啟動新的DOS窗口 把 starthelloserver.bat 和 rmiserver.policy 放到f:server 運(yùn)行 starthelloserver starthelloserver.bat SET CP=f:server;f:serverclasseshello.jar echo using classpath: %CP% java -classpath %CP% -Djava.rmi.server.codebase=file:/f:serverclasses/ -Djava.rmi.server.hostname=hjc -Djava.security.policy=rmiserver.policy jdeveloper.rmi.HelloImpl rmiserver.policy grant permission .SocketPermission *:1024-65535, connect; ; 啟動新的DOS窗口 把 starthelloclient.bat 和 rmiclient.policy 放到f:client 運(yùn)行 starthelloclient starthelloclient.bat echo off set CP=f:client;f:clientclasseshello.jar echo using classpath %CP% echo on java -classpath %CP% -Djava.rmi.server.codebase=file:/f:serverclasses/ -Djava.security.policy=rmiclient.policy jdeveloper.rmi.HelloClient %1 rmiclient.policy grant permission .SocketPermission *:1024-65535, connect; permission java.io.FilePermission f:serverclasses-, read; ; B.以網(wǎng)絡(luò)方式運(yùn)行 建立 apache_pathhtdocsrmijdeveloperrmi目錄 cd apache_pathhtdocsrmi copy f:serverhello.jar . copy f:serverjdeveloperrmiHelloImpl_Stub.class apache_pathhtdocsrmijdeveloperrmi jar xvf hello.jar 把 starthellohttpserver.bat 和 rmihttpserver.policy 放到f:server 啟動新的DOS窗口 運(yùn)行 starthellohttpserve

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論