有时会遇到需要统一输出的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;
}