Rss,Atom,基本上是Web2.0的基本特征,今天終于有時間決定實現一下。對于動態的Rss,Atom其實就是選取最新的內容,迭迨一下生成一個固定格式的xml文件就可以了。其實也很簡單。
?????? 我用webwork2,用freemarker做模版,在網上找了一個標準的Rss2.0格式就生成我的模版文件rss.ftl
<?xml?version="1.0"?encoding="UTF-8"?>
<rss?version="2.0">
<channel>
<title><![CDATA[我的小站]]></title>
<link>http://leaf.jdk.cn/</link>
<description><![CDATA[泡出好心情,泡出好技術]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright?2006?PaoPao?v4.0]]></copyright>
<webMaster><![CDATA[rory.cn@gmail.com?(Rory?Ye)]]></webMaster>
<generator>PaoPao?v4.0</generator>?
????<image>
????????<title>我的小站</title>?
????????<url>http://leaf.jdk.cn/logo.gif</url>?
????????<link>http://leaf.jdk.cn</link>?
????????<description>莫多泡泡2006</description>?
????</image>
????<#list?blogs?as?blog>
????<item>
????????<link>http://leaf.jdk.cn/entry.action?entryId=${blog.id}</link>
????????<title><![CDATA[${blog.title}]]></title>
????????<author>${blog.authorMail}(${blog.author})</author>
????????<category><![CDATA[?${blog.categories}?]]></category>
????????<pubDate>${blog.pubDate}</pubDate>
????????<guid>http://leaf.jdk.cn/entry.action?id=${blog.id}</guid>????
????????<description><![CDATA[${blog.content}]]></description>
????</item>
????</#list>
</channel>
</rss> 我在rss.action里面去取blogs就可以了。
????public?String?execute()?throws?Exception?{
????????PaginationSupport?ps?=?blogManager.getBlogsByPage(0);
????????blogs?=?new?ArrayList();
????????
????????for(Iterator?ite?=?ps.getItems().iterator();?ite.hasNext();){
????????????Blog?blog?=?(Blog)ite.next();
????????????WrapRssBlog?wrapBlog?=?new?WrapRssBlog();
????????????wrapBlog.setId(blog.getId());
????????????wrapBlog.setAuthor(blog.getAuthor().getNickname());
????????????wrapBlog.setAuthorMail(blog.getAuthor().getMail());
????????????wrapBlog.setTitle(blog.getTitle());
????????????wrapBlog.setContent(StringUtil.extractText(blog.getContent()));
????????????wrapBlog.setPubDate(DateUtil.formatRssDate(blog.getPostTime()));
????????????StringBuffer?sb?=?new?StringBuffer();
????????????for(Iterator?ite2?=?blog.getCategories().iterator();?ite2.hasNext();){
????????????????Category?cate?=?(Category)?ite2.next();
????????????????sb.append("?")
??????????????????.append(cate.getName());
????????????}
????????????wrapBlog.setCategories(sb.toString());
????????????blogs.add(wrapBlog);
????????}
????????return?super.execute();
????}
這里把blog包裝了一下,主要是處理了一下日期,內容,還有把分類拼成字符串。關于日期的處理,參考了飛云小俠寫的rss日期的研究。實現代碼如下。
????public?static?String?formatRssDate(Date?date){
????????SimpleDateFormat?sdf?=?new?SimpleDateFormat("EEE,?d?MMM?yyyy?HH:mm:ss?z",Locale.US);
????????//TODO?TimeZone
????????SimpleTimeZone?zone?=?new?SimpleTimeZone(8,"GMT");
????????sdf.setTimeZone(zone);
????????return?sdf.format(date);
????}
這樣就得到了這樣的日期
Thu, 6 Apr 2006 16:01:36 GMT
做好了這些,配置一下action
????????<action?name="rss"?class="cn.jdk.leaf.action.RssAction">????????
????????????<result?name="success"?type="freemarker">/WEB-INF/pages/rss.ftl</result>
????????</action>
不過像這樣配置的話,你訪問
http://xxx.xxx.com/rss.action看到的不是一個xml
因為返回結果的contentType是text/html.而不是xml,這樣是不行的??戳艘幌聎ebwork源碼。原來可以這樣簡單的解決。改成這樣配置就可以了。
????????<action?name="rss"?class="cn.jdk.leaf.action.RssAction">
????????????<result?name="success"?type="freemarker">
????????????????<param?name="location">/WEB-INF/pages/rss.ftl</param>
????????????????<param?name="contentType">application/xml</param>
????????????</result>
????????</action>
簡單吧。其實你還可以把這個contentType改成其他類型的。比如excle的。這樣用戶執行就可以得到一個xls文件。哈哈。
posted on 2006-04-10 22:40
莫多 閱讀(1336)
評論(2) 編輯 收藏 所屬分類:
Webwork