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

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

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

    隨筆-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 閱讀(2223) 評論(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,請給支個招謝謝啦  回復  更多評論
      
    主站蜘蛛池模板: 亚洲精品天堂在线观看| 99精品免费观看| 亚洲综合在线一区二区三区 | 亚洲国产高清视频| 四虎成人免费大片在线| 18禁美女裸体免费网站| 91视频免费网站| 免费中文字幕视频| 亚洲经典千人经典日产| 亚洲AV无码精品蜜桃| 亚洲黄色在线网站| 国产V亚洲V天堂A无码| 久久久久亚洲?V成人无码| 国产成人免费福利网站| 最新仑乱免费视频| 国产va精品免费观看| 狼群影院在线观看免费观看直播 | 精品亚洲视频在线观看| 免费观看日本污污ww网站一区| 岛国av无码免费无禁网站| 99久久99这里只有免费费精品| 久久精品国产这里是免费| a级毛片在线视频免费观看| 四虎永久在线精品免费一区二区 | 一区二区三区亚洲视频| 可以免费观看一级毛片黄a| 成人免费无码精品国产电影| 好男人视频社区精品免费| 成人人免费夜夜视频观看| 成人免费无码大片a毛片| 最近中文字幕mv手机免费高清 | 久久精品国产99国产精品亚洲| 亚洲婷婷综合色高清在线| 亚洲成av人片在线看片| 亚洲日本乱码一区二区在线二产线| 久久久久亚洲Av无码专| 亚洲高清无在码在线电影不卡| 亚洲黄网在线观看| 亚洲一区二区三区在线网站| 亚洲欧美日韩综合久久久| 国产亚洲人成在线播放|