用JSP实现基于Web的RSS阅读器

一: 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中的类和方法。

java 代码
  1. URL feedUrl = new URL("http://rss.sina.com.cn/news/marquee/ddt.xml");   
  2.   
  3. SyndFeedInput input = new SyndFeedInput();   
  4.   
  5. 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类的结构。

java 代码
  1. SyndFeedImpl.contributors=null  
  2.   
  3. SyndFeedImpl.title=新闻中心-新闻要闻   
  4.   
  5. SyndFeedImpl.categories[0].name=   
  6.   
  7. SyndFeedImpl.categories[0].taxonomyUri=null  
  8.   
  9. SyndFeedImpl.link=http://news.sina.com.cn/iframe/o/allnews/input/index.htm   
  10.   
  11. SyndFeedImpl.publishedDate=Thu Jun 22 13:20:01 CST 2006  
  12.   
  13. SyndFeedImpl.entries[0].updatedDate=null  
  14.   
  15. SyndFeedImpl.entries[0].contributors=null  
  16.   
  17. SyndFeedImpl.entries[0].title=扎瓦赫里在录像带中呼吁阿富汗人抵抗外国侵略   
  18.   
  19. SyndFeedImpl.entries[0].categories[0].name=   
  20.   
  21. SyndFeedImpl.entries[0].categories[0].taxonomyUri=null  
  22.   
  23. SyndFeedImpl.entries[0].link=http://news.sina.com.cn/w/2006-06-22/11569270955s.shtml   
  24.   
  25. SyndFeedImpl.entries[0].publishedDate=Thu Jun 22 11:56:00 CST 2006  
  26.   
  27. SyndFeedImpl.entries[0].authors=null  
  28.   
  29. SyndFeedImpl.entries[0].modules[0].descriptions=[]   
  30.   
  31. SyndFeedImpl.entries[0].modules[0].creators[0]=WWW.SINA.COM.CN   
  32.   
  33. SyndFeedImpl.entries[0].modules[0].contributors=[]   
  34.   
  35. ......   
  36.   
  37. SyndFeedImpl.author=null  
  38.   
  39. SyndFeedImpl.copyright=Copyright 1996 - 2005 SINA Inc. All Rights Reserved   

表三:从SyndFeed中得到SyndEntry


如果程序位于防火墙后面,就需要在程序中加上一些Proxy设置。例如采用下面的http proxy

java 代码
  1. Properties systemSettings = System.getProperties();   
  2.   
  3. systemSettings.put("http.proxyHost""myproxyserver.com");   
  4.   
  5. systemSettings.put("http.proxyPort""80");   
  6.   
  7. System.setProperties(systemSettings);   

表四:Proxy设置

有时候,可能会遇到“java.io.IOException: Server returned HTTP response code: 403 for URL”的错误信息。通常是因为服务器的安全设置不接受Java程序作为客户端访问,解决方案是设置客户端的User Agent, 示例代码如下:

java 代码
  1. URLConnection feedUrl = new jURL(urlStr).openConnection();   
  2.   
  3. feedUrl.setRequestProperty("User-Agent""Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");   
  4.   
  5. SyndFeedInput input = new SyndFeedInput();   
  6.   
  7. 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/

例子

java 代码
  1. <!--   
  2. <%@page contentType="text/html"%>   
  3.   
  4. <%@page pageEncoding="UTF-8"%>   
  5.   
  6.   
  7.   
  8.   
  9.   
  10. <html>   
  11.   
  12. <head>   
  13.   
  14. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">   
  15.   
  16. <title>Sina News</title>   
  17.   
  18. </head>   
  19.   
  20. <body>   
  21.   
  22. <%   
  23.   
  24. java.util.Properties systemSettings = System.getProperties();   
  25.   
  26. systemSettings.put("http.proxyHost""mywebcache.com");   
  27.   
  28. systemSettings.put("http.proxyPort""8080");   
  29.   
  30. System.setProperties(systemSettings);   
  31.   
  32.   
  33.   
  34.   
  35.   
  36. String urlStr = "http://rss.sina.com.cn/news/marquee/ddt.xml";   
  37.   
  38. java.net.URLConnection feedUrl = new java.net.URL(urlStr).openConnection();   
  39.   
  40. feedUrl.setRequestProperty("User-Agent""Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");   
  41.   
  42. com.sun.syndication.io.SyndFeedInput input = new com.sun.syndication.io.SyndFeedInput();   
  43.   
  44. com.sun.syndication.feed.synd.SyndFeed feed = input.build(new com.sun.syndication.io.XmlReader(feedUrl));   
  45.   
  46. %>   
  47.   
  48. <div align="center">   
  49.   
  50. <h1><%=feed.getTitle()%></h1>   
  51.   
  52. <table border=1 cellpadding=3 width="700">   
  53.   
  54. <tr>   
  55.   
  56. <th>Number</th>   
  57.   
  58. <th>Title</th>   
  59.   
  60. <th>Time</th>   
  61.   
  62. </tr>   
  63.   
  64. <%    
  65.   
  66. java.util.List list = feed.getEntries();   
  67.   
  68. for (int i=0; i< list.size(); i++) {   
  69.   
  70. com.sun.syndication.feed.synd.SyndEntry entry = (com.sun.syndication.feed.synd.SyndEntry)list.get(i);   
  71.   
  72. %>   
  73.   
  74. <tr>   
  75.   
  76. <td><%=i+1%></td>   
  77.   
  78. <td><a href="<%=entry.getLink()%>"><%=entry.getTitle()%></a></td>   
  79.   
  80. <td><%=entry.getPublishedDate()%></td>   
  81.   
  82. </tr>   
  83.   
  84. <%}%>   
  85.   
  86. </table>   
  87.   
  88. </div>    
  89.   
  90. <br>    
  91.   
  92. </body>   
  93.   
  94. </html>   
  95.   
  96. -->  

表二: SyndFeed数据结构


从上述输出结果可以看出,每个新闻条目是由entry代表的。下列代码从feed中得到entry

java 代码
  1. List list = feed.getEntries();   
  2.   
  3. for (int i=0; i< list.size(); i++) {   
  4.   
  5. SyndEntry entry = (SyndEntry)list.get(i);   
  6.   
  7. }    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值