Web版RSS阅读器(五)——初步完成阅读功能

最后更新于:2022-04-01 20:40:22

     上一篇博文《[Web版RSS阅读器(四)——定制自己的Rss解析库myrsslib4j](http://blog.csdn.net/xiaoxian8023/article/details/10048325)》中,已经分享给大家制作自己的rss解析库。稍微有点遗憾的是,它仅仅支持rss格式的博客。现在给大家分享一下我基于rome修改而成的另一款rss解析库——myrome,完美支持atom和rss 2种格式。     myrome.jar是在rome的基础上修改而来的,主要改动的地方是:([查看](http://note.youdao.com/share/?id=e9cdd75e55131fe6383e63d49fcc2440&type=note)[详细修改说明](http://note.youdao.com/share/?id=e9cdd75e55131fe6383e63d49fcc2440&type=note)) 1. 修改GetAuthor()返回null 1. 修改getPublishedDate()返回null 1. 添加获取文章摘要的接口和方法     附下载地址:[http://pan.baidu.com/share/link?shareid=3563208157&uk=1259218556](http://pan.baidu.com/share/link?shareid=3563208157&uk=1259218556)     本篇主题是把myrome加入到RssReader中,修改界面,完成初步的访问和阅读的功能。具体实现的效果为: 1. 根据不同的订阅信息,加载对应的图标,从而一眼得知订阅的出处 1. 点击左侧的某个订阅,在中间的页面中显示出标题、时间和摘要列表,用水平线隔开 1. 点击某个摘要信息,在右侧内容区域,显示该文章的所有内容。 1. 双击摘要信息,则会用新窗口打开原文章地址。     等不及了吗?点[这里](http://mfxuan.free.800m.net/)或者**[](http://mfxuan.free.800m.net/)**[这里](http://test.free.800m.net/)抢先查看效果吧。     言归正传,接下来请大家跟随我初步成功的脚步:     下载myrome-1.0.jar,拷贝到WebRoot/WEB-INF/lib下。如果已经引用过rome-0.2.jar,要提前删除掉。在com.tgb.rssreader.manager包中新建RomeReadRss类,用来解析在线rss内容。 【RomeReadRss.java】 ~~~ package com.tgb.rssreader.manager; import java.net.URL; import java.net.URLConnection; import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.io.SyndFeedInput; import com.sun.syndication.io.XmlReader; /** * 解析Rss订阅信息 * * @author Longxuan * */ public class RomeReadRss { /** * 解析Rss订阅信息 */ public SyndFeed parseRss(String rss) { SyndFeed feed = null; feed = null; try { URLConnection feedUrl = new URL(rss).openConnection(); // 由于服务器屏蔽java作为客户端访问rss,所以设置User-Agent feedUrl.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); // 读取Rss源 XmlReader reader = new XmlReader(feedUrl); SyndFeedInput input = new SyndFeedInput(); // 得到SyndFeed对象,即得到Rss源里的所有信息 feed = input.build(reader); } catch (Exception e) { e.printStackTrace(); } return feed; } } ~~~     修改left.jsp页的树形节点加载信息,根据不同的博客提供商,加载不同的图标。点击某节点后,将rss地址传递给servlet,去解析在线的rss。 【left.jsp】 ~~~ <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="com.tgb.rssreader.bean.*" %> <%@ page import="java.util.*" %> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+path+"/"; %>
~~~     在com.tgb.rssreader.web包中新建一个RssServlet类,继承HttpServlet,实现doGet和doPost方法。它接收到有left.jsp传递过来的rss地址,调用RomeReadRss来解析rss内容。解析完毕后,转向middle.jsp,在中间这个网页中,显示解析的内容。 【RssServlet.java】 ~~~ package com.tgb.rssreader.web; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.syndication.feed.synd.SyndFeed; import com.tgb.rssreader.manager.RomeReadRss; /** * 解析Rss信息资源Servlet * @author Longxuan * */ @SuppressWarnings("serial") public class RssServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取rss地址 String rss = request.getParameter("rss"); //获取基于myrome的解析对象 RomeReadRss romeReadRss = RomeReadRss.getInstance(); //解析rss内容,存放到SyndFeed对象中 SyndFeed feed = romeReadRss.parseRss(rss); //设置属性,用于传递SyndFeed对象 request.getSession().removeAttribute("feed"); request.getSession().setAttribute("feed", feed); //转向middle.jsp request.getRequestDispatcher("/middle.jsp").forward(request, response); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException { doGet(req, resp); } } ~~~     解析完毕后,开始修改middle.jsp。它接受到request中传递过来的SyndFeed对象,读取文章标题、发布时间及摘要信息,每篇文章都用横线隔开。未阅读过的显示黑色字体,阅读过后,显示灰色字体,鼠标指上去会变蓝色。点击文章摘要后,将该摘要的索引值传递过去;双击文章摘要信息,则会在新窗口中打开对应文章的实际连接。 【middle.jsp】 ~~~ <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="com.sun.syndication.feed.synd.*"%> <%@page import="java.util.List"%> <%@page session="true" %> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %>
~~~          当点击某篇文章标题时,将该文章的索引值传递到ArticleServlet中,在Session中找到对应的文章,把文章正文内容传递到content.jsp页面。所以在com.tgb.rssreader.web包中新建ArticleServlet类,继承HttpServlet,实现doGet和doPost方法。 【ArticleServlet.java】 ~~~ package com.tgb.rssreader.web; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.syndication.feed.synd.SyndContent; import com.sun.syndication.feed.synd.SyndEntry; import com.sun.syndication.feed.synd.SyndFeed; /** * 获取文章正文 * @author Longxuan * */ @SuppressWarnings("serial") public class ArticleServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取要查看的文章的索引值 int articleIndex = request.getParameter("articleIndex") == null? 0: Integer.parseInt( request.getParameter("articleIndex")); //获取session中的变量 SyndFeed feed = (SyndFeed) request.getSession().getAttribute("feed"); SyndContent content = (SyndContent)((SyndEntry)feed.getEntries().get(articleIndex)).getContents().get(0); request.setAttribute("content", content.getValue()); request.getRequestDispatcher("/content.jsp").forward(request, response); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } ~~~     在content.jsp中获取文章内容进行显示即可: 【content.jsp】 ~~~ <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@page import="com.sun.syndication.feed.synd.*"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %>

<%= request.getAttribute("content")==null?"" + "欢迎使用提高班在线Rss阅读器!" + "——@龙轩" :request.getAttribute("content").toString()%>


~~~     至此,Web版Rss阅读器阅读博客功能基本已经完工了,终于可以看到这款rss阅读器的样子了。当然需要优化的地方还很多。暂时打算告一段落,等过段时间再进行优化。基本的代码都已经写过了,~~不打算单独提供源码了。~~本来不打算提供源码了,因为按照步骤,差不多能整出来的。不过为了方便大家,刚刚还是把源码上传了,资源地址: [http://download.csdn.net/detail/xiaoxian8023/8116737](http://download.csdn.net/detail/xiaoxian8023/8116737)      最后晒一下效果图吧: [![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c53c293e265.jpg)](http://mfxuan.free.800m.net/) [![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c53c294f0f5.jpg)](http://mfxuan.free.800m.net/) **(点击图片在查看网站实例)** ** ** 如果您觉得做得不错,值得鼓励,就轻轻地【**顶一下**】吧 ';