RSS简述
RSS是在互联网上被广泛采用的内容包装和投递协议。网络用户可以在客户端借助于支持RSS的新闻工具软件,在不打开网站内容页面的情况下,阅读支持RSS输出的网站内容。内容提供者在其网站上发布相应的RSS文件,系统入口程序获取该RSS文件并把它提供给用户,用户使用相应的阅读工具软件来阅读该内容。这是比较官方的解释。下面我们从平时在一些门户网站,特别是博客系统中经常看到的一个比较常用的功能---RSS订阅。比如CSDN博客系统RSS订阅功能。
我们都知道在WEB 2.0时代,博客等社交应用已取代了原有的日记等传统的记录个人日志方式,成为广大网友发布自己日记、文章、评论和最新生活动态等的主要场所。版主自然希望自己的发布的日记、文章、评论和最新生活动态能够被更多的朋友关注和收藏,同时也希望能够关注他人的发布的日记、文章、评论和最新生活动态。在RSS订阅出现以前,我们需要看别人的发布的日记、文章、评论和最新生活动态是否有更新,定会打开浏览器然后输入博客等地址来查看最新更新的博客。但在WEB 2.0时代之后,RSS订阅提供给我们更友好的方式。这个时候我们可以通过RSS的阅读软件(客户端软件),现在市面上提供很多RSS阅读客户端软件方便我们将我们需要关注的博客RSS超链接添加为RSS种子,现在RSS订阅功能已是绝大多数博客系统必备的功能了!这样既方面我们关注他人博客,也方面别人关注自己的博客。
下面我们看看我的CSDN博客的RSS文件格式,如下:
RSS格式
xml文本如下:
<?xml version="1.0" encoding="utf-8" ?> <?xml-stylesheet type="text/xsl" title="XSL Formatting" href="/rss.xsl" media="all" ?> <rss version="2.0"> <channel> <title>jplogic java 快速开发平台架构</title> <image> <link>http://blog.csdn.net</link> <url>http://static.blog.csdn.net/images/logo.gif</url> </image> <description>拿着互联网武器(互联网思维、互联网技术)之AK47,走在改变世界的路上!!!!</description> <link>http://blog.csdn.net/romantichjwhjwhjw</link> <language>zh-cn</language> <generator>http://blog.csdn.net</generator> <ttl>5</ttl> <copyright><![CDATA[Copyright © romantichjwhjwhjw]]></copyright> <pubDate>2015-1-15 12:00:32</pubDate> <item> <title><![CDATA[[转]各浏览器对 window.open() 的窗口特征 sFeatures 参数支持程度存在差异]]></title> <link>http://blog.csdn.net/romantichjwhjwhjw/article/details/41391055</link> <guid>http://blog.csdn.net/romantichjwhjwhjw/article/details/41391055</guid> <author>romantichjwhjwhjw</author> <pubDate>2014-11-22 22:42:10</pubDate> <description><![CDATA[ <p>本文原文来至地址:http://www.w3help.org/zh-cn/causes/BX1053</p> <p><span style="color:rgb(0,51,102); font-family:微软雅黑,'Microsoft YaHei'; font-size:21px"> 标准参考</span></p> <p><span style="color:rgb(0,51,102); font-family:微软雅黑,'Microsoft YaHei'; font-size:21px"> .......</span></p> <p><span style="color:rgb(0,51,102); font-family:微软雅黑,'Microsoft YaHei'; font-size:21px"> 问题描述</span></p> <p></p> <p style="margin:10px 20px; padding-top:0px; padding-bottom:0px; line-height:21px; font-family:Arial,Verdana,Tahoma,sans-serif; font-size:14px"> 使用 window.open 方法可以弹出一个新窗口,其中 open 方法的 sFeatures 参数选项在各浏览器中支持程度不一,这有可能导致同样的代码使各浏览器中弹出窗口形式产生巨大差异。</p> <p style="margin:10px 20px; padding-top:0px; padding-bottom:0px; line-height:21px; font-family:Arial,Verdana,Tahoma,sans-serif; font-size:14px"> <span style="color:rgb(0,51,102); font-family:微软雅黑,'Microsoft YaHei'; font-size:21px">造成的影响</span></p> <p style="margin:10px 20px; padding-top:0px; padding-bottom:0px; line-height:21px; font-family:Arial,Verdana,Tahoma,sans-serif; font-size:14px"> 会造成不同浏览器中打开的窗口位置、尺寸出现差异;以及是否有地址栏、菜单栏、状态栏、滚动条和是否全屏等表现形式存在出入。</p> <h2 id="impacted_browsers" style="margin:20px 20px 10px; padding:0px; font-family:微软雅黑,'Microsoft YaHei'; font-size:21px; font-weight:normal; color:rgb(0,51,102)"> 受影响的浏览器</h2> </tbody> </table> <p style="margin:10px 20px; padding-top:0px; padding-bottom:0px; line-height:21px; font-family:Arial,Verdana,Tahoma,sans-serif; font-size:14px"> 上表中为各个浏览器对 features 各参数选项的支持程度,其中需要特殊说明的如下:</p> <ul style="margin:10px 20px; padding:0px 0px 0px 20px; list-style:none; font-family:Arial,Verdana,Tahoma,sans-serif; font-size:14px; line-height:21px"> <li style="margin:5px 0px; padding:0px; list-style:square">【标注1】:IE7 IE8 Firefox Chrome Safari 中,当 "menubar" 选项为 "yes" 时,默认不显示菜单栏,需要按 ALT 键后菜单栏才可显示;相反当 "menubar" 选项为 "no" 时,即使按了 ALT 键也不会显示菜单栏。</li><li style="margin:5px 0px; padding:0px; list-style:square">【标注2】:Safari 中,开启 "location" 选项与开启 "toolbar" 选项时显示效果一致。</li><li style="margin:5px 0px; padding:0px; list-style:square">【标注3】:IE6 IE8 Chrome 中,使用 "top" 和 "left" 定位,如果出现设定的的坐标值过大,弹出窗口将可能显示在屏幕可视范围外。</li><li style="margin:5px 0px; padding:0px; list-style:square">【标注4】:IE7 Firefox Safari Opera 中,使用 "top" 和 "left" 定位,如果出现设定的的坐标值过大,窗口会自动调整 "top" 与 "left" 值,确保窗口正常显示在屏幕可视区域内。</li><li style="margin:5px 0px; padding:0px; list-style:square">【标注5】:Chrome Opera 中,不支持在没有设定 "width" 与 "height" 值的情况下独立使用 "left" 和 "top",此时 "left" "top" 设定值均不生效。</li><li style="margin:5px 0px; padding:0px; list-style:square">【标注6】:Chrome 中,不支持在没有设定 "left" 和 "height" 值的情况下独立使用 "width" 与 "height",此时 "width" "height" 设定值均不生效。结合【标注5】说明可知,在 Chrome 中弹出窗口不论想要设定宽高或位置中的一个或几个值,都必须将他们全部赋值,否则都将不起作用。</li><li style="margin:5px 0px; padding:0px; list-style:square">【标注7】:Firefox Chrome 中,地址栏会始终显示。</li><li style="margin:5px 0px; padding:0px; list-style:square">【标注8】:Opera 中,地址栏默认不显示,但可以点击页面最上方横条使他显示出来,设置 "location=yes" 后地址栏会自动显示出来。</li><li style="margin:5px 0px; padding:0px; list-style:square">【标注9】:Chrome Opera 中,不论 "menubar" 值如何设置,永远不显示菜单栏。</li><li style="margin:5px 0px; padding:0px; list-style:square">【标注10】:Firefox Safari Chrome Opera 中,无论 "resizable"值如何设置,窗口永远可由用户调整大小。</li><li style="margin:5px 0px; padding:0px; list-style:square">【标注11】:Safari Chrome 中,在页面存在滚动条的情况下,无论 "scrollbars"值如何设置,滚动条始终可见。</li><li style="margin:5px 0px; padding:0px; list-style:square">【标注12】:IE7 在 Windows XP SP3 系统中默认可以支持 "status " 参数隐藏状态栏;而在 Windows Vista 系统默认环境下不支持 "status " 参数,状态栏始终可见。这与两个系统中默认的 IE7 小版本号不同有关,前者版本号较低,后者版本号较高。</li><li style="margin:5px 0px; padding:0px; list-style:square">【标注13】:Firefox 中,无论 "status" 值如何设置,状态栏始终可见,而 Chrome Opera 中,则与前者相反,状态栏始终不可见。</li><li style="margin:5px 0px; padding:0px; list-style:square">【标注14】: Chrome Opera 中,无论 "toolbar" 值如何设置,始终不显示工具栏。</li></ul> <p style="margin:10px 20px; padding-top:0px; padding-bottom:0px; line-height:21px; font-family:Arial,Verdana,Tahoma,sans-serif; font-size:14px"> 综上所述,可见 window.open 方法的 sFeatures 参数支持程度存在巨大差异,使用时须谨慎为之。</p> <h2 id="solutions" style="margin:20px 20px 10px; padding:0px; font-family:微软雅黑,'Microsoft YaHei'; font-size:21px; font-weight:normal; color:rgb(0,51,102)"> 解决方案</h2> <p style="margin:10px 20px; padding-top:0px; padding-bottom:0px; line-height:21px; font-family:Arial,Verdana,Tahoma,sans-serif; font-size:14px"> 建议在使用 window.open 方法的 sFeatures 参数时,推荐如下配置字符串,可确保所有浏览器表现基本一致:</p> <p style="margin:10px 20px; padding-top:0px; padding-bottom:0px; line-height:21px; font-family:Arial,Verdana,Tahoma,sans-serif; font-size:14px"> <pre code_snippet_id="529050" snippet_file_name="blog_20141122_2_6980948" name="code" class="html">" top=nInt,left=nInt,width=nInt,height=nInt,location=yes,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no "</pre><br> <br> </p> <p style="margin:10px 20px; padding-top:0px; padding-bottom:0px; line-height:21px; font-family:Arial,Verdana,Tahoma,sans-serif; font-size:14px"> <br> </p> <br> <div> 作者:romantichjwhjwhjw 发表于2014-11-22 22:42:10 <a href="http://blog.csdn.net/romantichjwhjwhjw/article/details/41391055">原文链接</a> </div> <div> 阅读:75 评论:0 <a href="http://blog.csdn.net/romantichjwhjwhjw/article/details/41391055#comments" target="_blank">查看评论</a> </div> ]]> </description> <category></category> </item> </channel> </rss>格式大致简化为如下格式说明:
<?xml version="1.0" encoding="utf-8" ?> <rss version="2.0"> <channel> <title>某某博客</title>//channel的标题 <description>与某某博客介绍</description>//channel的介绍 <link>http://blog.csdn.net/romantichjwhjwhjw/article/details/42201851</link>//channel的url <item> <title><!-- item标题--></title> <link><!-- item URL --></link> <description><!-- 简要描述 --></description> <!-- 可选的/可扩展的元素 --> </item> <item> <!-- 可多个item,一个channel有多个item --></item><channel></rss></span>
本文现在通过Rome的方式实现RSS读取,其中原理有点类似于网页内容抓取,也就是在第三方应用(在这里是我平台服务端的一段代码)模拟浏览器请求支持RSS订阅功能博客对应的RSS超链接,而从中获取RSS超链接对应的RSS文件内容,并解析之,进而显示出来,这样就可以模拟在线RSS阅读器相关功能。如下是其中一段关键代码:
public SyndFeed parseRssContent(String rssUrl) { SyndFeed syndFeed = null; try { //出现异常:Server redirected too many times //有些网站是这样的,他判断cookie里面是否有某个值, //如果没有就定向到另外一个页面去把COOKIE的值设置了,然后再跳转回来, //但是如果我们通过HttpURLConnection去的话,cookie里面一直都没有那个值, //所以他就一直在那里跳来跳去,所以我们就需要一个CookieManager, //在使用URLConnection之前设置它,只需要设置一次。 System.setProperty("http.maxRedirects", "100"); // First set the default cookie manager. CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); URLConnection feedUrlConnection = new URL(rssUrl).openConnection(); //由于服务器屏蔽java作为客户端访问rssUrl所以设置User-Agent feedUrlConnection.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt) "); //读取Rss源 XmlReader reader = new XmlReader(feedUrlConnection); SyndFeedInput input = new SyndFeedInput(); //得到SyndFeed对象,即得到Rss源里的所有信息 syndFeed = input.build(reader); } catch (Exception e) { e.printStackTrace(); } return syndFeed; }在以上关键代码代码中有这么一段:
feedUrlConnection.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt) ");这便是模拟浏览器请求,除此之外还需要在
URLConnection feedUrlConnection = new URL(rssUrl).openConnection();之前添加如下代码:
System.setProperty("http.maxRedirects", "100"); // First set the default cookie manager. CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));否则对于一些博客应用会出现异常:Server redirected too many times。好了以上这一段代码完了之后其实就是通过Rome提供给我们的API把解析后的内容存放到相应的javabean即可。
好了,以上便是关于在线RSS阅读器的实现方式,以上内容单元对你有所帮助。以下便是本人实现的一个添加了数据库支持的在线RSS阅读器,如下图:
在线设置收藏需要关注的博客链接,如下图: