用泛化实现DAO大家就比较了解, 不知有没有人用泛化实现action呢, 代码如下:
java 代码
- ??
- import?java.io.Serializable; ??
- import?java.lang.reflect.ParameterizedType; ??
- ??
- import?org.apache.log4j.Logger; ??
- ??
- import?com.kelefa.common.dao.AbstractDAO; ??
- import?com.opensymphony.xwork.Action; ??
- import?com.opensymphony.xwork.ActionSupport; ??
- ??
- /**? ?
- ?*?@param?<dao></dao> ?
- ?*??????????该action实现添加功能的dao接口类,?例如:UserDAO ?
- ?*?@param?<vo></vo> ?
- ?*??????????要添加的实体类,?例如:User ?
- ?*?@param?<id></id> ?
- ?*??????????实体类的id属性的类,?一般是Integer ?
- ?*/??
- public abstract class AddBase<DAO extends AbstractDAO<VO, ID>, VO, ID extends Serializable>
- ????????extends?ActionSupport ??
- { ??
- ????private?static?final?Logger?log?=?Logger.getLogger(?AddBase.class?); ??
- ??
- ????private?static?final?long?serialVersionUID?=?1L; ??
- ??
- ????/** ?
- ?????*?该action实现添加功能的dao接口类,提供setter方法,使得ioc容器可以进行注射 ?
- ?????*/??
- ????protected?DAO?dao; ??
- ??
- ????public?void?setDao(?DAO?dao?) ??
- ????{ ??
- ????????this.dao?=?dao; ??
- ????} ??
- ??
- ????protected?VO?vo?=?newValueObject(); ??
- ??
- ????public?VO?getVo() ??
- ????{ ??
- ????????return?vo; ??
- ????} ??
- ??
- ????public?AddBase() ??
- ????{ ??
- ????} ??
- ??
- ?
- ????@SuppressWarnings(?"unchecked"?) ??
- ????protected?VO?newValueObject() ??
- ????{ ??
- ????????Class?entityClass?=?(Class)?((ParameterizedType)?getClass() ??
- ????????????????.getGenericSuperclass()).getActualTypeArguments()[1]; ??
- ??
- ????????if?(?log.isDebugEnabled()?) ??
- ????????????log.debug(?"entityClass:?"?+?entityClass.getCanonicalName()?); ??
- ??
- ????????VO?newInstance?=?null; ??
- ????????try??
- ????????{ ??
- ????????????newInstance?=?(VO)?entityClass.newInstance(); ??
- ????????} ??
- ????????catch?(?InstantiationException?ex?) ??
- ????????{ ??
- ????????????log.warn(?ex.getMessage(),?ex?); ??
- ????????} ??
- ????????catch?(?IllegalAccessException?ex?) ??
- ????????{ ??
- ????????????log.warn(?ex.getMessage(),?ex?); ??
- ????????} ??
- ??
- ????????return?newInstance; ??
- ????} ??
- ??
- ????/** ?
- ?????*?webwork?action ?
- ?????*/??
- ????@Override??
- ????public?String?execute() ??
- ????????????throws?Exception ??
- ????{ ??
- ????????dao.insert(?vo?); ??
- ??
- ????????return?Action.SUCCESS; ??
- ????} ??
- }??
?
这样派生类不用写一行代码即可实现添加功能, 例如:
java 代码
- ??
- import?com.kelefa.common.action.AddBase; ??
- import?com.kingonsoft.house.dao.cms.ADTypeDAO; ??
- import?com.kingonsoft.house.entity.cms.ADType; ??
- ??
- ??
- public?class?AddADType ??
- ????????extends?AddBase ??
- { ??
- ????private?static?final?long?serialVersionUID?=?1L; ??
- }??
?
不知大家对这种方法有何看法.
1 楼
downpour
2007-06-25
老实说,没有一个企业应用的持久化的逻辑会如此简单,一句insert就ok了。
所以,除了Load,其他的范化的Action很难被用到。
所以,除了Load,其他的范化的Action很难被用到。