<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-55  評(píng)論-208  文章-0  trackbacks-0

    去年10月為了滿足一個(gè)客戶的需求,讓我開(kāi)發(fā)一個(gè)教學(xué)博客系統(tǒng)出來(lái),當(dāng)時(shí)考慮節(jié)約成本就使用了一個(gè)比較優(yōu)秀的開(kāi)源博客平臺(tái)來(lái)做二次開(kāi)發(fā)。這個(gè)開(kāi)源平臺(tái)就是roller,是apache的一個(gè)項(xiàng)目,能收錄在apache下面說(shuō)明還是有兩把刷子的,matrix的部落隔就是直接使用的roller,而且看到確切消息說(shuō)網(wǎng)易的博客平臺(tái)也是基于roller進(jìn)行開(kāi)發(fā)的。
    roller地址:http://roller.apache.org/
    現(xiàn)在教學(xué)博客平臺(tái)已近開(kāi)發(fā)完成投入使用了,而在這個(gè)過(guò)程中發(fā)現(xiàn)了roller確實(shí)有很多地方值得一個(gè)jee開(kāi)發(fā)人員借鑒的地方,所以今天開(kāi)始打算把學(xué)到的這些經(jīng)驗(yàn)進(jìn)行一下總結(jié)了。好久沒(méi)寫(xiě)blog了,前段時(shí)間確實(shí)太忙了,事情太多了。現(xiàn)在打算每天擠點(diǎn)時(shí)間把這些經(jīng)驗(yàn)都記錄下來(lái),不然我怕日子久了我都忘記了。
    首先先講的是xmlrpc,rpc的全稱是Remote Procedure Call,實(shí)際上就是為了讓客戶端可以輕松的對(duì)服務(wù)端的一些方法啊,過(guò)程進(jìn)行調(diào)用。xmlrpc其實(shí)是一個(gè)使用xml來(lái)實(shí)現(xiàn)rpc的規(guī)范,使用的傳輸協(xié)議還是我們最熟悉的http,不同的是傳輸?shù)母袷绞鞘褂脁ml的格式來(lái)封裝數(shù)據(jù)的,而不是使用html了。基于這個(gè)規(guī)范呢其實(shí)是有多種實(shí)現(xiàn)的,由php的,有Python的。在這里我要介紹的是roller中所使用的一個(gè)實(shí)現(xiàn),依然是apache下的一個(gè)項(xiàng)目Apache XML-RPC:http://ws.apache.org/xmlrpc/。
    在roller中使用的是xmlrpc的服務(wù)段,所以下面我先介紹服務(wù)端和客戶端的設(shè)置以及調(diào)用方法
    1、當(dāng)然是把Apache XML-RPC的包引入到服務(wù)端和客戶段
    客戶端引入:xmlrpc-common.jar  xmlrpc-client.jar
    服務(wù)端引入:xmlrpc-common.jar  xmlrpc-server.jar

    2、使用java的實(shí)現(xiàn)當(dāng)然要有一個(gè)servlet了,
    先介紹客戶端:遵循h(huán)ttp協(xié)議,客戶端針對(duì)一個(gè)url發(fā)送請(qǐng)求
    下面是相關(guān)代碼
    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);

       }
    }

    再介紹服務(wù)端:服務(wù)端自然要有一個(gè)servlet來(lái)接受這個(gè)請(qǐng)求了
    在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>
    這里的配置我使用的是默認(rèn)的servlet,當(dāng)然你也可以使用自己定義的servlet了,我的需求比較簡(jiǎn)單,所以就沒(méi)有再另外定義servlet


    3、下面就是客戶端根據(jù)需求發(fā)送自己特定的rpc請(qǐng)求了,比如我需要獲取服務(wù)端所有的blogList
    客戶端的調(diào)用代碼如下:
            try {
              Object[] result = (Object[]) client.execute("blogger.getAllblogList",
                    params);
            } catch (Exception e) {
                e.printStackTrace();
            }
    那么服務(wù)段又是如何處理這個(gè)請(qǐng)求的呢?上面那個(gè)servlet會(huì)把請(qǐng)求根據(jù)不同rpc請(qǐng)求轉(zhuǎn)發(fā)給不同的處理器,不過(guò)由于servlet我使用的是默認(rèn)的,所以分發(fā)這個(gè)動(dòng)作是使用配置properties文件來(lái)實(shí)現(xiàn)的,這里有個(gè)不好的地方要說(shuō)明的是配置文件必須在項(xiàng)目的/org/apache/xmlrpc/webserver/XmlRpcServlet.properties路徑下,這個(gè)是Apache XML-RPC做得不好的一個(gè)地方。配置文件內(nèi)容如下
    blogger=org.apache.roller.webservices.xmlrpc.BloggerAPIHandler
    metaWeblog=org.apache.roller.webservices.xmlrpc.MetaWeblogAPIHandler
    當(dāng)服務(wù)端接受到上面客戶端的請(qǐng)求之后,就會(huì)根據(jù)blogger到BloggerAPIHandler去調(diào)用getAllblogList這個(gè)方法。

    4 最后一步就是給客戶端回傳數(shù)據(jù)了
    這里需要注意的是服務(wù)端一般使用的是Hashtable來(lái)對(duì)多個(gè)數(shù)據(jù)進(jìn)行封裝,比如:
         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;
    但是客戶端在解析的時(shí)候取出來(lái)的也是一個(gè)Hashtable,然后從中取出自己需要的數(shù)據(jù)了。
           HashMap table = (HashMap) obj;
           this.nickname = table.get("nickname").toString();
           this.userid = table.get("userid").toString();
    當(dāng)然,最好是做一個(gè)專門(mén)的解析類來(lái)對(duì)數(shù)據(jù)進(jìn)行解析了。
    這里需要補(bǔ)充說(shuō)明的是,Apache XML-RPC傳輸?shù)臄?shù)據(jù)類型是一些預(yù)先定義好的數(shù)據(jù)類型,但是同時(shí)它也支持用戶自定義的數(shù)據(jù)類型,
    具體可以參見(jiàn):http://ws.apache.org/xmlrpc/advanced.html

    posted on 2008-07-17 07:23 rocket 閱讀(2223) 評(píng)論(8)  編輯  收藏 所屬分類: 經(jīng)驗(yàn)積累常用框架

    評(píng)論:
    # re: roller擴(kuò)展開(kāi)發(fā)經(jīng)驗(yàn)小結(jié)之xmlrpc 2008-07-17 09:27 | andy 林
    我問(wèn)個(gè)簡(jiǎn)單的問(wèn)題阿
    config.setServerURL(new URL("http://127.0.0.1:8088/xmlrpc"));
    <url-pattern>/roller-services/xmlrpc</url-pattern>
    怎么覺(jué)得路徑不是很一樣,難道我的理解有問(wèn)題?
    謝謝  回復(fù)  更多評(píng)論
      
    # re: roller擴(kuò)展開(kāi)發(fā)經(jīng)驗(yàn)小結(jié)之xmlrpc[未登錄](méi) 2008-07-17 09:43 | paul
    來(lái)的很及時(shí)啊。我正想做一個(gè)blog,但看看open-open上沒(méi)有合適的,可以去看看這個(gè)啦  回復(fù)  更多評(píng)論
      
    # re: roller擴(kuò)展開(kāi)發(fā)經(jīng)驗(yàn)小結(jié)之xmlrpc 2008-07-17 09:43 | rocket
    @andy 林
    sorry,你看得比較仔細(xì),這里是我當(dāng)時(shí)copy的兩段不同的代碼,所以出問(wèn)題了,呵呵,馬上改  回復(fù)  更多評(píng)論
      
    # re: roller擴(kuò)展開(kāi)發(fā)經(jīng)驗(yàn)小結(jié)之xmlrpc 2008-07-17 16:47 | Jack.Wang
    基于 http 協(xié)議,用 xml format 數(shù)據(jù),大數(shù)據(jù)量下性能是個(gè)問(wèn)題,之前遇到這個(gè)問(wèn)題,我們是把 xml 壓縮了,性能提升了不少!
    去掉 http 這層外殼,那就好了,但通用性又成了問(wèn)題!
    不過(guò) xml-rpc 是蠻強(qiáng)大,改天也用用!
    LZ 多發(fā)些這樣的文章!  回復(fù)  更多評(píng)論
      
    # re: roller擴(kuò)展開(kāi)發(fā)經(jīng)驗(yàn)小結(jié)之xmlrpc 2008-07-19 15:55 | xml-rpc
    寫(xiě)了半天怎么不見(jiàn)服務(wù)器端代碼  回復(fù)  更多評(píng)論
      
    # re: roller擴(kuò)展開(kāi)發(fā)經(jīng)驗(yàn)小結(jié)之xmlrpc 2008-07-21 14:46 | rocket
    @xml-rpc
    # re: roller擴(kuò)展開(kāi)發(fā)經(jīng)驗(yàn)小結(jié)之xmlrpc 2008-07-19 15:55 | xml-rpc

    寫(xiě)了半天怎么不見(jiàn)服務(wù)器端代碼


    不知道是我表達(dá)能力的問(wèn)題,還是你就是匆匆路過(guò)。  回復(fù)  更多評(píng)論
      
    # re: roller擴(kuò)展開(kāi)發(fā)經(jīng)驗(yàn)小結(jié)之xmlrpc 2008-11-03 18:05 | yz
    httpclient + xml 同樣能達(dá)到同樣的效果  回復(fù)  更多評(píng)論
      
    # re: roller擴(kuò)展開(kāi)發(fā)經(jīng)驗(yàn)小結(jié)之xmlrpc 2009-09-11 13:40 |
    小弟也參考roller 在自己寫(xiě)的blog程序中實(shí)現(xiàn)了xml-rpc,但是用Google docs 和 Windows live writer發(fā)表文章中文都是亂碼 客戶端服務(wù)器都是用的UTF-8,請(qǐng)給支個(gè)招謝謝啦  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚在线观看免费视频入口| 夜色阁亚洲一区二区三区| 久久九九免费高清视频 | 一个人免费播放在线视频看片| 亚洲国产韩国一区二区| 亚洲欧洲日产国码av系列天堂| 日本视频免费在线| 99精品国产免费久久久久久下载 | 少妇亚洲免费精品| 最近中文字幕免费mv视频8| 99国产精品视频免费观看| 中文字幕手机在线免费看电影| 色婷婷精品免费视频| 国产精品亚洲专区一区| 亚洲AV无码之国产精品| 亚洲一级免费毛片| 亚洲毛片一级带毛片基地| 久久久亚洲欧洲日产国码二区| 亚洲精品卡2卡3卡4卡5卡区| 国产亚洲精品免费视频播放| 亚洲?V无码乱码国产精品| 免费国产高清视频| 免费人妻无码不卡中文字幕18禁| 超pen个人视频国产免费观看| 一个人免费观看www视频在线 | 亚洲色最新高清av网站| 亚洲校园春色另类激情| 国产精品亚洲综合五月天| 亚洲精品在线网站| 亚洲一区二区三区精品视频| 亚洲大片免费观看| 激情内射亚洲一区二区三区爱妻| 亚洲欧洲春色校园另类小说| 亚洲欧洲日韩国产| 亚洲av专区无码观看精品天堂| 亚洲一欧洲中文字幕在线| 亚洲午夜精品在线| 亚洲日韩一区二区三区| 亚洲JLZZJLZZ少妇| 污网站免费在线观看| 国产成人自产拍免费视频|