Archive for August 1st, 2007

You are currently browsing the archives of Enabling Technology .

我的一个Java xmlrpc-apache操纵wordPress blog的例子

package com.enablingtech.rpc;

import java.net.MalformedURLException;
import java.util.Hashtable;
import java.util.Vector;

import org.apache.xmlrpc.XmlRpc;
import org.apache.xmlrpc.XmlRpcClient;
import org.apache.xmlrpc.XmlRpcException;

 

public class Test2 {
    public static void main(String[] args) {
        try {
            XmlRpc.setDriver(”org.apache.xerces.parsers.SAXParser”);
            XmlRpcClient xmlrpc = new XmlRpcClient(
                    “http://网址/xmlrpc.php”);
            Vector params = new Vector();
            //params.addElement(”1″);
            params.addElement(”776″);
            params.add(”用户名”);
            params.add(”密码”);

            Vector mp = (Vector)xmlrpc.execute(”mt.getRecentPostTitles”,
                    params);
                System.out.println(mp.get(0));
                System.out.println(mp.get(1));
        } catch (MalformedURLException e) {
            System.out.println(e.toString());
        } catch (XmlRpcException e) {
            System.out.println(e.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Posted by micas on Aug 1st 2007 | Filed in SEO | Comments (0)

小试XML-RPC(浏览器javascript与服务器java通信)[转]

From http://www.blogjava.net/mstar/

   前些天无意中发现了XML-RPC(不过笑我才发现啊),总想找个机会摆弄摆弄。毕业论文基本上弄完了,所以决定今天把它弄明白。
XML-RPC的最大用处,我首先想到的是浏览器在不刷新页面的情况下与服务器通信,请求数据。下面我就说一下我用XML-RPC是怎么实现的。

第一步:选择XML-RPC实现。
XML-RPC的一个很大优势就是 它是一个标准,并且各种开发环境下都有实现(酷),这是它能够轻松跨平台的原因。
javascript有3个实现。我看了一下最好的应该是jsolait(JavaScript o Lait)的实现了。因为他不仅仅是一个xml-rpc的实现,除此之外还有很多javascript库,详细内容请看这里(http://jsolait.net/)。
java的实现就更多了,我当然毫不犹豫地选择apache的。详细内容看这里(http://ws.apache.org/xmlrpc/

第二步:建立服务。
用java建立xml-rpc有两种方式,一种是单独开个端口,一种是用servlet。我们客户端是用javascript,那么服务端用servlet是再好不过的了。
如何使用apache的xml-rpc,请详细看apache的资料。(大哥你不会连servlet也不会建吧,那你还是不要往下看了)。
代码如下:
这是一个sayHello的服务类:

public class HelloService {

public String sayHello(String name){
return “Hello: ”+name+” !”;
 }

}

下面是一个Math服务类:

public class MathService {
public double add(Vector v){
double a = Double.parseDouble((String)v.get(0));
double b = Double.parseDouble((String)v.get(1));
return a+b;
 }

public double mult(Vector v){
double a = Double.parseDouble((String)v.get(0));
double b = Double.parseDouble((String)v.get(1));
return a*b;
 }
}

接着是Servlet啦,作为RPC Server用的,这段代码比较经典,很多资料上都有。

public class RpcServer extends HttpServlet {
protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  XmlRpcServer xmlrpc = new XmlRpcServer();
  xmlrpc.addHandler(”HelloService”, new HelloService());
  xmlrpc.addHandler(”MathService”,new MathService());
byte[] result = xmlrpc.execute(request.getInputStream());
  response.setContentType(”text/xml”);
  response.setContentLength(result.length);
  OutputStream out = response.getOutputStream();
out.write(result);
out.flush();
 }
}

主要是这三句:
XmlRpcServer xmlrpc = new XmlRpcServer();
xmlrpc.addHandler(”HelloService”, new HelloService());
xmlrpc.addHandler(”MathService”,new MathService());
一定要记牢Handler的名字,就是第一个参数,因为客户端就靠他来表示要调用的方法呢。

行了现在可以在web.xml中写入配置了:

<servlet>
<servlet-name>RpcServer</servlet-name>
<servlet-class>org.mstar.rpc.RpcServer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RpcServer</servlet-name>
<url-pattern>/RpcServer</url-pattern>
</servlet-mapping>

至此,服务端的工作已经完成,启动应用服务器就行了。

下面是javacript的实现,这也是难点(其实不难理解,只是没有中文材料)。
把jsolait的库下来以后解压缩,得到一些js文件,具体我就不说了。

建立一个html文件:

<html>
<head>
<title>XML-RPC</title>
<script type=”text/javascript” src=”./js/init.js”></script>
<script type=”text/javascript” src=”./js/lib/urllib.js”></script>
<script type=”text/javascript” src=”./js/lib/xml.js”></script>
<script type=”text/javascript” src=”./js/lib/xmlrpc.js”></script>
<script type=”text/javascript” src=”./js/hello.js”></script>
</head>
a:<input type=”text” id=”a” /><br>
b:<input type=”text” id=”b” /><br>
<input type=”button” id=”do1″ value=”a+b” onclick=”add()”/>
<input type=”button” id=”do2″ value=”say” onclick=”hello()”/>
<input type=”text” id=”result” />
</html>

注意到前面那一堆javascript的引用吗?就这么写吧。可别把hello.js当成solait的东西啦(看名字也知道啦),你是找不到的。这是我们自己写的:
hello.js

hello = function(){
var xmlrpc=null;
try{
var xmlrpc = importModule(”xmlrpc”);
 }catch(e){
     reportException(e);
throw “importing of xmlrpc module failed.”;
 }
var addr = “http://localhost:8080/Rpc/RpcServer”;
var methods = [”HelloService.sayHello”];
var rslt;

try{
var service = new xmlrpc.ServiceProxy(addr, methods);
        rslt = service.HelloService.sayHello(”MTY”);
    }catch(e){
var em;
if(e.toTraceString){
            em = e.toTraceString();
        }else{
            em = e.message;
        }
        rslt = “Error trace: \n\n” + em;
    }
 document.getElementById(”result”).value=rslt;
}
add = function(){
var xmlrpc=null;
var a = document.getElementById(”a”).value;
var b = document.getElementById(”b”).value;
var params = new Array();
 params[0] = a;
 params[1] = b;
try{
var xmlrpc = importModule(”xmlrpc”);
 }catch(e){
     reportException(e);
throw “importing of xmlrpc module failed.”;
 }
var addr = “http://localhost:8080/Rpc/RpcServer”;
var methods = [”HelloService.sayHello”,”MathService.add”];
var rslt;

try{
var service = new xmlrpc.ServiceProxy(addr, methods);
        rslt = service.MathService.add(params);
    }catch(e){
var em;
if(e.toTraceString){
            em = e.toTraceString();
        }else{
            em = e.message;
        }
        rslt = “Error trace: \n\n” + em;
    }
 document.getElementById(”result”).value=rslt;
}

这个js文件中有两个函数,一个负责从sayhello,一个负责加法运算。
这里需要一些解释的地方:
1、
 var xmlrpc=null;
 try{
     var xmlrpc = importModule(”xmlrpc”);
 }catch(e){
     reportException(e);
     throw “importing of xmlrpc module failed.”;
 }
这里是把xmlrpc模块引进来,你也就这么写吧,我也不知道为什么。
2、
 var addr = “http://localhost:8080/Rpc/RpcServer“;
 var methods = [”HelloService.sayHello”];
定义服务地址和要用的方法名。规则大概你也能看懂:Handler名.方法名。这里的Handler名就是你在xmlrpcServer中注册名,就是我上面让你记住的那个。方法名就是那个类自己的方法名。注意,methods是一个数组,所以可以写多个方法,如第二个例子。var methods = [”HelloService.sayHello”,”MathService.add”];
3、
    try{
        var service = new xmlrpc.ServiceProxy(addr, methods);
        rslt = service.HelloService.sayHello(”MTY”);
    }catch(e){
        var em;
        if(e.toTraceString){
            em = e.toTraceString();
        }else{
            em = e.message;
        }
        rslt = “Error trace: \n\n” + em;
    }
通过new xmlrpc.ServiceProxy(addr, methods);得到服务代理。
然后调用服务的方法就行了,方法就是代理.Handler名.方法名(参数)。好像参数只能有一个,在第二个例子中我开始有两个参数a,b会发生错误。怎么办?没办法,在javascript用Array传参数,在java用Vector接参数(为什么用Vector,因为xml-rpc规范中的 Array,apache使用Vector实现的,为什么javascript不用Vector,因为js没有Vector,且js的的Array是可变长的)。当然这就需要很多java端类型转换工作,js是弱类型的就不用转换了。

Posted by micas on Aug 1st 2007 | Filed in SEO | Comments (0)

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了解。

Posted by micas on Aug 1st 2007 | Filed in SEO | Comments (0)

XML-RPC 之 Apache XML-RPC 实例

iTbulo.COM 2005-4-13 佚名(63)

作者:王恩建来源:http://www.sentom.netXML-RPC 是工作在 Internet 上的远程过程调用协议。通俗点讲,就是使用 HTTP 协议交互,交互的载体是 XML 文件。XML-RPC 具体的规范说 明请参考这里。
图片来自XML-RPC官方网站

XML-RPC 规范定义了六种数据类型,下表是这六种数据类型与 Java 的数据类型对应表。

XML-RPCJava<i4> 或 <int>int<boolean>boolean<string>java.lang.String<double>double<dateTime.iso8601>java.util.Date<struct>java.util.Hashtable<array>java.util.Vector<base64>byte[ ]

XML-RPC 规范的各种平台都有具体实现,XML-RPC 规范的 Java 实现都有好几种,这里我们选择了 Apache XML-RPC。
XML-RPC 服务端实现先定义一个简单业务对象 MyHandler,远程客户端将调用该对象的方法,具体代码如下:

package net.sentom.xmlrpc;

public class MyHandler {
    public String sayHello(String str) {
        return “Hello,” + str;
    }
}

然后定义一个 Servlet 名叫 MyXmlRpcServer,远程客户端通过 HTTP-POST 访问该 Servlet。

package net.sentom.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 MyXmlRpcServer extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        XmlRpcServer xmlrpc = new XmlRpcServer();
        xmlrpc.addHandler(”myHandler”, new MyHandler());
        byte[] result = xmlrpc.execute(request.getInputStream());
        response.setContentType(”text/xml”);
        response.setContentLength(result.length);
        OutputStream out = response.getOutputStream();
        out.write(result);
        out.flush();
    }
}

需要特别说明是:

xmlrpc.addHandler(”myHandler”, new MyHandler());

为了便于理解,这里可以看成普通的:

MyHandler myHandler = new MyHandler();

最后在web.xml文件中加入以下几行:

<servlet>
    <servlet-name>MyXmlRpcServer</servlet-name>
    <servlet-class>net.sentom.xmlrpc.MyXmlRpcServer</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyXmlRpcServer</servlet-name>
    <url-pattern>/MyXmlRpcServer</url-pattern>
</servlet-mapping>

XML-RPC 客户端实现客户端相对简单一些,先来一个 Java 客户端实现 MyXmlRpcClient:

package net.sentom.xmlrpc;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Vector;
import org.apache.xmlrpc.XmlRpcClient;
import org.apache.xmlrpc.XmlRpcException;

public class MyXmlRpcClient {
    public static void main(String[] args) {
        try {
            XmlRpcClient xmlrpc = new XmlRpcClient(
                    “http://localhost:8080/XMLRPC/MyXmlRpcServer”);
            Vector params = new Vector();
            params.addElement(”Tom”);
            String result = (String) xmlrpc.execute(”myHandler.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();
        }
    }
}

http://localhost:8080/XMLRPC/MyXmlRpcServer 为 MyXmlRpcServer 的访问URL。

String result = (String) xmlrpc.execute(”myHandler.sayHello”,params);

再来一个 Python 客户端实现

import xmlrpcliburl = ‘http://localhost:8080/XMLRPC/MyXmlRpcServer’;server = xmlrpclib.Server(url);print server.myHandler.sayHello(’Tom’);

Posted by micas on Aug 1st 2007 | Filed in SEO | Comments (0)

XML RPC简介 和一个例子(java)

1.xml rpc是什么
1.1. xml rpc简介
xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。
一个rpc系统,必然包括2个部分:1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;2.rpc server,用于响应rpc client的请求,执行方法,并回送方法执行结果。
1.2. xml rpc的可用版本
xml rpc client和xml rpc server都有很多版本的实现。一般而言,一个实现版本都会同时实现client/server。但由于都满足xml rpc规范,从理论上讲,任何一个版本的rpc client实现与任何一个版本的rpc server都能配套使用。
更进一步,由于xml rpc以xml文本的方式,使用http协议传输,所以与编程语言无关。例如:rpc client的已实现版本包括了:perl,php,python,c/c++,java,等等;rpc server的实现语言包括perl,java,等。
同一种编程语言所实现的版本也不止一个。例如java版的实现有:Marque的xmlrpc实现(http://xmlrpc.sourceforge.net/),apache的xmlrpc 实现(http://ws.apache.org/xmlrpc/)

1.3.xmlrpc的工作原理
完整的需要参考xmlrpc规范(http://www.xmlrpc.com/spec)
简单描述:
rpcclient的工作原理:rpcclient根据URL找到rpcserver -> 构造命令包,调用rpcserver上的某个服务的某个方法 -> 接收到rpcserver的返回,解析响应包,拿出调用的返回结果。
rpcserver的工作原理:启动一个webserver(在使用内置的webserver的情况下) -> 注册每个能提供的服务,每个服务对应一个Handler类 ->进入服务监听状态。
1.4. xmlrpc规范
区区6页,讲的非常清楚,建议细看。http://www.xmlrpc.com/spec

2.在java中使用xml rpc的几个例子
2.0.环境准备:下载如下包并设置到CLASSPATH中
apache xmlrpc软件包(http://ws.apache.org/xmlrpc/)
commons-httpclient-3.0-rc4.jar
commons-codec-1.3.jar
2.1.使用apache的java xmlrpc实现版本,实现简单的加/减服务。参考附录中test.XmlRPCClient类与test.JavaServer类
2.2.使用apache的java xmlrpc实现版本,测试java的数据类型与xmlrpc数据类型的相互对应关系。参考附录中test2.XmlRPCClient类与test2.JavaServer类。
在这里简单描述一下:
>xmlrpc中的Array类型,对应到java中的Vector类型
例如:在RPC Server中的某个服务方法的返回值的声明类型是String[],但在Client中接收到的将是Vector对象;
反之,如果Client传送过去的调用参数为String[],但在RPC Server中所接收到的将是Vector对象
当然,如果我们不使用String[],直接声明为Vector,也是可以的。
>xmlrpc中的struct类型,对应到java中的Hashtable类型
>其它的类型,如:String,int,double,boolean,Date等,都比较好对应。需要注意的是:在rpc Client中,如果使用到int/double/boolean这些基本类型时,需要将他们封装成一个相应的Object,例如:Integer/Double/Boolean。

2.3.使用apache的java xmlrpc实现版本,实现自定义类型的数据的传输
这个sample中,假设所传输的object都实现了XmlRPCSerializable接口。这个例子的目的是:模拟unionmon中的 command对象。当假设所传输的数据是一个Object[]时,可以用这种方式传输。结合unionmon中的代码生成机制,每个vo的序列化/反序列化方法可以在代码生成过程中完成。同样地,vox的序列化/反序列化方法需要手写。
参考代码:附录中的test3.XmlRPCSerializable , test3.AccountVO , test3.XmlRPCClient , test3.JavaServer

2.4.不启动内置的WebServer,让tomcat支持rpc server。
做法:1.实现一个Servlet,并配置到tomcat中;2.让rpc client直接找这个servlet,获得服务。
注意rpc client使用的是http post方法,所以该servlet中只需要实现doPost方法。

过程:在tomcat中的web.xml增加如下配置:

SampleServiceServlet
test4.ServletXmlRPCServer

SampleServiceServlet
/SampleServiceServlet

参考类:附件中的test4.SampleService,test4.ServletXmlRPCServer,test4.XmlRPCClient

3.todolist
3.1.能否通过introspect方式,使得自定义类型的vo的序列化/反序列化工作自动完成.castor可以完成对象的xml binding,似乎可参考
3.2.soap协议比xmlrpc复杂并强大。soap不熟悉。另,soap一定与web service在一起用?能否不用web service,但使用soap做rmi的协议。

4.附录
4.1.附录1 xmlrpc所支持的数据类型(略)
4.2.附录2 xmlrpc数据类型与java语言的数据类型的映射(略)
4.3.参考资料
http://xmlrpc.sourceforge.net/ –Marque的xmlrpc实现
http://ws.apache.org/xmlrpc/ apache上xmlrpc server的实现
http://xmlrpc-c.sourceforge.net/xmlrpc-howto/xmlrpc-howto.html xmlrpc howto
http://www.sentom.net/list.asp?id=80 xml-rpc之实例
http://www.xmlrpc.com/spec xmlrpc规范

Posted by micas on Aug 1st 2007 | Filed in SEO | Comments (0)