




已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Java RPC通信機制之XML-RPC二、舉例下面舉一個實際運用XML-RPC進行RPC調(diào)用的例子,XML-RPC規(guī)范有多種針對不同語言的實現(xiàn),這里我們使用的是Apache的XML-RPC3.0RC1。在開始之前,需到/commons/index.html下載如下程序包:commons-codec-1.3(通用編碼/解碼算法實現(xiàn),可參考/Java/Article/29795/1954?pf=true或/commons/codec/userguide.html來獲得該軟件包的詳細信息)commons-httpclient-3.0.1(HTTP協(xié)議的客戶端編程工具包,詳細介紹見/developerworks/cn/opensource/os-httpclient/)將上述通用工具包解壓后,拷貝其中的jar文件到XML-RPC解壓目錄的dist目錄中。并添加如下環(huán)境變量:XMLRPC_HOME XML-RPC的解壓目錄XMLRPC_LIB %XMLRPC_HOME%/distXMLRPCCLASSPATH %XMLRPC_LIB%/xmlrpc-common-3.0rc1.jar;%XMLRPC_LIB%/xmlrpc-server-3.0rc1.jar;%XMLRPC_LIB%/xmlrpc-client-3.0rc1.jar;%XMLRPC_LIB%/commons-httpclient-3.0.1.jar;%XMLRPC_LIB%/commons-codec-1.3.jar 整個應(yīng)用很簡單,通過XML-RPC調(diào)用Server端提供的HelloHandler.sayHello方法回顯一個字符串信息。下面是HelloHandler接口及其實現(xiàn)類相關(guān)代碼:/ HelloHandler.javapackage demo.xmlrpc; public interface HelloHandler public String sayHello(String str); / HelloHandlerImpl.javapackage demo.xmlrpc; public class HelloHandlerImpl implements HelloHandler public String sayHello(String str) return Hello, + str + !; 以下是對應(yīng)的Server端源代碼:/ Server1.javapackage demo.xmlrpc; import java.io.IOException;import java.io.OutputStream;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; import org.apache.xmlrpc.XmlRpcException;import org.apache.xmlrpc.server.PropertyHandlerMapping;import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;import org.apache.xmlrpc.webserver.XmlRpcServletServer; public class Server1 extends HttpServlet private XmlRpcServletServer server; public void init(ServletConfig pConfig) throws ServletException super.init(pConfig); try / create a new XmlRpcServletServer object server = new XmlRpcServletServer(); / set up handler mapping of XmlRpcServletServer object PropertyHandlerMapping phm = new PropertyHandlerMapping(); phm.addHandler(HelloHandler, HelloHandlerImpl.class); server.setHandlerMapping(phm); / more config of XmlRpcServletServer object XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl)server.getConfig(); serverConfig.setEnabledForExtensions(true); serverConfig.setContentLengthOptional(false); catch (XmlRpcException e) try log(Failed to create XmlRpcServer: + e.getMessage(), e); catch (Throwable ignore) throw new ServletException(e); public void doPost(HttpServletRequest pRequest, HttpServletResponse pResponse) throws IOException, ServletException server.execute(pRequest, pResponse); 以下是對應(yīng)的Client端源代碼:/ Client1.javapackage demo.xmlrpc; import java.io.IOException;import .MalformedURLException;import java.util.Vector;import .URL; import org.apache.xmlrpc.XmlRpcException;import org.apache.xmlrpc.client.XmlRpcClient;import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; public class Client1 public static void main(String args) try / config client XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); config.setServerURL(new URL(http:/localhost:8080/jsp/XmlRpcServer); / should be modified according to your configuration of jsp container / create a new XmlRpcClient object and bind above config object with it XmlRpcClient client = new XmlRpcClient(); client.setConfig(config); / create parameter list Vector params = new Vector(); params.addElement(Tom); / execute XML-RPC call String result = (String) client.execute(HelloHandler.sayHello, params); System.out.println(result); catch (MalformedURLException e) System.out.println(e.toString(); catch (XmlRpcException e) System.out.println(e.toString(); catch (IOException e) e.printStackTrace(); 程序源碼中已包含了詳細的注釋,這里就不作過多解釋了。但需注意XmlRpcDemo_Client中的ServerURL信息應(yīng)根據(jù)自己的的jsp容器的配置作相應(yīng)調(diào)整,并需設(shè)置相應(yīng)的servlet-mapping信息,在我的jsp目錄(Tomcat5.5的Context之一)下的WEB_INF/web.xml文件中存在如下的servlet-mapping信息: XmlRpcServer demo.xmlrpc.Server1 XmlRpcServer /XmlRpcServer并且,上述Server1.class及其他相關(guān)類文件已被拷貝到j(luò)spWEB-INFclassesdemoxmlrpc目錄下。在啟動Tomcat并執(zhí)行java -classpath %CLASSPATH%;%XMLRPCCLASSPATH% demo.xmlrpc.Client1.java前,你應(yīng)該將%XMLRPC_HOME%/dist、%XMLRPC_HOME%/lib下的幾個jar文件(source就不用拷了)及前面下載的commons-codec-1.3.jar拷貝到%TOMCAT_HOME%/common/lib或jspWEB-INFlib下。Note:除了上面這種方式,你可以無需編寫任何Server端代碼,僅通過簡單配置完成上述功能,具體可參考:/xmlrpc/server.html接下來,作為比較,我們來看看XML-RPC2.0中應(yīng)該如何實現(xiàn)上述功能。以下是2.0版的Server程序:/ Server2.javapackage demo.xmlrpc; import java.io.IOException;import java.io.OutputStream; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; import org.apache.xmlrpc.XmlRpcServer; public class Server2 extends HttpServlet public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException XmlRpcServer xmlrpc = new XmlRpcServer(); xmlrpc.addHandler(HelloHandler, new HelloHandlerImpl(); byte result = xmlrpc.execute(request.getInputStream(); response.setContentType(text/xml); response.setContentLength(result.length); OutputStream out = response.getOutputStream(); out.write(result); out.flush(); 以下是2.0版的Client程序:/ Client2.javapackage demo.xmlrpc; import java.io.IOException;import .MalformedURLException;import java.util.Vector; import org.apache.xmlrpc.XmlRpcClient;import org.apache.xmlrpc.XmlRpcException; public class Client2 public static void main(String args) try XmlRpcClient xmlrpc = new XmlRpcClient(http:/localhost:8080/jsp/XmlRpcServer); Vector params = new Vector(); params.addElement(Tom); String result = (String) xmlrpc.execute(HelloHandler.sayHello, params); System.out.println(result); catch (MalformedURLException e) System.out.println(e.toString(); catch (XmlRpcException e) System.out.println(e.toString(); catch (IOException e) e.printStackTrace(); 總體上看,3.0比2.0在可配置性方面有了一些改進,其它方面則沒有太大變化,但由于功能模塊的分離,使得3.0較2.0顯得更為復(fù)雜,已經(jīng)習(xí)慣了2.0單一模塊風(fēng)格的開發(fā)者可能需要一些時間適應(yīng)這種變化。三、其它特性除了上面的基本功能,XML-RPC3還支持動態(tài)代理/工廠和異步通信等特性。通過運用動態(tài)代理特性,我們可以在Server端及Client端共享接口信息,從而在編譯期間進行必要的類型檢查,在XML-RPC內(nèi)部,所有的調(diào)用仍然是被動態(tài)轉(zhuǎn)發(fā)給XmlRpcClient對象來完成的。但要使用XML-RPC3的動態(tài)代理功能,相應(yīng)的服務(wù)器端的處理器類名稱必須是Client端接口類的全名(含包名,該名稱一般應(yīng)該與Server端接口類全名一致),否則將會導(dǎo)致調(diào)用失敗。以上面的HelloHandler接口為例,其對應(yīng)的處理器類名稱應(yīng)該為:demo.xmlrpc.HelloHandler。Note: 動態(tài)代理(JDK1.3引入)是Proxy模式、依賴注入(Dependency Injection)及動態(tài)代碼生成等技術(shù)相結(jié)合的一種應(yīng)用,在各新型Web應(yīng)用框架及容器中被廣泛采用。而要使用XML-RPC的異步通信功能,只需實現(xiàn)org.apache.xmlrpc.client.AsyncCallback接口,該接口包括兩個方法:public void handleResult(XmlRpcRequest pRequest, Object pResult);public void handleError(XmlRpcRequest pRequest, Throwable pError);此外,為了便于在普通應(yīng)用中使用XML-RPC,XML-RPC還提供了一個WebServer類,以便在應(yīng)用中內(nèi)嵌一個HTTP服務(wù)器,為Client程序提供HTTP服務(wù)。下面的范例演示了上面提到的幾種特性,以下是Server端代碼:/ Server3.javapackage demo.xmlrpc; import org.apache.xmlrpc.server.PropertyHandlerMapping;import org.apache.xmlrpc.server.XmlRpcServer;import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;import org.apache.xmlrpc.webserver.WebServer; public class Server3 private static final int port = 8080; public static void main(String args) throws Exception WebServer webServer = new WebServer(port); XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer(); PropertyHandlerMapping phm = new PropertyHandlerMapping(); phm.addHandler(demo.xmlrpc.HelloHandler, HelloHandlerImpl.class); xmlRpcServer.setHandlerMapping(phm); XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl)xmlRpcServer.getConfig(); serverConfig.setEnabledForExtensions(true); serverConfig.setContentLengthOptional(false); webServer.start(); 下面是Client端代碼:/ Client3.javapackage demo.xmlrpc; import .URL;import java.util.List;import java.util.Vector; import org.apache.xmlrpc.XmlRpcRequest;import org.apache.xmlrpc.XmlRpcException;import org.apache.xmlrpc.client.XmlRpcClient;import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;import org.apache.xmlrpc.client.AsyncCallback;import org.apache.xmlrpc.client.util.ClientFactory; class EchoCallback implements AsyncCallback public void handleResult(XmlRpcRequest pRequest, Object pResult) System.out.println(Server returns: + (String)pResult); public void handleError(XmlRpcRequest pRequest, Throwable pError) System.out.println(Error occurs: + pError.getMessage(); public class Client3 public st
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 永州師范高等??茖W(xué)?!毒W(wǎng)絡(luò)音視頻編輯實驗》2023-2024學(xué)年第二學(xué)期期末試卷
- 榆林學(xué)院《中小學(xué)歌曲彈唱》2023-2024學(xué)年第二學(xué)期期末試卷
- 鄭州軌道工程職業(yè)學(xué)院《綜合商務(wù)英語》2023-2024學(xué)年第二學(xué)期期末試卷
- 西藏警官高等??茖W(xué)校《工程熱力學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 合肥經(jīng)濟學(xué)院《播主資格證考試指導(dǎo)》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖南司法警官職業(yè)學(xué)院《微波技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 蚌埠學(xué)院《小學(xué)數(shù)學(xué)基礎(chǔ)一》2023-2024學(xué)年第二學(xué)期期末試卷
- 南寧理工學(xué)院《新聞媒介經(jīng)營管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 三亞城市職業(yè)學(xué)院《臨床與轉(zhuǎn)化醫(yī)學(xué)研究原則與方法》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川輕化工大學(xué)《民俗文化概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 人體損傷致殘程度分級(2017)全文
- 中國遺傳性血色病診療指南2024版解讀
- 美國加州租房合同范本(2篇)
- DB11-1983-2022 建筑類涂料與膠粘劑揮發(fā)性有機化合物含量限值標準
- 2023-2024學(xué)年江蘇省泰州市高二下學(xué)期6月期末考試物理試題(解析版)
- GB/T 44679-2024叉車禁用與報廢技術(shù)規(guī)范
- 汽車質(zhì)量問題匯報-8D報告培訓(xùn)材料
- 中國精對苯二甲酸(PTA)行業(yè)市場動態(tài)分析及前景戰(zhàn)略研判報告
- 軌道車司機(高級)理論知識備考試題庫大全-下(判斷題)
- 制造業(yè)智能制造技術(shù)與設(shè)備升級改造方案
- 天津市小升初英語真題(含答案)5
評論
0/150
提交評論