一: RSS介紹
根據維基百科(http://zh.wikipedia.org/wiki/RSS)的定義,“RSS是一種用于共享新聞和其他Web內容的數據交換規范 ”,它是一系列的規范的組合,采用XML格式。目前國內RSS應用最多的是在新聞網(wǎng)站和博客網(wǎng)站上。
許多網(wǎng)站可以用RSS閱讀器來(lái)個(gè)性化自己的網(wǎng)頁(yè),比如顯示最新的新浪新聞,顯示自己好朋友最新的博客文章,顯示最新的Google論壇內容。除此之外,利用RSS閱讀器還可以實(shí)現其它用途,比如:
獲得天氣預報
接收郵件,比如Gmail就提供RSS feed
獲取最新股票行情
獲取音樂(lè ),電臺節目和視頻剪輯等等
二:Rome介紹
這篇文章采用Rome這個(gè)開(kāi)源工具來(lái)實(shí)現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上得到。
實(shí)現RSS閱讀器,主要采用Rome的解析功能,就是從XML文件中讀出相應的內容。我用一些簡(jiǎn)單代碼來(lái)說(shuō)明如何使用Rome中的類(lèi)和方法。
| 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“是新浪新聞的一個(gè)RSS 地址。通過(guò)三行代碼,就可以得到一個(gè)對應這個(gè)地址的RSS Feed對象。這個(gè)對象包含我們所需要的所有RSS內容。如果用System.out.println(feed),會(huì )得到表二中的結果。從中可以清楚地看到 SyndFeed類(lèi)的結構。
| 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數據結構
從上述輸出結果可以看出,每個(gè)新聞條目是由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設置
有時(shí)候,可能會(huì )遇到“java.io.IOException: Server returned HTTP response code: 403 for URL”的錯誤信息。通常是因為服務(wù)器的安全設置不接受Java程序作為客戶(hù)端訪(fǎng)問(wèn),解決方案是設置客戶(hù)端的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來(lái)為自己的網(wǎng)站內容創(chuàng )建RSS Feed,這樣別人就可以通過(guò)RSS 閱讀器來(lái)隨時(shí)了解你網(wǎng)站內容的更新了。
使用ROME需要兩個(gè)條件:
Java SE 1.4以上的版本,下載地址: http://java.sun.com/
開(kāi)源軟件JDOM,下載地址:http://www.jdom.org/
三:用NetBeans快速開(kāi)發(fā)一個(gè)簡(jiǎn)單實(shí)例
下面用一個(gè)簡(jiǎn)單的實(shí)例原型開(kāi)發(fā)步驟來(lái)顯示如何快速地利用Rome和NetBeans來(lái)構建一個(gè)基于Web的RSS閱讀器。
NetBeans是一個(gè)開(kāi)源的Java IDE軟件,下載地址:http://www.netbeans.org。選用NetBeans是因為它內置Tomcat,可以節省很多配置和運行的時(shí)間。而且功能強大,可以高效完成Java SE, Java EE 以及Java ME等各種應用程序的開(kāi)發(fā)。
用NetBeans 5.0 創(chuàng )建 Web Project。
打開(kāi)NetBeans, 選擇菜單"文件->新建項目",在新建項目窗口中,"類(lèi)別"選擇"Web",項目選擇"Web應用程序",點(diǎn)擊”下一步”。在”新建Web應用程序”窗口中,輸入項目名稱(chēng),比如”webrssreader”和項目位置,其余采用缺省,點(diǎn)擊”完成”。

在新建立的”webrssreader”項目中,加入兩個(gè)jar文件:
jdom.jar:JDOM開(kāi)源項目中(http://www.jdom.org/)
rome.jar : ROME開(kāi)源項目中(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全部源代碼
運行項目。鼠標右鍵點(diǎn)擊”webrssreader”項目,選擇”運行項目”。

運行結果如下。

四:總結
RSS屬于Web2.0的一種應用技術(shù)。Web2.0提倡個(gè)性化與參與性。而這個(gè)簡(jiǎn)單實(shí)例的開(kāi)發(fā)中,采用的都是一些開(kāi)源軟件,開(kāi)源軟件更是”人人為我,我為人人”精神的一種體現。很多時(shí)候,我們不需要自己從頭開(kāi)發(fā)一些工具,站在前人的肩膀上,開(kāi)發(fā)出一些更好的應用也許是程序員們更應該考慮的事情。
作者介紹:
李力目前在Sun Microsystems任高級軟件工程師,有近十年軟件開(kāi)發(fā)經(jīng)驗,曾就職于AIG,CA等公司,任軟件工程師及系統分析員等職位,在J2EE領(lǐng)域有豐富的實(shí)際開(kāi)發(fā)經(jīng)驗。聯(lián)系方式:Ada.Li@Sun.com。
聯(lián)系客服