weiqiuhong's profile我的地盤PhotosBlogLists Tools Help

Blog


    June 28

    xmlrpc

    RPC是Remote Procedure Call的缩写,中文意思就是远程过程调用,就是本地的机器上调用远端机器上的一个过程(方法),这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。按照“数据即程序”的观点来看,RPC无非是借助一些通信手段来互相传递数据(信息),所也她也是“高”层次的通信手段,无非是这种通信手段看起来更像是“过程的调用”,因为她往往以一个“函数”的面目示人,从而掩盖了她交换信息的实质。
    XMLRPC,就是应用了XML技术的RPC。那么什么是XML了?
    XML和RPC一样也是一个东西的缩写,这个东西就是eXtensible Markup Language,中文意思就是可扩展标记语言,标记语言就是那种用尖括号(<>)括来括去语言,比如说HTML。XML的可扩展性也体现在它只定义了语言的格式,而并没有定义过多的关键字,也就是通常所说的标记(Tag),所以用户可以自由地选择定义标记。它的这种自由和简单的语法规则也使得它广为流传,被用来表示各种数据。XML在XMLRPC充当什么角色呢?答案就是“交换的数据格式”。在XMLRPC中数据将是XML格式的。
     
    哈哈,以上说的好专业,声名下,是我从别的地方COPY来的。。不过下面的例子嘛,确是我自己辛勤学习的成果啦。。从这个网站上学来的滴:http://ws.apache.org/xmlrpc/client.html
    1。先写个客户端和服务器通讯的类
      package org.apache.xmlrpc.demo;
     
        public class Calculator {
                    public int add(int i1, int i2) {
                            return i1 + i2;
                    }
                    public int subtract(int i1, int i2) {
                            return i1 - i2;
                    }
        }
    2。建立server程式。提供两个server端:
    第一种:
    package org.apache.xmlrpc.demo.webserver;
      import java.net.InetAddress;
      import org.apache.xmlrpc.common.TypeConverterFactoryImpl;
      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();
              MyServlet myservlet=new MyServlet();
              myservlet.newXmlRpcHandlerMapping() ;
              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);
               */
                       phm.addHandler("Calculator",
                                   org.apache.xmlrpc.demo.Calculator.class);//用这种方式加载通讯
                       
                       
              xmlRpcServer.setHandlerMapping(phm);
           
              XmlRpcServerConfigImpl serverConfig =
                  (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
              serverConfig.setEnabledForExtensions(true);
              serverConfig.setContentLengthOptional(false);
              webServer.start();
          }
      }
     
    第二种:
    a.必须建立一个properties的文件,名字必须为XmlRpcServlet.properties,必须放在org.apache.xmlrpc.webserver的包下面。
    内容如下:Calculator=org.apache.xmlrpc.demo.Calculator
    b.可以加验证:
    package org.apache.xmlrpc.demo.webserver;
    import org.apache.xmlrpc.XmlRpcException;
    import org.apache.xmlrpc.XmlRpcRequest;
    import org.apache.xmlrpc.common.XmlRpcHttpRequestConfig;
    import org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping;
    import org.apache.xmlrpc.server.PropertyHandlerMapping;
    import org.apache.xmlrpc.server.XmlRpcHandlerMapping;
    import org.apache.xmlrpc.webserver.XmlRpcServlet;
     
    public class MyServlet extends XmlRpcServlet {
              private boolean isAuthenticated(String pUserName, String pPassword) {
                  return "username".equals(pUserName) && "password".equals(pPassword);
              }
              protected XmlRpcHandlerMapping newXmlRpcHandlerMapping() throws XmlRpcException {
                  PropertyHandlerMapping mapping
                      = (PropertyHandlerMapping) super.newXmlRpcHandlerMapping();
                  AbstractReflectiveHandlerMapping.AuthenticationHandler handler =
                      new AbstractReflectiveHandlerMapping.AuthenticationHandler(){
                              public boolean isAuthorized(XmlRpcRequest pRequest){
                                  XmlRpcHttpRequestConfig config =
                                      (XmlRpcHttpRequestConfig) pRequest.getConfig();
                                  return isAuthenticated(config.getBasicUserName(),
                                      config.getBasicPassword());
                              };
                      };
                  mapping.setAuthenticationHandler(handler);
                  return mapping;
              }
      }
    c.servletServer
     package org.apache.xmlrpc.demo.webserver;
      import org.apache.xmlrpc.webserver.ServletWebServer;
     import org.apache.xmlrpc.webserver.XmlRpcServlet;
      public class ServletServer {
          private static final int port = 8080;
          public static void main(String[] args) throws Exception {
              ClassLoader cl = Thread.currentThread().getContextClassLoader();
              //XmlRpcServlet servlet = new XmlRpcServlet();
              MyServlet servlet=new MyServlet();
              ServletWebServer webServer = new ServletWebServer(servlet, port);
              webServer.start();
          }
      }
    说明:第二种server在加载时是通过读properties文件,来得到通讯的,所以那个文件很重要哟!
    3.Client端,对应server提供两个类:
    package org.apache.xmlrpc.demo.client;
      import java.net.URL;
    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/xmlrpc"));
              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(3), new Integer(2) };
              Integer result = (Integer) client.execute("Calculator.add", params);
              Integer ss=(Integer) client.execute("Calculator.subtract", params);
              System.out.println("3 + 2 = " + result);
              System.out.println("3 - 2 = " + ss);
          }
      }
     
    package org.apache.xmlrpc.demo.client;
      import java.net.URL;
    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 Client1 {
          public static void main(String[] args) throws Exception {
              // create configuration
              XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
              config.setServerURL(new URL("http://127.0.0.1:8080/xmlrpc"));
              config.setEnabledForExtensions(true); 
              config.setConnectionTimeout(60 * 1000);
              config.setReplyTimeout(60 * 1000);
              config.setBasicUserName("username");
              config.setBasicPassword("password");
              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(3), new Integer(2) };
              Integer result = (Integer) client.execute("Calculator.add", params);
              Integer ss=(Integer) client.execute("Calculator.subtract", params);
              System.out.println("3 + 2 = " + result);
              System.out.println("3 - 2 = " + ss);
          }
      }
    4。OK了,其实也可以用tomcat做server,不过这种方法,饿没研究,,有时间可以研究下。。。
     
     
     
     
     

    RSS(2)

      RssOutput就是输出一个xml文件,唯一的要求就是此xml文件要能append...用dom4j的包就OK了。。我在网上有找到一个例子,不错,我采用拿来主义,稍微修改了下,现在成我的了。。呵呵。。
    import java.io.File;
    import java.io.FileWriter;
    import java.util.List;
    import org.dom4j.Attribute;
    import org.dom4j.Document;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    public class EncodingModel {
      
       
        public static void main(String[] args) {
          File file=new File("D:/runtime-talend.product/out1.xml");
          int i=createXMLFile(file.toString());
         
          int j=formatXMLFile(file.toString());
          }
        public static int createXMLFile(String filename){
            /** 返回操作结果, 0表失败, 1表成功 */
            int returnValue = 0;
            Document document = DocumentHelper.createDocument();
            Element booksElement = document.addElement("books");
            Element bookElement = booksElement.addElement("book");
            Element titleElement = bookElement.addElement("title");
            titleElement.setText("标题");
            bookElement = booksElement.addElement("book");
            bookElement.addAttribute("show","yes");
            titleElement = bookElement.addElement("title");
            titleElement.setText("书屋");
            bookElement = booksElement.addElement("book");
            bookElement.addAttribute("show","no");
            titleElement = bookElement.addElement("title");
            titleElement.setText("作者");
            Element authorElement=bookElement.addElement("author");
            authorElement.setText("sugelade");
           
            try{
                OutputFormat format = OutputFormat.createPrettyPrint();
                format.setEncoding("GB2312");//有中文的时,必须得设成GB2312,原因不知,呵!
                //format.setEncoding("utf-8");
                XMLWriter writer= new XMLWriter(new FileWriter(new File(filename)),format);
                writer.write(document);
                writer.close();
                returnValue = 1;
            }catch(Exception ex){
                ex.printStackTrace();
            }
            return returnValue;
         }
        public static int formatXMLFile(String filename){
            int returnValue = 0;
            try{
                SAXReader saxReader = new SAXReader();
                Document document = saxReader.read(new File(filename));
                List list = document.selectNodes("/books" );
                Element booksElement =(Element) list.get(0);
                Element nameElement=booksElement.addElement("name");
                nameElement.setText("魏秋红");//呵,不错,名字终于变成铅字了,挺光荣滴!
                Element sexElement=booksElement.addElement("sex");
                sexElement.setText("女");
                Element moneyElement=booksElement.addElement("money");
                moneyElement.setText("没有");
                Element descElement=booksElement.addElement("description");
                descElement.setText("djfewwfeteauture.jioer");
                XMLWriter writer = null;
                OutputFormat format = OutputFormat.createPrettyPrint();
               format.setEncoding("GB2312");
     //           format.setEncoding("utf-8");
                writer= new XMLWriter(new FileWriter(new File(filename)),format);
                writer.write(document);
                writer.close();    
                returnValue = 1;   
            }catch(Exception ex){
                ex.printStackTrace();
            }
            return returnValue;
         }
    }
    若想追加原文件,用List list = document.selectNodes("/books" ); Element booksElement =(Element) list.get(0);。。。
    这些只是我做RssOutput时的测试类。。。真正的RssOutput代码如下了,呵,看起来会比较吃力的,因为JET自动生成的了。。。
    //标头部分。。
    java.io.File filetRSSOutput_1 = new java.io.File(/**
                     * Start field
                     * tRSSOutput_1:FILENAME
                     */
       "D:/runtime-talend.product/out.xml"/**
                 * End field
                 * tRSSOutput_1:FILENAME
                 */
       );
       org.dom4j.Document documenttRSSOutput_1 = null;
       org.dom4j.Element channelElementtRSSOutput_1 = null;
       org.dom4j.Element titleHElementtRSSOutput_1 = null;
       org.dom4j.Element descriptionHElementtRSSOutput_1 = null;
       org.dom4j.Element pubdateHElementtRSSOutput_1 = null;
       org.dom4j.Element linkHElementtRSSOutput_1 = null;
       if (true && filetRSSOutput_1.exists()) { //append为true时
        org.dom4j.io.SAXReader saxReadertRSSOutput_1 = new org.dom4j.io.SAXReader();
        documenttRSSOutput_1 = saxReadertRSSOutput_1
          .read(new java.io.File(/**
                 * Start field
                 * tRSSOutput_1:FILENAME
                 */
          "D:/runtime-talend.product/out.xml"/**
                    * End field
                    * tRSSOutput_1:FILENAME
                    */
          ));
       } else {
        documenttRSSOutput_1 = org.dom4j.DocumentHelper
          .createDocument();
        org.dom4j.Element rssElementtRSSOutput_1 = documenttRSSOutput_1
          .addElement("rss");
        rssElementtRSSOutput_1.addAttribute("version", "2.0");
        channelElementtRSSOutput_1 = rssElementtRSSOutput_1
          .addElement("channel");
        titleHElementtRSSOutput_1 = channelElementtRSSOutput_1
          .addElement("title");
        titleHElementtRSSOutput_1.setText("aaa");
        descriptionHElementtRSSOutput_1 = channelElementtRSSOutput_1
          .addElement("description");
        descriptionHElementtRSSOutput_1.setText("bb");
        pubdateHElementtRSSOutput_1 = channelElementtRSSOutput_1
          .addElement("pubdate");
        pubdateHElementtRSSOutput_1
          .setText("Sat, 07 Sep 2002 00:00:01 GMT");
        linkHElementtRSSOutput_1 = channelElementtRSSOutput_1
          .addElement("link");
        linkHElementtRSSOutput_1.setText("http://www.baidu.com");
       }
    //主体部分
    if (true && filetRSSOutput_1.exists()) {
         java.util.List listtRSSOutput_1 = documenttRSSOutput_1
           .selectNodes("/rss/channel");
         channelElementtRSSOutput_1 = (org.dom4j.Element) listtRSSOutput_1
           .get(0);
         listtRSSOutput_1 = documenttRSSOutput_1
           .selectNodes("/rss/channel/title");
         titleHElementtRSSOutput_1 = (org.dom4j.Element) listtRSSOutput_1
           .get(0);
         titleHElementtRSSOutput_1.setText("aaa");
         listtRSSOutput_1 = documenttRSSOutput_1
           .selectNodes("/rss/channel/description");
         descriptionHElementtRSSOutput_1 = (org.dom4j.Element) listtRSSOutput_1
           .get(0);
         descriptionHElementtRSSOutput_1.setText("bb");
         listtRSSOutput_1 = documenttRSSOutput_1
           .selectNodes("/rss/channel/pubdate");
         pubdateHElementtRSSOutput_1 = (org.dom4j.Element) listtRSSOutput_1
           .get(0);
         pubdateHElementtRSSOutput_1
           .setText("Sat, 07 Sep 2002 00:00:01 GMT");
         listtRSSOutput_1 = documenttRSSOutput_1
           .selectNodes("/rss/channel/link");
         linkHElementtRSSOutput_1 = (org.dom4j.Element) listtRSSOutput_1
           .get(0);
         linkHElementtRSSOutput_1.setText("http://www.baidu.com");
        }
        org.dom4j.Element itemElement = channelElementtRSSOutput_1
          .addElement("item");
        org.dom4j.Element titleElement = itemElement
          .addElement("title");
        titleElement.setText(row1.TITLE == null ? "" : String
          .valueOf(row1.TITLE));
        org.dom4j.Element descriptionElement = itemElement
          .addElement("description");
        descriptionElement.setText(row1.DESCRIPTION == null ? ""
          : row1.DESCRIPTION);
        org.dom4j.Element pubdateElement = itemElement
          .addElement("pubdate");
        java.text.SimpleDateFormat sdfTemptRSSOutput_1 = new java.text.SimpleDateFormat(
          "EEE, d MMM yyyy HH:mm:ss z", java.util.Locale.US);
        java.util.SimpleTimeZone aZonetRSSOutput_1 = new java.util.SimpleTimeZone(
          8, "GMT");
        sdfTemptRSSOutput_1.setTimeZone(aZonetRSSOutput_1);
        pubdateElement.setText(row1.PUBDATE == null ? ""
          : sdfTemptRSSOutput_1.format(row1.PUBDATE));
        org.dom4j.Element linkElement = itemElement.addElement("link");
        linkElement.setText(row1.LINK == null ? "" : row1.LINK);
    呵呵。。知道你看不懂,我自己明白就好,提供个比较重要的地址:http://cyber.law.harvard.edu/rss/rss.html..
    特别需要提示的是发布Rss的日期格式...RSS 要求日期必须按照 RFC822 日期和时间规范 进行格式化,此格式要求:开头是一个可选的3字母星期缩写加一个逗号,接着必须是日加上3字母缩写的月份和年份,最后是一个带时区名的时间。OVER!

    RSS(1)

    这是我的第一份关于技术的文章。。。。
    前段时间应客户要求,要做两个关于RSS的组件,
    第一个RSSINPUT:Goal of this new component is to read an RSS flow(use RSS tag : title, description, pubDate, and link).
    Parameters : rss url,option : read articles from date ,option limit (read max Y articles, choosed by user)。。
    起先我引入的包是 rsslib4j-0.2.jar(http://www.open-open.com/48.htm),先将代码COPY出来:
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.LinkedList;
    import org.gnu.stealthp.rsslib.RSSChannel;
    import org.gnu.stealthp.rsslib.RSSException;
    import org.gnu.stealthp.rsslib.RSSHandler;
    import org.gnu.stealthp.rsslib.RSSItem;
    import org.gnu.stealthp.rsslib.RSSParser;
     
    public class RssExample {
      
      public static void main(String[] args) {
          Date   d=new   Date(); 
          String rssurl="http://rss.sina.com.cn/sports/global/italy.xml";
          URL url = null;
        try {
            url = new URL(rssurl);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          RSSHandler hand = new RSSHandler();
          try {
            RSSParser.parseXmlFile(url, hand, false);
        } catch (RSSException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          RSSChannel ch = hand.getRSSChannel();
          LinkedList lst = hand.getRSSChannel().getItems();
          String row[]=new String [4];
          for (int i = 0; i < lst.size(); i++) {
              RSSItem itm = (RSSItem) lst.get(i);
             
              itm.getTitle();
              itm.getDescription();
              String str=itm.getPubDate();
             
              itm.getLink();
              System.out.println(itm.toString());
             
              Date   dat=new   Date(str);
              int j=dat.compareTo(d);
           
         }
      }
    }
    这个任务很快就 resolved了,但是过了大概半个月左右,又被打回来,原因是license的问题,此包的license是GPL,
    但是本公司产品的license用的是LGPL,个中原因,我一时半会无法说清,提供个网站,一目了然。。。
    http://hi.baidu.com/%CD%F5%BE%FC/blog/item/922a6059345ad12a2834f013.html
    只好找一个license为LGPL的包来代替啦。。。还好有找到了feed4j.jar...
    import it.sauronsoftware.feed4j.FeedParser;
    import it.sauronsoftware.feed4j.bean.Feed;
    import it.sauronsoftware.feed4j.bean.FeedHeader;
    import it.sauronsoftware.feed4j.bean.FeedItem;
    import java.net.URL;
    public class FeedExample {
     public static void main(String[] args) throws Exception {
            URL url = new URL("http://rss.sina.com.cn/sports/global/italy.xml");
      Feed feed = FeedParser.parse(url);
     
      System.out.println("** HEADER **");
      FeedHeader header = feed.getHeader();
      System.out.println("Title: " + header.getTitle());
      System.out.println("Link: " + header.getLink());
      System.out.println("Description: " + header.getDescription());
      System.out.println("Language: " + header.getLanguage());
      System.out.println("PubDate: " + header.getPubDate());
      System.out.println("** ITEMS **");
      int items = feed.getItemCount();
      for (int i = 0; i < items; i++) {
       FeedItem item = feed.getItem(i);
       System.out.println("Title: " + item.getTitle());
       System.out.println("Link: " + item.getLink());
       System.out.println("Plain text description: "
         + item.getDescriptionAsText());
       System.out.println("HTML description: "
         + item.getDescriptionAsHTML());
       System.out.println("PubDate: " + item.getPubDate());
      }
     }
    }
    引入feed4j.jar(http://www.sauronsoftware.it/projects/feed4j/)时,记得同时要引入dom4j-1.6.1.jar,
    nekohtml.jar,xercesImpl.jar,xml-apis.jar..
    RssInput就OK了。。下一篇说下RssOutPut...其实很多高深的原理。。我并不明白,管它呢。。会用的API就行了。。
    想的太多,,容易老哟。。。
     
    June 26

    又要离职吗?

        一个月前,我很轻松的对经理说要离职的事情。。。这个月我还是尽自己的努力在做事情,我一直在想也许能力是一回事,但是责任更重要吧。。。今天老总问我时,我确给自己要了一个想一下的机会。。。我去征求所有人的意见,男友的,朋友的,。。。甚至网友的。。。他们所有的人都不愿意我离开深圳,而我自己却在犹豫,犹豫我当初的那句轻易抛出去的话,我觉得如果我要留下,出尔反尔的。。。我不喜欢这样的自己。。。。就让我死守我曾经说出去的话吧。。
     

    关于回家

       好长时间没写网志了,一是太懒了,二是时间过的太快,三是现在表达能力太差了。就像黑土说白云一样,七天憋出六个字来。总之,是代码没写好,中文表达能力散失滴的也差不多了。。
        深圳造就了很多独立、坚强的人们,很不巧,我觉得我不是。。我自己能感觉到自己变虚荣了,麻木了,贪财了,甚至同情这个字也在渐渐离我远去。。但是我还是觉得深圳很好,给很多人提供了机会。连要饭的也多些。。。我现在有些迷茫,不知道我要不要回西安?
    June 11

    !#%%R&

      最近学了些新东西,我决定以后也将所学的东西写在blog上,加油加油。。。。