用JSP實現基於Web的RSS閱讀器

來源:互聯網
上載者:User
js|rss|web

一: 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全部原始碼

       

    1. 運行項目。滑鼠右鍵點擊”webrssreader”項目,選擇”運行項目”。


      圖三: 運行程式

       

    2. 運行結果如下。


    圖四:程式運行結果

    四:總結

    RSS屬於Web2.0的一種應用技術。Web2.0提倡個人化與參與性。而這個簡單一實例的開發中,採用的都是一些開源軟體,開源軟體更是”人人為我,我為人人”精神的一種體現。很多時候,我們不需要自己從頭開發一些工具,站在前人的肩膀上,開發出一些更好的應用也許是程式員們更應該考慮的事情。


    作者介紹:

    李力目前在Sun Microsystems任進階軟體工程師,有近十年軟體開發經驗,曾就職於AIG,CA等公司,任軟體工程師及系統分析員等職位,在J2EE領域有豐富的實際開發經驗。連絡方式:Ada.Li@Sun.com。



  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.