<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    使用FreeMarker/Jsp(webwork)生成靜態(tài)/動態(tài)RSS文件

    scud(飛云小俠)  http://www.jscud.com 轉(zhuǎn)載請注明作者/來源

    關(guān)鍵字:rss,freemarker,rss.xml,webwork2

    RSS在網(wǎng)絡上大行其道,各種網(wǎng)站都加上RSS支持,我最近也研究了一下,給我的文章也加上了RSS訂閱.

    RSS目前用的也有幾個版本,很是混亂,下面以RSS2.0為例來說明.

    網(wǎng)絡上有個rsslibj庫,是用來生成rss支持文件的,不過已經(jīng)好久沒有更新了,它是用xml的方式生成的.本文的例子不用到任何xml解析器,不過當然要知道最后生成的XML文件的格式才行,關(guān)于RSS規(guī)范,可以瀏覽一下 http://blogs.law.harvard.edu/tech/rss .

    在計劃生成RSS文件的時候,順便搜索了一下JIRA和Confluence的程序,發(fā)現(xiàn)它們分別是用模板方式和JSP動態(tài)頁面來展示的.于是我也想到兩種方式:
    1.用FreeMarker生成靜態(tài)文件,適用于更新不是很頻繁的內(nèi)容.
    2.用JSP動態(tài)展示,適合更新頻率高,種類繁多的內(nèi)容.

    還是以本站的新聞舉例,其中的新聞信息類參考 http://www.jscud.com/srun/news/viewhtml/3_2005_8/76.htm ,此處不在列出.

    (一) 先說FreeMarker方式.

    根據(jù)RSS的規(guī)范,得到模板如下:

    <?xml version="1.0" encoding="UTF-8" ?>
     <rss version="2.0">
     <channel>
      <title>JScud Develop</title>
      <link>http://www.jscud.com/</link>
      <language>zh-cn</language>
      <description >JScud Develop By Scud</description>
      <webMaster>xxx@21cn.com(scud)</webMaster>
      <lastBuildDate>${rssutil.formatRssDate(now)}</lastBuildDate>
       
       <#list newslist as onenews>
      <item>
       <title>${onenews.title?xml}</title>
       <link>http://www.jscud.com/srun/news/viewhtml/${onenews.htmlFilePath}/${onenews.nid}.htm</link>
       <pubDate>${rssutil.formatRssDate(onenews.addtime)}</pubDate>
       <description><![CDATA[
      ${rssutil.formatRssCData(onenews.showContent)}
       ]]>
       </description>
       </item>
     </#list>
      </channel>
     </rss>

    其中的網(wǎng)址和網(wǎng)站名稱可以根據(jù)自己的實際情況修改.

    我每次取出最新的20條文章來生成RSS,不過內(nèi)容比較多,生成的RSS文件比較大,看到有的網(wǎng)站的description只是放了文章摘要的內(nèi)容,這樣文件就小多了.總之是根據(jù)自己的需求設計吧.

    其中用到的RssUtil函數(shù)庫的函數(shù)如下(日期的函數(shù)參考上一篇文章):

        /**
         * 把]]>替換為]]&gt;
         * @param content 內(nèi)容
         * @return 格式化后的內(nèi)容
         */
        public static String formatRssCData(String content)
        {
            String result = StringFunc.replace(content,"\\]\\]>","]]&gt;");
           
            return result;
        }
       
        /**
         * 格式化為xml需要的字符串
         * @param field 內(nèi)容
         * @return 格式化后的串
         */
        public static String formatString2XML(String field)
        {
            return StringFunc.str2TextXML(field);
        }
       
        public static String getNowDateTime()
        {
            return formatRssDate(DateTime.getNowTimestamp());
        }

    利用FreeMarker生成靜態(tài)文件的代碼如下:

     private Configuration freemarker_cfg = null;
     
        protected Configuration getFreeMarkerCFG()
        {
            if (null == freemarker_cfg)
            {
                // Initialize the FreeMarker configuration;
                // - Create a configuration instance
                freemarker_cfg = new Configuration();

                freemarker_cfg.setClassForTemplateLoading(this.getClass(), "/htmlskin");

                freemarker_cfg.setDefaultEncoding("GBK");
            }

            return freemarker_cfg;
        }

        public boolean geneFileByFreeMarker(String templateFileName, Map propMap, String filePath,
                        String fileName, String encode)
        {
            try
            {
                Template t = getFreeMarkerCFG().getTemplate(templateFileName);

                File afile = new File(filePath + "/" + fileName);

                Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(afile),
                                encode));

                propMap.put("baseurl", PropSet.getStringProp("url.root"));

                t.process(propMap, out);
            }
            catch (TemplateException e)
            {
                LogMan.error("Error while processing FreeMarker template " + templateFileName, e);
                return false;
            }
            catch (IOException e)
            {
                LogMan.error("Error while generate File " + fileName, e);
                return false;
            }

            return true;
        }


    新聞系統(tǒng)中調(diào)用重新生成RSS文件的代碼如下:

        /**
         * 重新生成RSS文件.
         *
         * @param nid 更新的新聞的id,如果不包含在最新的新聞里,則不更新RSS.nid <1則更新
         *
         * @return 是否成功
         */
        private boolean renewRSS(int nid)
        {
            List newsList = 裝載新聞的代碼

            boolean shouldUpdate = false;
            if (nid > 0)
            {
                for (int i = 0; i < newsList.size(); i++)
                {
                    NewsItem aNews = (NewsItem) newsList.get(i);
                    if (aNews.getNid() == nid)
                    {
                        shouldUpdate = true;
                        break;
                    }
                }
            }
            else
            {
                shouldUpdate = true;
            }

            //不更新,則返回
            if (!shouldUpdate)
            {
                return true;
            }

            Map root = new HashMap();
           
            root.put("rssutil",new RSSUtil());

            root.put("newslist", newsList);
           
            root.put("now",DateTime.getNowTimestamp());

            geneFileByFreeMarker("/news/rss.ftl", root, PropSet.getStringProp("rss.rssdir"), PropSet
                            .getStringProp("rss.rssfile"), "UTF-8");

            return true;
        }



    在增加或者更新/刪除新聞的地方需要調(diào)用這個renewRSS函數(shù).

    (二)JSP動態(tài)方式

    相對靜態(tài)方式而言,簡單的多,不過效率上可能就不太好了.

    webwork2的Action代碼如下:

            newsList = 裝載新聞代碼
            return SUCCESS; 


    視圖Jsp如下:


    <%@ page contentType="text/xml; charset=UTF-8"%>
    <%@ taglib uri="jscud" prefix="jscud" %>
    <%@ taglib uri="webwork" prefix="ww" %>
    <ww:bean name="’com.jscud.www.util.RSSUtil’" id="rssUtil" />
    <?xml version="1.0" encoding="UTF-8" ?>
     <rss version="2.0">
     <channel>
      <title>JScud Develop</title>
      <link>http://www.jscud.com/</link>
      <language>zh-cn</language>
      <description >JScud Develop By Scud</description>
      <webMaster>xxx@21cn.com(scud)</webMaster>
      <lastBuildDate><ww:property value="#rssUtil.nowDateTime" /></lastBuildDate>
       
       <ww:iterator value="newsList">
      <item>
       <title><ww:property value="#rssUtil.formatString2XML(title)"/></title>
       <link>http://www.jscud.com/srun/news/viewhtml/<ww:property  value="htmlFilePath" />/<ww:property  value="nid" />.htm</link>
       <pubDate><ww:property  value="#rssUtil.formatRssDate(addtime)" /></pubDate>
       <description><![CDATA[
      <ww:property value="#rssUtil.formatRssCData(showContent)"/>
       ]]>
       </description>
       </item>
     </ww:iterator>
      </channel>
     </rss>

    jsp的方式簡單多了,上面的jsp里面還演示了ww:bean的使用 :)


    上面的類里面引用了很多其他的工具類,這里不一一列出,可以自己實現(xiàn)它們,都是很簡單的類. :)

    posted on 2005-08-19 14:11 Scud(飛云小俠) 閱讀(1132) 評論(0)  編輯  收藏 所屬分類: Java

    <2005年8月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    導航

    統(tǒng)計

    公告

    文章發(fā)布許可
    創(chuàng)造共用協(xié)議:署名,非商業(yè),保持一致

    我的郵件
    cnscud # gmail


    常用鏈接

    留言簿(15)

    隨筆分類(113)

    隨筆檔案(103)

    相冊

    友情鏈接

    技術(shù)網(wǎng)站

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲最新视频在线观看| 69堂人成无码免费视频果冻传媒| 四虎www成人影院免费观看| 久久亚洲AV成人出白浆无码国产| 久章草在线精品视频免费观看| 国产精品亚洲片在线| 久久免费动漫品精老司机 | 日韩免费无砖专区2020狼| 亚洲人成人无码.www石榴| 在线免费观看毛片网站| 天天综合亚洲色在线精品| 亚洲成a人片在线观看久| 亚洲免费在线观看| 亚洲一区二区成人| 永久免费AV无码国产网站| www亚洲精品久久久乳| 久久亚洲2019中文字幕| 91福利免费网站在线观看| 亚洲av丰满熟妇在线播放| 久久国内免费视频| 色屁屁在线观看视频免费| 亚洲国产婷婷六月丁香| 99视频全部免费精品全部四虎| 2020天堂在线亚洲精品专区| 国产伦精品一区二区三区免费迷| 国产免费播放一区二区| 亚洲毛片无码专区亚洲乱| 国产又长又粗又爽免费视频 | 波多野结衣在线免费观看| 亚洲成av人片天堂网无码】| 国产中文在线亚洲精品官网| 毛片免费全部播放无码| 男男黄GAY片免费网站WWW| 亚洲国产精品乱码一区二区 | 中国国产高清免费av片| 亚洲13又紧又嫩又水多| 亚洲国产成人精品91久久久 | 热99re久久免费视精品频软件| WWW免费视频在线观看播放| 亚洲制服丝袜一区二区三区| 免费一级毛片正在播放|