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"); } }