LittleRain

          小雨不打傘 打傘雨不小

          輕松為自己的網(wǎng)站添加Rss功能

          用ROME來作:https://rome.dev.java.net/

          ?

          自己的第一個項(xiàng)目IQBoree
          里面要求有提供給客戶Rss訂閱的功能,找了下網(wǎng)上介紹,最后還是在rome的管網(wǎng)找到了解決方案

          解決方案有兩種:
          1,寫一個servlet,生成feed,直接由客戶來訂閱
          2,寫一個java.自動生成feed的xml文件,然后讓客戶通過讀取這個xml文件來達(dá)到訂閱Rss的目的

          首先我就來講解下第一種方法:
          1.
          FeedServlet.java

          package com.iqboree.rss.servlet;
          import java.io.IOException;
          import java.sql.Connection;
          import java.sql.DriverManager;
          import java.sql.ResultSet;
          import java.sql.SQLException;
          import java.sql.Statement;
          import java.text.DateFormat;
          import java.text.ParseException;
          import java.text.SimpleDateFormat;
          import java.util.ArrayList;
          import java.util.Iterator;
          import java.util.List;

          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;

          import com.iqboree.po.Article;
          import com.iqboree.service.impl.ArticleManagerImpl;
          import com.sun.syndication.feed.synd.SyndContent;
          import com.sun.syndication.feed.synd.SyndContentImpl;
          import com.sun.syndication.feed.synd.SyndEntry;
          import com.sun.syndication.feed.synd.SyndEntryImpl;
          import com.sun.syndication.feed.synd.SyndFeed;
          import com.sun.syndication.feed.synd.SyndFeedImpl;
          import com.sun.syndication.io.FeedException;
          import com.sun.syndication.io.SyndFeedOutput;

          /**

          * @author Michael
          *
          */
          public class FeedServlet extends HttpServlet {
          ?
          ?private static final Log log = LogFactory.getLog(FeedServlet.class);?
          ??? private static final String DEFAULT_FEED_TYPE = "default.feed.type";
          ??? private static final String FEED_TYPE = "type";
          ??? private static final String MIME_TYPE = "application/xml; charset=UTF-8";
          ??? private static final String COULD_NOT_GENERATE_FEED_ERROR = "Could not generate feed";

          ??? private static final DateFormat DATE_PARSER = new SimpleDateFormat("yyyy-MM-dd");



          ??? private String _defaultFeedType;
          ???
          ??? List list;

          ??? public void init() {
          ??????? _defaultFeedType = getServletConfig().getInitParameter(DEFAULT_FEED_TYPE);
          ??????? _defaultFeedType = (_defaultFeedType!=null) ? _defaultFeedType : "atom_0.3";
          ?????? log.info("初始化完成");//用來調(diào)試,可以看出在tomcat里的輸出信息,自己可以去掉,后面的log.info()?也是同樣的效果.
          ???????DATE_PARSER.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));//這里用來設(shè)置時區(qū)
          ???
          ??? }

          ??? public void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException {
          ??????? try {
          ??????? ?log.info("doget方法完成");
          ??????????? SyndFeed feed = getFeed(req);

          ??????????? String feedType = req.getParameter(FEED_TYPE);
          ??????????? feedType = (feedType!=null) ? feedType : _defaultFeedType;
          ??????????? feed.setFeedType(feedType);

          ??????????? res.setContentType(MIME_TYPE);
          ??????????? SyndFeedOutput output = new SyndFeedOutput();
          ??????????? output.output(feed,res.getWriter());
          ??????? }
          ??????? catch (FeedException ex) {
          ??????????? String msg = COULD_NOT_GENERATE_FEED_ERROR;
          ??????????? log(msg,ex);
          ??????????? res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,msg);
          ??????? }
          ??? }

          ??? protected SyndFeed getFeed(HttpServletRequest req) throws IOException,FeedException {
          ??? ?log.info("Synd方法開始");
          ??? ?
          ??????? SyndFeed feed = new SyndFeedImpl();

          ??????? feed.setTitle("Sample Feed (created with ROME)");//channle name ;display as the title
          ??????? feed.setLink("http://rome.dev.java.net");
          ??????? feed.setDescription("This feed has been created using ROME (Java syndication utilities");
          ???????
          ??????? List entries = new ArrayList();
          ??????? SyndEntry entry;
          ??????? SyndContent description;
          ???????
          ??????? List list = new ArrayList();

          ??????//項(xiàng)目是基于spring+webwork+hibernate的,但是在這里不知道讓為這個servlet自動獲得對應(yīng)的DAO,所以只能用jdbc手動獲取
          ??????? String sql = "";
          ??????? try {
          ??????? ?log.info("開始進(jìn)行jdbc操作");
          ???Class.forName("com.mysql.jdbc.Driver");
          ???String url="jdbc:mysql://localhost:3306/iqboree";
          ???Connection conn = DriverManager.getConnection(url,"root","ahuango");
          ???if(conn == null)
          ???{
          ????log.info("conn NULL");
          ???}
          ???Statement stmt = conn.createStatement();
          ???if(stmt==null)
          ???{
          ????log.info("NULLNULLNULL");
          ???}
          ???log.info("開始進(jìn)行sql操作");
          ???sql = "Select id,AddedDate,AddedBy,Title,Abstract,Body,CommentsEnabled,ViewCount," +
          ?????"ReleaseDate,ExpireDate,Approved,Listed,OnlyForMembers,Category_ID from iq_article";
          ???ResultSet rs = stmt.executeQuery(sql);
          ???log.info("begin iterator resultSet");
          ???while(rs.next())
          ???{
          ????log.info("test 1");
          ????Article art = new Article();
          ????art.setId(Long.valueOf(rs.getString(1)));
          ????log.info("test 2");
          ????art.setAddedDate(rs.getDate(2));
          ????log.info("test 3");
          ????art.setAddedBy(rs.getString(3));
          ????log.info("test 4");
          ????art.setTitle(rs.getString(4));
          ????log.info("test 5");
          ????art.setAbstracts(rs.getString(5));
          ????log.info("test 6");
          ????art.setBody(rs.getString(6));
          ????log.info("test 7");
          ????art.setCommentsEnabled(Boolean.valueOf(rs.getBoolean(7)));
          ????log.info("test 8");
          ????art.setViewCount(Integer.valueOf(rs.getString(8)));
          ????log.info("test 9");
          ????art.setReleaseDate(rs.getDate(9));
          ????log.info("test 10");
          ????art.setExpireDate(rs.getDate(10));
          ????log.info("test 11");
          ????art.setApproved(Boolean.valueOf(rs.getBoolean(11)));
          ????log.info("test 12");
          ????art.setListed(Boolean.valueOf(rs.getBoolean(12)));
          ????log.info("test 13");
          ????art.setOnlyForMembers(Boolean.valueOf(rs.getBoolean(13)));
          ????log.info("test 14");
          //????art.getCategory().setId(Long.valueOf(rs.getString(14)));
          ????log.info("test 15");
          ????
          ????list.add(art);
          ???}??
          ???stmt.close();
          ???conn.close();
          ???
          ??} catch (ClassNotFoundException e) {
          ???// TODO Auto-generated catch block
          ???e.printStackTrace();
          ??}catch(Exception e)
          ??{
          ???log.error("sql:"+sql+"?????? "+e.toString());
          ??}

          //數(shù)據(jù)庫信息獲取完畢,里面的信息大家根據(jù)實(shí)際需要自己更改.

          ??????? log.info("開始獲取db");
          ??????? //List articles=new ArticleManagerImpl().getCurrentNArticles(2);
          ??????? log.info("開始迭代");
          ??????
          ???????
          ??????? Iterator its = list.iterator();
          ??????? log.info("開始添加feed條目");
          ??????? while(its.hasNext())
          ??????? {
          ??????? ?Article art=(Article)its.next();
          ??????? ?log.info("在while內(nèi)部");
          ??????? entry = new SyndEntryImpl();
          ??????? entry.setTitle("\""+art.getTitle()+"\"");
          ??????? entry.setLink("Link is:"+art.getId()+"\"");
          ??????? try {
          ??????????? entry.setPublishedDate(DATE_PARSER.parse("2004-06-08"));
          ??????? }
          ??????? catch (ParseException ex) {
          ??????????? // IT CANNOT HAPPEN WITH THIS SAMPLE
          ??????? }
          ??????? description = new SyndContentImpl();
          ??????? description.setType("text/plain");
          ??????? description.setValue("The value is here:"+art.getTitle()); //set the content of this feed
          ??????? entry.setDescription(description);
          ??????? entries.add(entry);
          ??????? }

          ?

          ??????? feed.setEntries(entries);

          ??????? return feed;
          ??? }

          }

          然后在web.xml中配置這個Rss的訂閱地址
          The web.xml:
          <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
          <web-app>
          ??? <display-name>ROME Samples</display-name>

          ??? <servlet>
          ??????? <servlet-name>FeedServlet</servlet-name>
          ??????? <servlet-class>com.sun.syndication.samples.servlet.FeedServlet</servlet-class>
          ??????? <init-param>
          ??????????? <param-name>default.feed.type</param-name>
          ??????????? <param-value>rss_2.0</param-value>
          ??????? </init-param>
          ??? </servlet>

          ??? <servlet-mapping>
          ???????? <servlet-name>FeedServlet</servlet-name>
          ???????? <url-pattern>/feed</url-pattern>
          ervlet-mapping>

          </web-app>


          我的項(xiàng)目名稱為IQBoree,所以這個feed相應(yīng)的訂閱地址為:http://localhost:8080/IQBoree/feed


          2,自己生成一個xml文件,然后讓客戶來讀取這個xml文件


          生成xml文件:
          if (true) {
          ??????????? try {
          ??????????????? String feedType = "rss_1.0";
          ??????????????? String fileName = "rssTest2.xml";

          ??????????????? DateFormat dateParser = new SimpleDateFormat(DATE_FORMAT);

          ??????????????? SyndFeed feed = new SyndFeedImpl();
          ??????????????? feed.setFeedType(feedType);

          ??????????????? feed.setTitle("Sample Feed (created with Rome)");
          ??????????????? feed.setLink("??????????????? feed.setDescription("This feed has been created using Rome (Java syndication utilities");

          ??????????????? List entries = new ArrayList();
          ??????????????? SyndEntry entry;
          ??????????????? SyndContent description;

          ??????????????? entry = new SyndEntryImpl();
          ??????????????? entry.setTitle("Rome v1.0");
          ??????????????? entry.setLink("
          ??????????????? entry.setPublishedDate(dateParser.parse("2006-11-16"));
          ??????????????? description = new SyndContentImpl();
          ??????????????? description.setType("text/plain");
          ??????????????? description.setValue("Initial release of Rome");
          ??????????????? entry.setDescription(description);
          ??????????????? entries.add(entry);

          //以上九行可以用來添加一條feed,可以更具自己的需要多添加幾個,或者和第一種生成servlet的方法一樣來從數(shù)據(jù)庫讀取

          ??????????????? feed.setEntries(entries);

          ??????????????? Writer writer = new FileWriter(fileName);
          ??????????????? SyndFeedOutput output = new SyndFeedOutput();
          ??????????????? output.output(feed,writer);
          ??????????????? writer.close();

          ??????????????? System.out.println("The feed has been written to the file ["+fileName+"]");

          ??????????????? ok = true;
          ??????????? }
          ??????????? catch (Exception ex) {
          ??????????????? ex.printStackTrace();
          ??????????????? System.out.println("ERROR: "+ex.getMessage());
          ??????????? }
          ??????? }



          使用rom讀取rssUrl

          把jdom和rom包拷貝到lib目錄下。

          直接在jsp頁面上嵌入如下代碼:
          <%@ page language="java"
          import="java.util.*;
          import java.net.URL;
          import java.io.InputStreamReader;
          import com.sun.syndication.feed.synd.SyndFeed;
          import com.sun.syndication.io.SyndFeedInput;
          import com.sun.syndication.io.XmlReader;
          " pageEncoding="UTF-8"%>

          <%
          ? try {
          ??????????????? URL feedUrl = new URL("
          http://www.aygfsteel.com/crazycy/CommentsRSS.aspx");
          //上面是那個需要讀取的xml文件的存放地址,我這里找的是偶大哥的blog地址.

          ??????????????? SyndFeedInput input = new SyndFeedInput();
          ??????????????? SyndFeed feed = input.build(new XmlReader(feedUrl));

          //??????????????? System.out.println(feed);

          out.println(feed);

          //??????????????? ok = true;
          ??????????? }
          ??????????? catch (Exception ex) {
          ??????????????? ex.printStackTrace();
          ??????????????? System.out.println("ERROR: "+ex.getMessage());
          ??????????? }
          ?
          ? %>

          =============================================================================================
          使用javaBean:
          <%@page contentType="text/html"%>

          <%@page pageEncoding="UTF-8"%>
          <%@ page import="com.sun.syndication.feed.synd.SyndFeed" %>
          <%@ page import="com.sun.syndication.io.SyndFeedInput"%>
          <%@ page import="com.sun.syndication.io.XmlReader"%>

          <%@page import="java.net.*"%>
          <%@page import="java.util.Properties"%>
          <%@ page import="com.sun.syndication.feed.atom.Feed" %>
          <%@ page import="java.util.List" %>

          <html>

          <head>

          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

          <title>Sina News</title>

          </head>

          <body>

          <%

          ??????? System.out.println("Start...");
          ??????? String str ="http://www.aygfsteel.com/LittleRain/category/15573.html/rss";
          ??????? Properties prop = System.getProperties();
          ?????? // prop.put("http.proxyHost","10.10.10.11");??? //這里填寫代理的ip
          ??????? //prop.put("http.proxyPort","8080");

          ??????? boolean ok = false;
          ??????? try {????????

          ??????????? URL feedUrl = new URL(str);

          ??????????? SyndFeedInput input = new SyndFeedInput();

          ??????????? SyndFeed feed = input.build(new XmlReader(feedUrl));
          ?????????? ??? out.println("Author:"+feed.getAuthor()+"<br>");
          ??? ??? ??? out.println("Title:"+feed.getTitle()+"<br>");
          ??? ??? ??? out.println("Description:"+feed.getDescription()+"<br>");
          ??? ??? ???
          ??? ??? ??? 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);
          ??? ??? ??? //out.println(feed.get);
          ??? ??? ???
          ??? ??? ??? out.println(i+1+":");
          ??? ??? ??? out.println("<a href="+entry.getLink()+">"+entry.getTitle()+"</a>");
          ??? ??? ??? out.println(entry.getPublishedDate()+"<br>");
          ?????????? ??? }


          ??????????? ok = true;
          ??????? }
          ??????? catch (Exception ex) {
          ??????????? ex.printStackTrace();
          ??????????? System.out.println("ERROR: "+ex.getMessage());
          ??????? }


          ??????? if (!ok) {
          ??????????? System.out.println();
          ?????????? out.println("FeedReader reads and prints any RSS/Atom feed type.");
          ??????????? out.println("The first parameter must be the URL of the feed to read.");
          ??????????? System.out.println();
          ??????? }
          ??????
          ??? %>

          </body>

          </html>

          posted on 2006-11-15 14:05 小雨不打傘 閱讀(1625) 評論(3)  編輯  收藏 所屬分類: web學(xué)習(xí)心得

          評論

          # re: 輕松為自己的網(wǎng)站添加Rss功能[未登錄] 2012-01-01 05:15 筱筱

          很好的,很有用,可是有些名詞還是看不懂  回復(fù)  更多評論   

          # re: 輕松為自己的網(wǎng)站添加Rss功能[未登錄] 2012-01-01 05:16 筱筱網(wǎng)賺論壇

          寫的很不錯,真的有用  回復(fù)  更多評論   

          # re: 輕松為自己的網(wǎng)站添加Rss功能 2014-08-19 11:46 北京銀聯(lián)POS機(jī)辦理中心

          1574900360@qq.com
          http://bjylposjfwzx.kuaizhan.com
          辦理各種費(fèi)率pos機(jī):快速收單中,當(dāng)天下機(jī)!
          0.38%,0.4%,0.5%,0.78%,26,30,35封頂POS機(jī)火熱辦理當(dāng)中,0.49%帶積分MPOS快速預(yù)定中!bjylposjfwzx.kuaizhan.com
          另有實(shí)時到賬POS:3到5分鐘秒到帳,不分周末及節(jié)假日,晚上12點(diǎn)之前均可到賬,絕對帶積分公司、個人、個體戶均可!
            回復(fù)  更多評論   

          公告

          點(diǎn)擊這里給我發(fā)消息 QQ:232720563


            MSN:new_haihua@hotmail.com

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(2)

          隨筆分類(51)

          最新隨筆

          積分與排名

          最新評論

          閱讀排行榜

          主站蜘蛛池模板: 隆尧县| 常德市| 临桂县| 乐陵市| 岢岚县| 双鸭山市| 连江县| 华宁县| 肥乡县| 古交市| 邵武市| 满洲里市| 五家渠市| 郸城县| 吉首市| 淮安市| 玛纳斯县| 加查县| 宁城县| 墨竹工卡县| 永济市| 谷城县| 绥阳县| 敖汉旗| 闽清县| 商河县| 甘泉县| 永登县| 九台市| 文成县| 灵川县| 玉溪市| 于田县| 榕江县| 梅州市| 常宁市| 无锡市| 嘉义市| 慈利县| 东乌珠穆沁旗| 乐昌市|