随笔-55  评论-208  文章-0  trackbacks-0

去年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

posted on 2008-07-17 07:23 rocket 阅读(2199) 评论(8)  编辑  收藏 所属分类: 经验积累常用框架

评论:
# re: roller扩展开发经验小结之xmlrpc 2008-07-17 09:27 | andy 林
我问个简单的问题阿
config.setServerURL(new URL("http://127.0.0.1:8088/xmlrpc"));
<url-pattern>/roller-services/xmlrpc</url-pattern>
怎么觉得路径不是很一样,难道我的理解有问题?
谢谢  回复  更多评论
  
# re: roller扩展开发经验小结之xmlrpc[未登录] 2008-07-17 09:43 | paul
来的很及时啊。我正想做一个blog,但看看open-open上没有合适的,可以去看看这个啦  回复  更多评论
  
# re: roller扩展开发经验小结之xmlrpc 2008-07-17 09:43 | rocket
@andy 林
sorry,你看得比较仔细,这里是我当时copy的两段不同的代码,所以出问题了,呵呵,马上改  回复  更多评论
  
# re: roller扩展开发经验小结之xmlrpc 2008-07-17 16:47 | Jack.Wang
基于 http 协议,用 xml format 数据,大数据量下性能是个问题,之前遇到这个问题,我们是把 xml 压缩了,性能提升了不少!
去掉 http 这层外壳,那就好了,但通用性又成了问题!
不过 xml-rpc 是蛮强大,改天也用用!
LZ 多发些这样的文章!  回复  更多评论
  
# re: roller扩展开发经验小结之xmlrpc 2008-07-19 15:55 | xml-rpc
写了半天怎么不见服务器端代码  回复  更多评论
  
# re: roller扩展开发经验小结之xmlrpc 2008-07-21 14:46 | rocket
@xml-rpc
# re: roller扩展开发经验小结之xmlrpc 2008-07-19 15:55 | xml-rpc

写了半天怎么不见服务器端代码


不知道是我表达能力的问题,还是你就是匆匆路过。  回复  更多评论
  
# re: roller扩展开发经验小结之xmlrpc 2008-11-03 18:05 | yz
httpclient + xml 同样能达到同样的效果  回复  更多评论
  
# re: roller扩展开发经验小结之xmlrpc 2009-09-11 13:40 |
小弟也参考roller 在自己写的blog程序中实现了xml-rpc,但是用Google docs 和 Windows live writer发表文章中文都是乱码 客户端服务器都是用的UTF-8,请给支个招谢谢啦  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: