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

导读:
  李力,Sun中国工程院工程师
   一: 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"%>

  

  

  

   Sina News

  

  

  <%

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));

%>  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));

  %>
  

  

<%=feed.getTitle()%>


  

















  
  
Number
  
Title
  
Time
     <% java.util.List list = feed.getEntries(); for (int i=0; i<  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);   %>   
  
<%=i+1%>
  
<%=entry.getTitle()%>
  
<%=entry.getPublishedDate()%>
     <%}%>   
  

  

  
  
  表六: index.jsp全部源代码
  
  运行项目。鼠标右键点击”webrssreader”项目,选择”运行项目”。
  
  
  图三: 运行程序
  
  运行结果如下。
  
  
  图四:程序运行结果
   四:总结
  RSS属于Web2.0的一种应用技术。Web2.0提倡个性化与参与性。而这个简单实例的开发中,采用的都是一些开源软件,开源软件更是”人人为我,我为人人”精神的一种体现。很多时候,我们不需要自己从头开发一些工具,站在前人的肩膀上,开发出一些更好的应用也许是程序员们更应该考虑的事情。
   作者介绍:
  李力目前在Sun Microsystems任高级软件工程师,有近十年软件开发经验,曾就职于AIG,CA等公司,任软件工程师及系统分析员等职位,在J2EE领域有丰富的实际开发经验。联系方式:Ada.Li@Sun.com。
  Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=846826

本文转自
http://blog.csdn.net/javachannel/archive/2006/06/28/846826.aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值