专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »博文摘选 » xmlrpc:Web Services:Apache XML-RPC »正文

xmlrpc:Web Services:Apache XML-RPC

来源: 发布时间:星期三, 2009年9月30日 浏览:0次 评论:0
转载自:http://blog.csdn.net/hantiannan/archive/2009/09/30/4623171.aspx

    XML-RPC(http://ws.apache.org/xmlrpc/ )的全称是XML Remote Procedure Call,即XML远程方法调用。是JAVA实现的XML-RPC。

    这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。Xml-Rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。

  XML-RPC是工作在Internet上的远程过程调用协议。一个XML-RPC消息就是一个请求体为xml的http-post请求,被调用的方法在服务器端执行并将执行结果以xml格式编码后返回。

  • All primitive Java types are supported, including long, byte, short, and double.
  • Calendar objects are supported. In particular, timezone settings, and milliseconds may be sent.
  • DOM nodes, or JAXB objects, can be transmitted. So are objects implementing the java.io.Serializable interface.
  • Both server and client can operate in a streaming mode, which preserves resources much better than the default mode, which is based on large internal byte arrays.

   概念图如下:

和RMI类似,需要服务器类和客户端类。还需要配置web.xml.

服务器类代码片段:

package org.apache.xmlrpc.demo.webserver;







  import java.net.InetAddress;



  import org.apache.xmlrpc.common.TypeConverterFactoryImpl;

  import org.apache.xmlrpc.demo.webserver.proxy.impls.AdderImpl;

  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 Server {

      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();

          /* Load handler definitions from a property file.

           * The property file might look like:

           *   Calculator=org.apache.xmlrpc.demo.Calculator

           *   org.apache.xmlrpc.demo.proxy.Adder=org.apache.xmlrpc.demo.proxy.AdderImpl

           */

          phm.load(Thread.currentThread().getContextClassLoader(),

                   "MyHandlers.properties");



          /* You may also provide the handler classes directly,

           * like this:

           * phm.addHandler("Calculator",

           *     org.apache.xmlrpc.demo.Calculator.class);

           * phm.addHandler(org.apache.xmlrpc.demo.proxy.Adder.class.getName(),

           *     org.apache.xmlrpc.demo.proxy.AdderImpl.class);

           */

          xmlRpcServer.setHandlerMapping(phm);

        

          XmlRpcServerConfigImpl serverConfig =

              (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();

          serverConfig.setEnabledForExtensions(true);

          serverConfig.setContentLengthOptional(false);



          webServer.start();

      }

  }



web.xml配置片段:





<servlet>

        <servlet-name>XmlRpcServlet</servlet-name>

        <servlet-class>org.apache.xmlrpc.webserver.XmlRpcServlet</servlet-class>

        <init-param>

          <param-name>enabledForExtensions</param-name>

          <param-value>true</param-value>

          <description>

            Sets, whether the servlet supports vendor extensions for XML-RPC.

          </description>

        </init-param>

    </servlet>

    <servlet-mapping>

        <servlet-name>XmlRpcServlet</servlet-name>

        <url-pattern>/xmlrpc</url-pattern>

    </servlet-mapping>



客户端代码片段:





package web.service.xml.rpc;



import java.net.MalformedURLException;

import java.net.URL;



import org.apache.xmlrpc.XmlRpcException;

import org.apache.xmlrpc.client.XmlRpcClient;

import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

import org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory;

import org.apache.xmlrpc.client.util.ClientFactory;



public class Client {

    public static void main(String[] args) throws Exception {

        // create configuration

        XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();

        config.setServerURL(new URL("http://127.0.0.1:8080/WEBXMLRPC"));

        config.setEnabledForExtensions(true);  

        config.setConnectionTimeout(60 * 1000);

        config.setReplyTimeout(60 * 1000);



        XmlRpcClient client = new XmlRpcClient();

      

        // use Commons HttpClient as transport

        client.setTransportFactory(

            new XmlRpcCommonsTransportFactory(client));

        // set configuration

        client.setConfig(config);



        // make the a regular call

        Object[] params = new Object[]

            { new Integer(2), new Integer(3) };

        Integer result = (Integer) client.execute("calculator_test.add", params);

        System.out.println("2 + 3 = " + result);

    }

}



这里的calculator_test.add关键字是在MyHandlers.properties中配置的。add是方法名。

配置例子:calculator_test=web.service.xml.rpc.Calculator

Calculator类定义如下:

package web.service.xml.rpc;



public class Calculator {

    public int add(int i1, int i2) {

            return i1 + i2;

    }
    public int subtract(int i1, int i2) {

            return i1 - i2;

    }

}

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: