📄 strutsentityaction.java
字号:
package org.langsin.core.web;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessages;
import org.langsin.core.dao.EntityDao;
import org.langsin.core.exception.BusinessException;
import org.langsin.core.utils.BeanUtils;
import org.langsin.core.utils.GenericsUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils;
/**
* 负责单个实体的CRUD操作的基类
*
* @author 不落的太阳
*
*/
@SuppressWarnings("unchecked")
public abstract class StrutsEntityAction<T, M extends EntityDao<T>> extends StrutsAction implements InitializingBean {
protected static final String LIST = "list";
protected static final String EDIT = "edit";
protected static final String VIEW = "view";
protected Class<T> entityClass; // Action所管理的Entity类型.
protected Class idClass; // Action所管理的Entity的主键类型.
protected String idName; // Action所管理的Entity的主键名.
private M entityManager; // Action管理Entity所用的manager.
/**
* 取得entityClass的函数. JDK1.4不支持泛型的子类可以抛开Class<T> entityClass,重载此函数达到相同效果。
*/
protected Class<T> getEntityClass() {
return entityClass;
}
/**
* 获得EntityManager类进行CRUD操作,可以在子类重载.
*/
protected M getEntityManager() {
Assert.notNull(entityManager);
return entityManager;
}
/**
* Init回调函数
*/
public void afterPropertiesSet() {
entityClass = GenericsUtils.getSuperClassGenricType(getClass());
List<Field> fields = BeanUtils.getFieldsByType(this, GenericsUtils.getSuperClassGenricType(getClass(), 1));
Assert.isTrue(fields.size() == 1);
try {
entityManager = (M) BeanUtils.forceGetProperty(this, fields.get(0).getName());
Assert.notNull(entityManager);
} catch (Exception e) {
ReflectionUtils.handleReflectionException(e);
}
try {
idName = entityManager.getIdName(entityClass);
idClass = BeanUtils.getPropertyType(entityClass, idName);
} catch (Exception e) {
ReflectionUtils.handleReflectionException(e);
}
}
/**
* 显示的初始方法
*
* @param mapping
* @param form
* @param request
* @param response
* @return
*/
public ActionForward index(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
return list(mapping, form, request, response);
}
/**
* 列出所有的对象
*
* @param mapping
* @param form
* @param request
* @param response
* @return
*/
public ActionForward list(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
request.setAttribute(getEntityListName(), doListEntity());
return mapping.findForward(LIST);
}
/**
* 新建Form
*
* @param mapping
* @param form
* @param request
* @param response
* @return
*/
public ActionForward create(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
return edit(mapping, form, request, response);
}
/**
* 修改Form
*
* @param mapping
* @param form
* @param request
* @param response
* @return
*/
public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
//防止重复提交的token
saveToken(request);
T object = null;
// 如果是修改操作,id!=null
if (request.getParameter(idName) != null) {
object = doGetEntity(form, request);
if (object == null) {
saveError(request, "entity.missing");
return mapping.findForward(LIST);
}
} else {
try {
object = entityClass.newInstance();
} catch (InstantiationException e) {
log.error(e);
} catch (IllegalAccessException e) {
log.error(e);
}
}
initForm(form, request, object);
refrenceData(request);
return mapping.findForward(EDIT);
}
/**
* 查看对象
*
* @param mapping
* @param form
* @param request
* @param response
* @return
*/
public ActionForward view(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
T object = doGetEntity(form, request);
if (object == null) {
saveError(request, "entity.missing");
return mapping.findForward("list");
}
request.setAttribute(getEntityName(), object);
refrenceData(request);
return mapping.findForward(VIEW);
}
/**
* 保存对象
*
* @param mapping
* @param form
* @param request
* @param response
* @return
*/
public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
if (isCancelled(request))
{
return list(mapping, form, request, response);
}
if (!isTokenValid(request)){
saveDirectlyError(request, "重复提交");
return mapping.findForward(LIST);
}
resetToken(request);
// run validation rules on this form
ActionMessages errors = form.validate(mapping, request);
if (!errors.isEmpty()) {
saveErrors(request, errors);
refrenceData(request);
return mapping.findForward(EDIT);
}
T object;
// 如果是修改操作,id is not blank
if (StringUtils.isNotBlank(request.getParameter(idName))) {
object = doGetEntity(form, request);
if (object == null) {
saveError(request, "entity.missing");
return mapping.findForward(LIST);
}
} else { // 否则为新增操作
object = doNewEntity(form, request);
}
try {
// 将lazyform内容绑定到object
initEntity(form, request, object);
doSaveEntity(form, request, object);
savedMessage(request, object);
} catch (BusinessException e) {
log.error(e.getMessage(), e);
saveDirectlyError(request, e.getMessage());
refrenceData(request);
return mapping.findForward(EDIT);
}
return mapping.findForward(SUCCESS);
}
/**
* 删除对象
*
* @param mapping
* @param form
* @param request
* @param response
* @return
*/
public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
try {
doDeleteEntity(form, request);
deletedMessage(request);
} catch (Exception e) {
saveDirectlyError(request, e.getMessage());
}
return mapping.findForward(SUCCESS);
}
/**
* 如果URL未定义,默认为index
*/
@Override
public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
return index(mapping, form, request, response);
}
/**
* 保存Form表单时,初始化Entity对象的属性.
*/
protected void initEntity(ActionForm form, HttpServletRequest request, T object) {
bindEntity(form, object);
onInitEntity(form, request, object);
}
/**
* 显示Form表单时,初始化Form对象的属性.
*/
protected void initForm(ActionForm form, HttpServletRequest request, T object) {
bindForm(form, object);
onInitForm(form, request, object);
}
/**
* 获取业务对象列表的函数.
*/
protected List<T> doListEntity() {
return getEntityManager().getAll();
}
/**
* 新建业务对象的函数.
*/
protected T doNewEntity(ActionForm form, HttpServletRequest request) {
T object = null;
try {
object = getEntityClass().newInstance();
} catch (Exception e) {
log.error("Can't new Instance of entity.", e);
}
return object;
}
/**
* 从数据库获取业务对象的函数.
*/
protected T doGetEntity(ActionForm form, HttpServletRequest request) {
Serializable id = getEntityId(request);
return getEntityManager().get(id);
}
/**
* 保存业务对象的函数.
*/
protected void doSaveEntity(ActionForm form, HttpServletRequest request, T object) {
getEntityManager().save(object);
}
/**
* 删除业务对象的函数.
*/
protected void doDeleteEntity(ActionForm form, HttpServletRequest request) {
Serializable id = getEntityId(request);
getEntityManager().removeById(id);
}
/**
* form与list界面所需的参考对象注入
* @param request
*/
protected void refrenceData(HttpServletRequest request) {
}
/**
* 显示表单时的回调方法
*
* @param form
* @param request
* @param Object
*/
protected void onInitForm(ActionForm form, HttpServletRequest request, T object) {
}
/**
* 保存Form时的回调方法
*
* @param form
* @param request
* @param Object
*/
protected void onInitEntity(ActionForm form, HttpServletRequest request, T object) {
}
/**
* 保存时生成的信息
*
* @param request
* @param Object
*/
protected void savedMessage(HttpServletRequest request, T object) {
saveMessage(request, "entity.saved");
}
/**
* 删除时生成的信息
*
* @param request
* @param Object
*/
protected void deletedMessage(HttpServletRequest request) {
saveMessage(request, "entity.deleted");
}
/**
* 获取所管理的对象名.
* 首字母小写,如"user".
*/
protected String getEntityName() {
return StringUtils.uncapitalize(ClassUtils.getShortName(getEntityClass()));
}
/**
* 获得所管理的对象名 首字母小写
*
* @return
*/
protected String getEntityListName() {
return StringUtils.uncapitalize(ClassUtils.getShortName(getEntityClass())) + "s";
}
/**
* 从request对象中获是entity的id,并且判断是否有效
*
* @param request
* @return
*/
protected Serializable getEntityId(HttpServletRequest request) {
String idString = request.getParameter(idName);
try {
return (Serializable) ConvertUtils.convert(idString, idClass);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("Wrong when get id from request");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -