⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 strutsentityaction.java

📁 应用泛型以及反射编写的单表操作框架
💻 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 + -