實現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]。