站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题Apache xml-rpc入门

Apache xml-rpc入门

摘要: Apache xml-rpc入门

由于最近做的一个项目需要,使用了apache xml-rpc,顺便整理一下使用的方法。 xml-rpc是一套允许运行在不同操作系统、不同环境的程序实现基于internet过程调用的规范和一系列的实现。这种远程过程调用使用http作为传输协议,xml作为传送信息的编码格式。xml-rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。 关于xml-rpc更详细的信息,请参阅http://www.xmlrpc.com。
1,客户程序 Apache xml-rpc提供两种客户类: org.apache.xmlrpc.XmlRpcClient:使用java.net.URLConnection。 org.apache.xmlrpc.XmlRpcClientLite:自身提供轻量级的http client实现。 如果您需要完全的http支持(例如:代理,重定向等等),你应该使用XmlRpcClient。反之,如果您不需要完全的http支持并且更注重性能,那么你应该仔细的试验这两种客户类。在某些平台上,可能XmlRpcClient更快,但是在某些平台上XmlRpcClientLite更快。 这两个客户类提供相同的接口。
在客户端使用apache xml-rpc是非常简单的,只需要完成下面的简单工作: // 建立xml-rpc客户 XmlRpcClient client = new XmlRpcClient("http://" + server + ":" + port);
// 设置调用参数 Vector params = new Vector(); params.addElement(name);
// 调用并取得结果 String result = (String) client.execute("hello.sayHello", params);
如果您需要进行异步调用,并使用executeAsync()方法。
2,登记Handler Object org.apache.xmlrpc.XmlRpcServer和org.apache.xmlrpc.WebServer都提供方法以登记/注销Handler Object: addHandler (String name, Object handler); removeHandler (String name);
3,在servlet环境中使用xml-rpc 典型的代码如下所示: XmlRpcServer xmlrpc = new XmlRpcServer (); xmlrpc.addHandler ("examples", new ExampleHandler ()); ... byte[] result = xmlrpc.execute (request.getInputStream ()); response.setContentType ("text/xml"); response.setContentLength (result.length()); OutputStream out = response.getOutputStream(); out.write (result); out.flush ();
请注意:execute方法不会返回任何异常,因为所有错误都被编码成xml返回可以端。
4,使用内建的http server 代码如下: XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");
//start the server System.out.println("Starting XML-RPC Server......");
WebServer server = new WebServer(8585); //register our handler class
server.addHandler("hello", new HelloHandler());
server.start();
5,Apache xml-rpc支持的类型 这些类型适用于xml-rpc的参数和返回类型,同时,如果参数或者返回类型是集合类型的话,也适用于集合元素。 XML-RPC data type Data Types generated by the Parser Types expected by the Invoker as input parameters of RPC handlers or java.lang.Integer int java.lang.Boolean boolean java.lang.String java.lang.String java.lang.Double double java.util.Date java.util.Date java.util.Hashtable java.util.Hashtable java.util.Vector java.util.Vector byte[ ] byte[ ]
6,使用内建http server的简单例子 a,建立handler object
/* * 创建日期 2004-5-12 * * 更改所生成文件模板为 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释 */ package helloxmlrpc;
import java.util.Vector;
/** * @author fyun * * 更改所生成类型注释的模板为 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释 */ public class HelloHandler { public String sayHello(String name) { return "Hello " + name; } }
b,登记并启动server /* * 创建日期 2004-5-12 * * 更改所生成文件模板为 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释 */ package helloxmlrpc;
/** * @author fyun * * 更改所生成类型注释的模板为 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释 */ import org.apache.xmlrpc.*;
public class HelloServer {
public static void initServer() { try { XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");
//start the server System.out.println("Starting XML-RPC Server......");
WebServer server = new WebServer(8585); //register our handler class
server.addHandler("hello", new HelloHandler());
server.start(); System.out.println("Now accepting requests......"); } catch (ClassNotFoundException e) { System.out.println("Could not locate SAX Driver"); } }
public static void main(String[] args){ initServer(); } }
c,客户程序 /* * 创建日期 2004-5-12 * * 更改所生成文件模板为 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释 */ package helloxmlrpc;
/** * @author fyun * * 更改所生成类型注释的模板为 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释 */ import java.io.IOException; import org.apache.xmlrpc.XmlRpc; import org.apache.xmlrpc.XmlRpcClient; import java.net.MalformedURLException; import org.apache.xmlrpc.XmlRpcException;
public class HelloClient { public static void invoke(String server, String port, String name) { try { //Use the Apache Xereces SAX Driver XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser"); //Specify the server XmlRpcClient client = new XmlRpcClient("http://" + server + ":" + port);
//create request Vector params = new Vector(); params.addElement(name);
//make a request and print the result String result = (String) client.execute("hello.sayHello", params); System.out.println("hello.sayHello: " + result); } catch (ClassNotFoundException e) { System.out.println("Could not locate SAX Driver"); } catch (MalformedURLException e) { System.out.println( "Incorrect URL fro xml-rpc server foramt:" + e.getMessage()); } catch (XmlRpcException e) { e.printStackTrace(); System.out.println("XmlRpcException :" + e.getMessage()); } catch (IOException e) { System.out.println("IOException:" + e.getMessage()); }catch(Exception e){ e.printStackTrace(); } }
public static void main(String[] args){ if( args == null || args.length < 2 ){ System.out.println("Usage: java HelloClient [server] [port] [yourname]"); System.exit(1); } invoke(args[0], args[1], args[2]); } }
7,使用servlet的例子 1,handler object不变 2,建立XmlRpcFacade package helloxmlrpc;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import org.apache.xmlrpc.XmlRpcServer;
public class XmlRpcFacade { private static XmlRpcServer xmlrpc; static{ xmlrpc = new XmlRpcServer();
//登记你的handler object xmlrpc.addHandler("hello", new HelloHandler()); }
public void execute(HttpServletRequest request, HttpServletResponse response) throws IOException { byte[] result = xmlrpc.execute(request.getInputStream());
response.setContentType("text/xml; charset=GB2312"); response.setContentLength(result.length); OutputStream out = response.getOutputStream(); out.write(result); out.flush(); out.close(); } } 3,建立servlet package hellpxmlrpc;
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*;
public class XmlRpcServlet extends HttpServlet { private static final String CONTENT_TYPE = "text/html; charset=GBK"; private XmlRpcFacade facade; public void init() throws ServletException { facade = new XmlRpcFacade(); }
//Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doService(request, response); }
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doService(request, response); }
public void doService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { facade.execute(request, response); }
//Clean up resources public void destroy() { } }
4,客户程序和内建http server类似,只需将先下面这句 XmlRpcClient client = new XmlRpcClient("http://" + server + ":" + port); 改为 XmlRpcClient client = new XmlRpcClient(); 即可
希望这篇文档能对你有小小帮助。更详细的信息可以到http://ws.apache.org/xmlrpc了解。
对该文的评论 人气:409 bluearrow8888(2004-5-19 11:41:25) 好!
以下是我的公司简介: -------------------------------- OA 软件免费下载试用! http://www.fgsoft-oa.com Office Anywhere网络智能办公系统
  Office Anywhere网络智能办公系统是名将软件最新推出的,专为中小型企业定制的网络办公软件,融合了名将软件长期从事管理软件开发的丰富经验与先进技术,该系统采用领先的B/S(浏览器/服务器)操作方式,使得网络办公不受地域限制。
  系统集成了包括内部电子邮件、短信息、公告通知、日程安排、工作日志、通讯录、考勤管理、工资上报、网络会议、讨论区、聊天室、文件柜、列车时刻查询、电话区号查询、邮政编码查询、法律法规查询等20余个极具价值的功能模块。
   Office Anywhere在功能上媲美售价数万元的网络办公系统,在安装维护上更提供了采用独有技术开发的傻瓜型安装工具、配置工具和数据库管理工具,用户可在30秒内自行安装完毕,无需专业人员即可自行维护。
  Office Anywhere采用基于WEB的企业计算,主HTTP服务器采用了世界上最先进的Apache服务器,性能稳定可靠。数据存取集中控制,避免了数据泄漏的可能。提供数据备份工具,保护系统数据安全。多达5级的权限控制,完善的密码验证与登录验证机制更加强了系统安全性。
mtchow(2004-5-19 1:11:14)
其实为何用xmlrpc而不用jaxrpc(webservices)?
beming(2004-5-18 8:52:24)
非常有帮助,Thx
↑返回目录
前一篇: applet 之饼图
后一篇: Apache Jakarta Project 的 Velocity