|    由于最近做的一个项目需要,使用了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 |  
| <i4> or <int> | 
java.lang.Integer | 
int |  
| <boolean> | 
java.lang.Boolean | 
boolean |  
| <string> | 
java.lang.String | 
java.lang.String |  
| <double> | 
java.lang.Double | 
double |  
| <dateTime.iso8601> | 
java.util.Date | 
java.util.Date |  
| <struct> | 
java.util.Hashtable | 
java.util.Hashtable |  
| <array> | 
java.util.Vector | 
java.util.Vector |  
| <base64> | 
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(<servletURL>);     即可          希望这篇文档能对你有小小帮助。更详细的信息可以到http://ws.apache.org/xmlrpc了解。  
 
  |