package com.norteksoft.product.web.struts2;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
/**
* Struts2中典型CRUD Action的抽象基类.
*
* 主要定义了对Preparable,ModelDriven接口的使用,以及CRUD函数和返回值的命名.
*
* @param <T> CRUDAction所管理的对象类型.
*
*/
@SuppressWarnings("serial")
public abstract class CrudActionSupport<T> extends ActionSupport implements ModelDriven<T>, Preparable {
/**
* 进行增删改操作后,以redirect方式重新打开action默认页的result名.
*/
public static final String RELOAD = "reload";
private Log logger = LogFactory.getLog(getClass());
// CRUD函数 //
/**
* Action函数,新增或修改Entity.
* 建议return RELOAD.
*/
public abstract String save() throws Exception;
/**
* Action函数,删除Entity.
* 建议return RELOAD.
*/
public abstract String delete() throws Exception;
/**
* Action函数, 默认的action函数, 默认调用list()函数.
*/
@Override
public String execute() throws Exception {
return list();
}
/**
* Action函数,显示Entity列表界面.
* 建议return SUCCESS.
*/
public abstract String list() throws Exception;
/**
* Action函数,显示新增或修改Entity界面.
* 建议return INPUT.
*/
@Override
public abstract String input() throws Exception;
// Preparable函数 //
/**
* 实现空的prepare()函数,屏蔽所有Action函数公共的二次绑定.
*/
public void prepare() throws Exception {
}
/**
* 在input()前执行二次绑定.
*/
public void prepareInput() throws Exception {
prepareModel();
}
/**
* 在save()前执行二次绑定.
*/
public void prepareSave() throws Exception {
prepareModel();
}
/**
* 等同于prepare()的内部函数,供prepardMethodName()函数调用.
*/
protected abstract void prepareModel() throws Exception;
/**
* 绕过Template,直接输出内容的简便函数.
*/
protected String render(String text, String contentType) {
try {
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType(contentType);
response.getWriter().write(text);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return null;
}
/**
* 直接输出字符串.
*/
protected String renderText(String text) {
return render(text, "text/plain;charset=UTF-8");
}
/**
* 直接输出script,可以用于jsonp
* @param text
* @return
*/
protected String renderScript(String text){
return render(text, "text/script;charset=UTF-8");
}
/**
* 直接输出HTML.
*/
protected String renderHtml(String html) {
return render(html, "text/html;charset=UTF-8");
}
/**
* 直接输出XML.
*/
protected String renderXML(String xml) {
return render(xml, "text/xml;charset=UTF-8");
}
}