程序可以从这里下载:http://download.youkuaiyun.com/detail/caoyuan10036/3975039
一、功能描述:
在我们浏览网站的时候,会看到很多频道,文章的头上会有一个RSS订阅的图标,点进去后会进入feed(供RSS阅读器订阅的一个地址)页面,然后把地址栏的地址复制下来,这就是我们要放入RSS阅读器订阅的feed,放入RSS阅读器后,变可以订阅此内容了。效果图有点烂,可功能都差不多实现了:
二、RSS阅读
阅读RSS主要用了ROME组件,导入jar包后就可以使用,很简单的,提供一个地址,便可以在jsp页面中显示出本地址所有文章,贴上Rome组件的RSS阅读jsp代码:
<?xml version="1.0" encoding="utf-8" ?> <%@page import="java.sql.PreparedStatement"%> <%@page import="java.sql.*"%> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ page import="db.Database" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Insert title here</title> </head> <body> <% request.setCharacterEncoding("utf-8"); String xmlmsg = request.getParameter("xmlmsg");//得到传来的feed地址,通过表单传来就行
//这里是我扩展的功能,首先查询磁条RSS的feed是否已经订阅过了,如果订阅过了则提示‘已订阅’//----------------------------------这是我扩展的功能,可以去掉---------------------------------
Database db = new Database();Connection conn = db.getconn();String sql="select * from tbl_rss_address where rss_address=?";PreparedStatement ps = conn.prepareStatement(sql);ps.setString(1,xmlmsg);ResultSet rs = ps.executeQuery();if(rs.next()){out.print("对不起,您已经订阅过了此内容");}
//-------------------------------------------------------------------------------------------
else{//这里就是Rome组件里读取feed的东西了java.util.Properties systemSettings = System.getProperties();systemSettings.put("http.proxyHost", "mywebcache.com");systemSettings.put("http.proxyPort", "8080");System.setProperties(systemSettings);String urlStr = xmlmsg;//拿到feed地址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));//----------------------这是我扩展的功能,可以去掉---------------------------------------------------------
//把这条RSS的feed地址存入我们的数据库,因为我们只有通过feed地址才能通过Rome组件读出我们订阅的内容,所以要起到订阅的功能,必须把feed存入数据库
sql = "insert into tbl_rss_address(rss_address,title) values(?,?)"; ps = conn.prepareStatement(sql);ps.setString(1,xmlmsg);ps.setString(2,feed.getTitle());ps.executeUpdate();//---------------------------------------------------------------------------------------------------------%><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> 三、阅读feed的方法实现了,我们现在制作自己网站文章的feed供RSS阅读器订阅,这里是通过jdom操作xml模版来生成的package com.dao; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.jdom.Attribute; import org.jdom.Document; import org.jdom.Element; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; import db.Database; public class ProductRss { public void cereateRss(String channel2) throws IOException, SQLException{ Document doc = new Document(); //创建空白文档 /* * 创建PI并添加到文档 */ // Map map = new HashMap(); // map.put("type","text/xsl"); // map.put("href","products.xsl"); // ProcessingInstruction pi = new ProcessingInstruction("xml-stylesheet",map);//处理指令 //将处理指令添加 // doc.addContent(pi); /* * 创建文档类型并添加到文档 */ // DocType type = new DocType("productsDetails"); //文档类型 // type.setPublicID("public.dtd"); //设为 public // //type.setSystemID("system.dtd"); //设为 system // //添加文档类型 // doc.addContent(type); Database db = new Database();//连接数据库 Connection conn = db.getconn(); Statement stmt = conn.createStatement(); String sql = "select * from article where channel=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1,channel2); ResultSet rs = ps.executeQuery(); /*<rss version="2.0">*/ Element root = new Element("rss"); //创建一个元素 doc.setRootElement(root); //将该元素做为根元素 Attribute version = new Attribute("version","2.0"); //创建属性 root.setAttribute(version); //为product设置属性 /*<channel>*/ Element channel = new Element("channel"); root.addContent(channel); //将product做为productsDetails的子元素 //为product创建子元素,并将其content分别设为100.00,red channel.addContent(new Element("title").setText("文章列表")); channel.addContent(new Element("link").setText("www.baidu.com")); channel.addContent(new Element("description").setText("这是我的rss小例子,希望能成功")); while(rs.next()){ Element item = new Element("item"); channel.addContent(item); //将product做为productsDetails的子元素 item.addContent(new Element("title").setText(rs.getString("title"))); item.addContent(new Element("link").setText("detail.jsp?id="+rs.getString("id"))); item.addContent(new Element("author").setText(rs.getString("author"))); item.addContent(new Element("description").setText(rs.getString("description"))); } XMLOutputter outp = new XMLOutputter(Format.getPrettyFormat()); File file = new File("D:\\305\\c\\RomeRssReader\\WebContent\\data.xml");//生成的feed OutputStream out = new FileOutputStream(file); outp.output(doc, out); //输出XML文档 System.out.print("XML 文档生成完毕!"); out.close(); } }
这样就生成了D:\\305\\c\\RomeRssReader\\WebContent\\data.xml这样一个feed,可以阅读了。其实feed就是一个xml文件..里面有特定的标签的....我们生成feed就是用jdom去生成这个xml文件。
整个程序代码:在这里下载 http://download.youkuaiyun.com/detail/caoyuan10036/3975039