WebWork的result实现非常实用,它很好的解决了View渲染的灵活性问题。这才是MVC模式的优势所在,而像JSF那样帮定JSP的MVC就吃不到这个甜头了。说WebWork2是Model 2 MVC的巅峰就在这些灵活的地方。
闲扯这个不是主要目的。现在Rome是Java下最常用的RSS包,最近消息似乎要转入Apache的Abdera合并变成更强大的聚合引擎。用Rome生成和解析RSS都很方便。今天讨论一下使用ROME给网站生成RSS,并通过WebWork2的Result机制渲染。
最初是从WebWork的Cookbook上看到的RomeResult的文章,一看就会,我这里其实不过是举个详细点的例子,注意我使用的是WebWork 2.2.2和Rome 0.8:
http://wiki.opensymphony.com/display/WW/RomeResult
参考了和东的这篇Blog,利用rome写rss feed生成程序:
http://hedong.3322.org/newblog/archives/000051.html
首先创建RomeResult类:
代码
-
-
-
- package com.goldnet.framework.webwork.result;
-
- import java.io.Writer;
-
- import org.apache.log4j.Logger;
-
- import com.opensymphony.webwork.ServletActionContext;
- import com.opensymphony.xwork.ActionInvocation;
- import com.opensymphony.xwork.Result;
- import com.sun.syndication.feed.synd.SyndFeed;
- import com.sun.syndication.io.SyndFeedOutput;
-
-
-
-
-
-
- public class RomeResult implements Result {
- private static final long serialVersionUID = -6089389751322858939L;
-
- private String feedName;
-
- private String feedType;
-
- private final static Logger logger = Logger.getLogger(RomeResult.class);
-
-
-
-
-
-
- public void execute(ActionInvocation ai) throws Exception {
- if (feedName == null) {
-
- logger
- .error("Required parameter 'feedName' not found. "
- + "Make sure you have the param tag set and "
- + "the static-parameters interceptor enabled in your interceptor stack.");
-
- return;
- }
-
-
- ServletActionContext.getResponse().setContentType("text/xml");
-
- SyndFeed feed = (SyndFeed) ai.getStack().findValue(feedName);
-
- if (logger.isDebugEnabled()) {
- logger.debug("Found object on stack with name '" + feedName + "': "
- + feed);
- }
- if (feed != null) {
-
- if (feedType != null) {
-
-
-
-
- feed.setFeedType(feedType);
- }
- SyndFeedOutput output = new SyndFeedOutput();
-
- Writer out = null;
- try {
- out = ServletActionContext.getResponse().getWriter();
- output.output(feed, out);
- } catch (Exception e) {
-
- logger.error("Could not write the feed", e);
- } finally {
-
- if (out != null) {
- out.close();
- }
- }
-
- } else {
-
- logger.error("Did not find object on stack with name '" + feedName
- + "'");
- }
- }
-
- public void setFeedName(String feedName) {
- this.feedName = feedName;
- }
-
- public void setFeedType(String feedType) {
- this.feedType = feedType;
- }
-
- }
程序很简单。实现了Result接口,寻找一个与feedName参数匹配的SyndFeed实例,然后转换为指定的feedType类型,然后通过rome的SyndFeedOutput输出到Response去。
然后我们给我们的WebWork配置romeResult。
在xwork.xml中配置:
代码
- <package name="default" extends="webwork-default">
- <result-types>
- <result-type name="feed" class="com.goldnet.framework.webwork.result.RomeResult"/>
- </result-types>
- <interceptors>
-
这样我们就给xwork配置了一个叫做feed的result,它就是我们的romeResult。
然后我们实现一个类,来测试一下这个romeResult。
代码
真是不好意思,Getter/Setter占了大部分地方我省略去了。逻辑很简单,就是把我们的POJO影射到Feed的模型上面,过程很简单。我留下了几个参数可以在外面设置:
maxEntryNumber显示的feed的条数,链接生成时使用的SiteUrl,当然也可以通过request获取。
下面我们配置我们的Action,注意平时我们可能使用DAO生成newsList,而不是我这个写死的getNewsList()方法,此时可能需要配合Spring进行IOC的设置,我们这里省略掉。
下面是我们这个Action的xwork配置:
代码
- <package name="news" extends="default" namespace="/news">
- <action name="feed" class="com.goldnet.webwork.action.news.TestFeedCreateAction">
-
- <param name="maxEntryNumber">15</param>
-
- <param name="siteUrl">http://127.0.0.1:7001</param>
-
- <result name="success" type="feed">
-
- <param name="feedName">feed</param>
-
-
- <param name="feedType">rss_2.0</param>
- </result>
- </action>
- </package>
OK,配置完毕后访问/news/feed.action就可以访问到这个feed了。倒入你的feedDeamon,看看,是不是非常简单?
不过需要考虑两个地方,一个是编码问题,看了和东说的中文问题,本没当回事,结果生成乱码(我们项目全部使用UTF-8),然后还是转了一下。没有研究ROME源代码,感觉xml不应该有UTF-8还会乱码的问题呀,也许还需要看看是否是设置不到位。还有就是对于feed如果增加了权限认证则访问比较麻烦,用feedDeamon这样的客户端就无法访问到了,因为它不会显示登陆失败后显示的登陆页面,也许放feed就要开放一点吧(当然还是有变通放案的)。
和动例子里面的rome 0.7和现在的rome 0.8相比,Api已经发生了不少变化,唉,开源要代码稳定还真难。
就这些,就到这里,粗陋了:D
摘自:http://www.javaeye.com/post/125096