诸神的博客
诸神
我的首页
文章
相册
圈子
留言
管理
 
    当前所在页面:首页>>文章>>策略模式+forward的统一样式输出
策略模式+forward的统一样式输出
    作者:stef_wu 来源: 发表时间:2007-12-18

 
 

有时会遇到需要统一输出的Action,比如Rss,比如Chart,都是使用同一个输出模板或者一种输出方式,这种情况下,我喜欢创建一个专门的输出Action,然后使用策略模式+EasyJWeb的forward跳转来完成统一的输出。
下面以一个简单的Rss做例子:
Rss要求,统一的输出格式,能对不同的内容完成不同的数据填充方式,比如文章,比如blog文章,比如产品等等,并且需要能通过配置来统一完成Link的站点配置。
首先,创建一个IRssService来统一完成页面数据的装配:
public interface IRssService {

 static final String RSS_SERVICE_OBJ = "rss_service_obj";

 void setTransfer(IObj2RssObj transfer);

 void setResult(List<Object> objs);

 List<RssObj> getResult();

 void setSiteUrl(String siteUrl);
}
然后是对应的一条Rss内容的包装对象,这里很简单的只提供了title,description和link:
public class RssObj {

 private String title;

 private String link;

 private String description;

 private Date pubDate;

 public final String getTitle() {
  return title;
 }

 public final void setTitle(String title) {
  this.title = title;
 }

 public final String getLink() {
  return link;
 }

 public final void setLink(String link) {
  this.link = link;
 }

 public final String getDescription() {
  if (description != null && !"".equals(description)) {
   description = description.replaceAll("<[^>]*>", "");
   description = description.replaceAll("&[^>]*;", "");
  }
  return description;
 }

 public final void setDescription(String description) {
  this.description = description;
 }

 public final Date getPubDate() {
  return pubDate;
 }

 public final void setPubDate(Date pubDate) {
  this.pubDate = pubDate;
 }

}
其中简单的过滤了一下HTML标签。
IObj2RssObj接口用于表示怎么将一个对象转换为RssObj:
该接口为:
public interface IObj2RssObj {

 RssObj toRssObj(Object obj);

 void setSiteUrl(String siteUrl);
}
然后简单的实现IRssService:
public class RssServiceImpl implements IRssService {

 private IObj2RssObj transfer;

 private List<Object> resource;

 private String siteUrl;

 public final String getSiteUrl() {
  return siteUrl;
 }

 public final void setSiteUrl(String siteUrl) {
  this.siteUrl = siteUrl;
 }

 public List<RssObj> getResult() {
  transfer.setSiteUrl(getSiteUrl());
  List<RssObj> rssObjs = new ArrayList<RssObj>();
  if (resource != null && resource.size() > 0) {
   for (Object o : resource) {
    rssObjs.add(transfer.toRssObj(o));
   }
  }
  return rssObjs;
 }

 public void setResult(List<Object> objs) {
  this.resource = objs;
 }

 public void setTransfer(IObj2RssObj transfer) {
  this.transfer = transfer;
 }

 public final IObj2RssObj getTransfer() {
  return transfer;
 }

 public RssServiceImpl() {

 }

 public RssServiceImpl(IObj2RssObj transfer, List<Object> resource) {
  super();
  this.transfer = transfer;
  this.resource = resource;
 }

}
现在完成统一输出Action:
public class RssGenerAction extends AbstractCmdAction {

 @Inject
 private WebSiteConfig siteConfig;

 public Page doInit(WebForm form, Module module) {
  return null;
 }

 public Page doGener(WebForm form, Module module) {
  IRssService service = (IRssService) form
    .get(IRssService.RSS_SERVICE_OBJ);
  if (service != null) {
   service.setSiteUrl(siteConfig.getRssSiteUrl());
   form.addResult("list", service.getResult());
  }
  Page page = new Page("/cms/rss.xml");
  page.setContentType("xml");
  return page;
 }

 public final WebSiteConfig getSiteConfig() {
  return siteConfig;
 }

 public final void setSiteConfig(WebSiteConfig siteConfig) {
  this.siteConfig = siteConfig;
 }

}
到此,基础的输出框架已经完成,
现在来看看怎么讲一个NewsDoc输出:
public class NewsDoc2RssObj implements IObj2RssObj {

 private String siteUrl;

 public void setSiteUrl(String siteUrl) {
  this.siteUrl = siteUrl;
 }

 public RssObj toRssObj(Object obj) {
  NewsDoc doc = (NewsDoc) obj;
  RssObj rss = new RssObj();
  if (doc != null) {
   rss.setTitle(doc.getTitle());
   rss.setLink("http://" + this.siteUrl
     + "/newsDocManage.ejf?cmd=show&&id=" + doc.getId());
   rss.setPubDate(doc.getInputTime());
   rss.setDescription(doc.getContent());
  }
  return rss;
 }
}
首先创建NewsDoc的转换器;
然后再NewsDoc的action里面加入方法:
public Page doRss(WebForm form, Module module) {
  NewsDocQueryObject qo = new NewsDocQueryObject();
  qo.setPageSize(100);
  form.toPo(qo);
  form.getTextElement().put(IRssService.RSS_SERVICE_OBJ, new RssServiceImpl(new NewsDoc2RssObj(),this.cmsManageService.getNewsDocBy(qo).getResult()));
  return forward("rss.gener");
 }
就完成了NewsDoc的Rss输出,而且可以随意的控制查询条件等等。
比如要输出blog文章的rss,也只需要创建BlogDoc2RssObj对象,然后查询,统一跳转就完成了。
不需要在每个要输出Rss的地方都去重复的控制输出。
 
同样,象Chart图的输出,也可以这样控制,让各个方法将要输出的内容放入TestElements里面,然后跳转统一输出。
比如:
public Page doRender(WebForm form, Module module) {
  ChartObject co = (ChartObject) form.get(EJFChartFactory.EASYJWEB_CHART);
  if (co != null) {
   HttpServletResponse response = ActionContext.getContext()
     .getResponse();
   response.setContentType("image/jpeg");
   response.setHeader("Pragma", "No-cache");
   response.setHeader("Cache-Control", "no-cache");
   response.setDateHeader("Expires", 0);
   try {
    ChartUtilities.writeChartAsJPEG(response.getOutputStream(), co
      .getChart(), co.getWidth(), co.getHeight());
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  return null;
 }

 
 

(阅读 )   评论数(:1)
评论】 【收藏】
评论:共1条
不错,这样确实要方便很多。
评论人: 天一     评论时间: 2007-12-18 13:08:52

发表评论:
发表人:
评论: 
验证码:
请输入前面图中的四位验证码,字母不区分大小写
  
 
关于我们 | 诚聘英才 | 联系我们 | 广告业务 | 网站地图 | 法律声明

EasyJF开源团队版权所有  建议使用1024*768分辨率