`

roller扩展开发经验小结之xmlrpc

阅读更多
roller扩展开发经验小结之xmlrpc

去年10月为了满足一个客户的需求,让我开发一个教学博客系统出来,当时考虑节约成本就使用了一个比较优秀的开源博客平台来做二次开发。这个开源平台就是 roller,是apache的一个项目,能收录在apache下面说明还是有两把刷子的,matrix的部落隔就是直接使用的roller,而且看到确切消息说网易的博客平台也是基于roller进行开发的。
roller地址:http://roller.apache.org/
现在教学博客平台已近开发完成投入使用了,而在这个过程中发现了roller确实有很多地方值得一个jee开发人员借鉴的地方,所以今天开始打算把学到的这些经验进行一下总结了。好久没写blog了,前段时间确实太忙了,事情太多了。现在打算每天挤点时间把这些经验都记录下来,不然我怕日子久了我都忘记了。
首先先讲的是xmlrpc,rpc的全称是Remote Procedure Call,实际上就是为了让客户端可以轻松的对服务端的一些方法啊,过程进行调用。xmlrpc其实是一个使用xml来实现rpc的规范,使用的传输协议还是我们最熟悉的http,不同的是传输的格式是使用xml的格式来封装数据的,而不是使用html了。基于这个规范呢其实是有多种实现的,由php的,有Python的。在这里我要介绍的是roller中所使用的一个实现,依然是apache下的一个项目Apache XML-RPC:http://ws.apache.org/xmlrpc/。
在roller中使用的是xmlrpc的服务段,所以下面我先介绍服务端和客户端的设置以及调用方法
1、当然是把Apache XML-RPC的包引入到服务端和客户段
客户端引入:xmlrpc-common.jar  xmlrpc-client.jar
服务端引入:xmlrpc-common.jar  xmlrpc-server.jar

2、使用java的实现当然要有一个servlet了,
先介绍客户端:遵循http协议,客户端针对一个url发送请求
下面是相关代码
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

public class RpcClient {
   public static void main(String[] args) throws Exception {
XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
XmlRpcClient client = new XmlRpcClient();
       try {
            config.setServerURL(new URL("http://127.0.0.1:8088/roller-services/xmlrpc"));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        config.setBasicUserName("user");
        config.setBasicPassword("pwd");
        config.setEnabledForExtensions(true);
        config.setConnectionTimeout(60 * 1000);
        config.setReplyTimeout(60 * 1000);

        // set configuration
        client.setConfig(config);

   }
}

再介绍服务端:服务端自然要有一个servlet来接受这个请求了
在web.xml中配置servlet
<!--XmlRpc servlet-->
<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>/roller-services/xmlrpc</url-pattern>
</servlet-mapping>
这里的配置我使用的是默认的servlet,当然你也可以使用自己定义的servlet了,我的需求比较简单,所以就没有再另外定义servlet


3、下面就是客户端根据需求发送自己特定的rpc请求了,比如我需要获取服务端所有的blogList
客户端的调用代码如下:
        try {
          Object[] result = (Object[]) client.execute("blogger.getAllblogList",
                params);
        } catch (Exception e) {
            e.printStackTrace();
        }
那么服务段又是如何处理这个请求的呢?上面那个servlet会把请求根据不同rpc请求转发给不同的处理器,不过由于servlet我使用的是默认的,所以分发这个动作是使用配置properties文件来实现的,这里有个不好的地方要说明的是配置文件必须在项目的/org/apache/xmlrpc /webserver/XmlRpcServlet.properties路径下,这个是Apache XML-RPC做得不好的一个地方。配置文件内容如下
blogger=org.apache.roller.webservices.xmlrpc.BloggerAPIHandler
metaWeblog=org.apache.roller.webservices.xmlrpc.MetaWeblogAPIHandler
当服务端接受到上面客户端的请求之后,就会根据blogger到BloggerAPIHandler去调用getAllblogList这个方法。

4 最后一步就是给客户端回传数据了
这里需要注意的是服务端一般使用的是Hashtable来对多个数据进行封装,比如:
     Hashtable result = new Hashtable();
            result.put("nickname", user.getUserName());
            result.put("userid", user.getUserName());
            result.put("email", "");
            result.put("lastname", lastname);
            result.put("firstname", firstname);          
            return result;
但是客户端在解析的时候取出来的也是一个Hashtable,然后从中取出自己需要的数据了。
       HashMap table = (HashMap) obj;
       this.nickname = table.get("nickname").toString();
       this.userid = table.get("userid").toString();
当然,最好是做一个专门的解析类来对数据进行解析了。
这里需要补充说明的是,Apache XML-RPC传输的数据类型是一些预先定义好的数据类型,但是同时它也支持用户自定义的数据类型,
具体可以参见:http://ws.apache.org/xmlrpc/advanced.html
分享到:
评论

相关推荐

    Laravel开发-roller

    Laravel开发-roller 角色和资源管理

    Laravel开发-roller .zip

    Laravel开发-roller .zip

    roller

    NULL 博文链接:https://moving200x.iteye.com/blog/1749902

    开源Java博客Roller v5.0 for tomcat.zip

    Roller 是一个全功能的多用户博客平台,于2002年首发,采用Java语言开发,设计精巧,源代码是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS ...

    Apache Roller

    Apache Roller是一个全功能,多用户和组博客服务器,适合大型和小型博客网站。它运行一个Java Web应用程序应该能够运行在任何Java EE服务器和关系数据库。目前,Apache Roller能很好的支持Tomcat和MySQL。 本人用...

    Safety evaluation of table liner for vertical roller mill

    Safety evaluation of table liner for vertical roller mill by modified fatigue limit

    roller-part01

    apache-roller-srapaapache-roller-srcche-roller-srccapache-rolaapache-roller-srcpache-roller-srcler-srcapapache-roller-srcache-roller-srcapache-roller-src

    roller-part2

    apache-rollapachapache-roller-srce-roller-srcer-srcapache-rolleapacapache-roller-srche-roller-srcr-srcapache-roapache-roller-srcller-srcapache-roller-src

    apache-roller-src

    apache-roller-src apache-roller-src apache-roller-src apache-roller-src apache-roller-src apache-roller-src apache-roller-src apache-roller-src apache-roller-src apache-roller-src

    开源Java博客Roller v5.0 for tomcat

    Roller 是一个全功能的多用户博客平台,于2002年首发,采用Java语言开发,设计精巧,源代码是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS ...

    roller安装

    NULL 博文链接:https://jarorwar.iteye.com/blog/554942

    roller安装指南电子书

    apache roller安装指南电子书 翻译官方roller安装帮助文档

    Roller4.0的另外一套cas简单解决方案

    毕竟网上关于roller4的资料少之又少.对于cas的单点集成就更是少的可怜.我试验了一下roller自带的security.xml配置的cas方案.简直报错的夸张.根本没发用.roller使用的是acegi的用户验证框架.我自己下了一套acegi配置...

    roller install、user、template guide

    roller install guide roller user guide roller template guide

Global site tag (gtag.js) - Google Analytics