一: rss介绍
根据维基百科(http://zh.wikipedia.org/wiki/rss)的定义,“rss是一种用于共享新闻和其他web内容的数据交换规范 ”,它是一系列的规范的组合,采用xml格式。目前国内rss应用最多的是在新闻网站和博客网站上。
许多网站可以用rss阅读器来个性化自己的网页,比如显示最新的新浪新闻,显示自己好朋友最新的博客文章,显示最新的google论坛内容。除此之外,利用rss阅读器还可以实现其它用途,比如:
获得天气预报
接收邮件,比如gmail就提供rss feed
获取最新股票行情
获取音乐,电台节目和视频剪辑等等
二:rome介绍
这篇文章采用rome这个开源工具来实现rss阅读器。rome支持的格式很多,有rss 0.90, rss 0.91 netscape, rss 0.91 userland, rss 0.92, rss 0.93, rss 0.94, rss 1.0, rss 2.0, atom 0.3, atom 1.0 等等,几乎囊括了目前所有的rss 和atom版本。最新的rome版本可以从http://wiki.java.net/bin/view/javawsxml/rome上得到。
实现rss阅读器,主要采用rome的解析功能,就是从xml文件中读出相应的内容。我用一些简单代码来说明如何使用rome中的类和方法。
url feedurl = new url("http://rss.sina.com.cn/news/marquee/ddt.xml");
syndfeedinput input = new syndfeedinput();
syndfeed feed = input.build(new xmlreader(feedurl));
表一: 得到rss feed
“http://rss.sina.com.cn/news/marquee/ddt.xml“是新浪新闻的一个rss 地址。通过三行代码,就可以得到一个对应这个地址的rss feed对象。这个对象包含我们所需要的所有rss内容。如果用system.out.println(feed),会得到表二中的结果。从中可以清楚地看到 syndfeed类的结构。
syndfeedimpl.contributors=null
syndfeedimpl.title=新闻中心-新闻要闻
syndfeedimpl.categories[0].name=
syndfeedimpl.categories[0].taxonomyuri=null
syndfeedimpl.link=http://news.sina.com.cn/iframe/o/allnews/input/index.htm
syndfeedimpl.publisheddate=thu jun 22 13:20:01 cst 2006
syndfeedimpl.entries[0].updateddate=null
syndfeedimpl.entries[0].contributors=null
syndfeedimpl.entries[0].title=扎瓦赫里在录像带中呼吁阿富汗人抵抗外国侵略
syndfeedimpl.entries[0].categories[0].name=
syndfeedimpl.entries[0].categories[0].taxonomyuri=null
syndfeedimpl.entries[0].link=http://news.sina.com.cn/w/2006-06-22/11569270955s.shtml
syndfeedimpl.entries[0].publisheddate=thu jun 22 11:56:00 cst 2006
syndfeedimpl.entries[0].authors=null
syndfeedimpl.entries[0].modules[0].descriptions=[]
syndfeedimpl.entries[0].modules[0].creators[0]=www.sina.com.cn
syndfeedimpl.entries[0].modules[0].contributors=[]
......
syndfeedimpl.author=null
syndfeedimpl.copyright=copyright 1996 - 2005 sina inc. all rights reserved
表二: syndfeed数据结构
从上述输出结果可以看出,每个新闻条目是由entry代表的。下列代码从feed中得到entry
list list = feed.getentries();
for (int i=0; i< list.size(); i++) {
syndentry entry = (syndentry)list.get(i);
}
表三:从syndfeed中得到syndentry
如果程序位于防火墙后面,就需要在程序中加上一些proxy设置。例如采用下面的http proxy:
properties systemsettings = system.getproperties();
systemsettings.put("http.proxyhost", "myproxyserver.com");
systemsettings.put("http.proxyport", "80");
system.setproperties(systemsettings);
表四:proxy设置
有时候,可能会遇到“java.io.ioexception: server returned http response code: 403 for url”的错误信息。通常是因为服务器的安全设置不接受java程序作为客户端访问,解决方案是设置客户端的user agent, 示例代码如下:
urlconnection feedurl = new jurl(urlstr).openconnection();
feedurl.setrequestproperty("user-agent", "mozilla/4.0 (compatible; msie 5.0; windows nt; digext)");
syndfeedinput input = new syndfeedinput();
syndfeed feed = input.build(new xmlreader(feedurl));
表五:设置user-agent
rome 提供的功能很多,除了可以解析feed 外,还可以生成feed。用rome来为自己的网站内容创建rss feed,这样别人就可以通过rss 阅读器来随时了解你网站内容的更新了。
使用rome需要两个条件:
java se 1.4以上的版本,下载地址: http://java.sun.com/
开源软件jdom,下载地址:http://www.jdom.org/
三:用netbeans快速开发一个简单实例
下面用一个简单的实例原型开发步骤来显示如何快速地利用rome和netbeans来构建一个基于web的rss阅读器。
netbeans是一个开源的java ide软件,下载地址:http://www.netbeans.org。选用netbeans是因为它内置tomcat,可以节省很多配置和运行的时间。而且功能强大,可以高效完成java se, java ee 以及java me等各种应用程序的开发。
用netbeans 5.0 创建 web project。
打开netbeans, 选择菜单"文件->新建项目",在新建项目窗口中,"类别"选择"web",项目选择"web应用程序",点击”下一步”。在”新建web应用程序”窗口中,输入项目名称,比如”webrssreader”和项目位置,其余采用缺省,点击”完成”。
图一: 创建netbeans的web项目
在新建立的”webrssreader”项目中,加入两个jar文件:
jdom.jar:jdom开源项目中(http://www.jdom.org/)
rome.jar : rome开源项目中(http://wiki.java.net/bin/view/javawsxml/rome)
图二:添加库文件
在index.jsp中加入代码
<%@page contenttype="text/html"%> <%@page pageencoding="utf-8"%> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>sina news</title> </head> <body> <% java.util.properties systemsettings = system.getproperties(); systemsettings.put("http.proxyhost", "mywebcache.com"); systemsettings.put("http.proxyport", "8080"); system.setproperties(systemsettings); string urlstr = "http://rss.sina.com.cn/news/marquee/ddt.xml"; java.net.urlconnection feedurl = new java.net.url(urlstr).openconnection(); feedurl.setrequestproperty("user-agent", "mozilla/4.0 (compatible; msie 5.0; windows nt; digext)"); com.sun.syndication.io.syndfeedinput input = new com.sun.syndication.io.syndfeedinput(); com.sun.syndication.feed.synd.syndfeed feed = input.build(new com.sun.syndication.io.xmlreader(feedurl)); %> <div align="center"> <h1><%=feed.gettitle()%></h1> <table border=1 cellpadding=3 width="700"> <tr> <th>number</th> <th>title</th> <th>time</th> </tr> <% java.util.list list = feed.getentries(); for (int i=0; i< list.size(); i++) { com.sun.syndication.feed.synd.syndentry entry = (com.sun.syndication.feed.synd.syndentry)list.get(i); %> <tr> <td><%=i+1%></td> <td><a href="<%=entry.getlink()%>"><%=entry.gettitle()%></a></td> <td><%=entry.getpublisheddate()%></td> </tr> <%}%> </table> </div> <br> </body> </html> |
表六: index.jsp全部源代码
运行项目。鼠标右键点击”webrssreader”项目,选择”运行项目”。
图三: 运行程序
运行结果如下。
图四:程序运行结果
四:总结
rss属于web2.0的一种应用技术。web2.0提倡个性化与参与性。而这个简单实例的开发中,采用的都是一些开源软件,开源软件更是”人人为我,我为人人”精神的一种体现。很多时候,我们不需要自己从头开发一些工具,站在前人的肩膀上,开发出一些更好的应用也许是程序员们更应该考虑的事情。
作者介绍:
李力目前在sun microsystems任高级软件工程师,有近十年软件开发经验,曾就职于aig,ca等公司,任软件工程师及系统分析员等职位,在j2ee领域有丰富的实际开发经验。联系方式:[email protected]。
新闻热点
疑难解答