| weiqiuhong's profile我的地盤PhotosBlogLists | Help |
|
June 28 xmlrpcRPC是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 又要离职吗? 一个月前,我很轻松的对经理说要离职的事情。。。这个月我还是尽自己的努力在做事情,我一直在想也许能力是一回事,但是责任更重要吧。。。今天老总问我时,我确给自己要了一个想一下的机会。。。我去征求所有人的意见,男友的,朋友的,。。。甚至网友的。。。他们所有的人都不愿意我离开深圳,而我自己却在犹豫,犹豫我当初的那句轻易抛出去的话,我觉得如果我要留下,出尔反尔的。。。我不喜欢这样的自己。。。。就让我死守我曾经说出去的话吧。。
关于回家 好长时间没写网志了,一是太懒了,二是时间过的太快,三是现在表达能力太差了。就像黑土说白云一样,七天憋出六个字来。总之,是代码没写好,中文表达能力散失滴的也差不多了。。
深圳造就了很多独立、坚强的人们,很不巧,我觉得我不是。。我自己能感觉到自己变虚荣了,麻木了,贪财了,甚至同情这个字也在渐渐离我远去。。但是我还是觉得深圳很好,给很多人提供了机会。连要饭的也多些。。。我现在有些迷茫,不知道我要不要回西安? |
|
|