使用FreeMarker/Jsp(WebWork2) 生成靜態/動態RSS檔案
scud(飛雲小俠) http://www.jscud.com 轉載請註明作者/來源關鍵字:rss,freemarker,rss.xml,webwork2RSS在網路上大行其道,各種網站都加上RSS支援,我最近也研究了一下,給我的文章也加上了RSS訂閱.RSS目前用的也有幾個版本,很是混亂,下面以RSS2.0為例來說明.網路上有個rsslibj庫,是用來生成rss支援檔案的,不過已經好久沒有更新了,它是用xml的方式生成的.本文的例子不用到任何xml解析器,不過當然要知道最後生成的XML檔案的格式才行,關於RSS規範,可以瀏覽一下 http://blogs.law.harvard.edu/tech/rss .在計劃生成RSS檔案的時候,順便搜尋了一下JIRA和Confluence的程式,發現它們分別是用模板方式和JSP動態頁面來展示的.於是我也想到兩種方式:
1.用FreeMarker生成靜態檔案,適用於更新不是很頻繁的內容.
2.用JSP動態展示,適合更新頻率高,種類繁多的內容.還是以本站的新聞舉例,其中的新聞資訊類參考 http://www.jscud.com/srun/news/viewhtml/3_2005_8/76.htm ,此處不在列出.(一) 先說FreeMarker方式.根據RSS的規範,得到模板如下:<?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>其中的網址和網站名稱可以根據自己的實際情況修改.我每次取出最新的20條文章來生成RSS,不過內容比較多,生成的RSS檔案比較大,看到有的網站的description只是放了文章摘要的內容,這樣檔案就小多了.總之是根據自己的需求設計吧.其中用到的RssUtil函式庫的函式如下(日期的函式參考上一篇文章):
/**
* 把]]>替換為]]>
* @param content 內容
* @return 格式化後的內容
*/
public static String formatRssCData(String content)
{
String result = StringFunc.replace(content,'\\]\\]>',']]>');
return result;
}
/**
* 格式化為xml需要的字串
* @param field 內容
* @return 格式化後的串
*/
public static String formatString2XML(String field)
{
return StringFunc.str2TextXML(field);
}
public static String getNowDateTime()
{
return formatRssDate(DateTime.getNowTimestamp());
}
利用FreeMarker生成靜態檔案的程式碼如下: 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;
}
新聞系統中呼叫重新生成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;
}
在增加或者更新/刪除新聞的地方需要呼叫這個renewRSS函式.(二)JSP動態方式相對靜態方式而言,簡單的多,不過效率上可能就不太好了.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的使用 :)
上面的類裡面引用了很多其他的工具類,這裡不一一列出,可以自己實現它們,都是很簡單的類. :)
相關文章
- php生成靜態檔案PHP
- freemarker根據靜態模板和動態模板生成PDF與Word
- cmake:生成靜態庫和動態庫
- Java使用FreeMarker模版技術動態生成word實踐Java
- Sanic 靜態檔案
- 啟動靜態檔案中介軟體
- freemarker 生成前端檔案前端
- nginx偽靜態檔案Nginx
- 靜態庫生成
- 如何使用 Python 或 Bash動態生成 Jekyll 配置檔案Python
- nginx靜態檔案快取Nginx快取
- Django靜態檔案輸出Django
- 靜態引數檔案配置
- 將動態aspx頁面,儲存為靜態htm檔案 (轉)
- VS下生成與配置靜態庫與動態庫(一)
- 我是如何使用freemarker生成Word檔案的?
- 偽靜態、靜態和動態的區別
- Linux 依賴動態庫 / 靜態庫的動態態庫 / 靜態庫Linux
- LNMP–配置靜態檔案快取LNMP快取
- nginx 只快取靜態檔案Nginx快取
- 7、靜態檔案的載入
- .NET 中的動態編譯(生成exe檔案)編譯
- php 生成靜態頁面PHP
- PHP生成靜態頁面PHP
- Golang1.16 使用embed載入靜態檔案Golang
- 《Flask 入門教程》第 4 章:使用靜態檔案Flask
- 簡單C#生成靜態及相關讀取模板檔案C#
- CE的使用及靜態地址與動態地址
- linux靜態庫的生成與使用(轉)Linux
- 靜態庫和動態庫的製作以及Bundle資原始檔的使用
- 一、靜態庫和動態庫,Makefile專案管理專案管理
- 靜態代理和動態代理
- 靜態路由和動態路由路由
- oracle 監聽 靜態 動態Oracle
- 靜態庫與動態庫
- JAVA 靜態代理 & 動態代理Java
- 動靜態庫
- 用Main方法呼叫freemarker生成檔案AI