SpringSide的Struts封装
1.概述
SpringSide对Struts做了两层封装:
第一层:StrutsAction,继承于DispatchAction,附带一些Utils函数,另外注册了几个Converter。
第二层:StruttsEntityAction,继承于StrutsAction, 演示了如何为单个对象的CRUD操作(增删改查)封装了默认Action,子类只需要范型声明所管理的对象类型和管理类型,即拥有CRUD操作的能力。
大家各自项目的习惯不同,流程,可以参考SpringSide的封装,封装自己的版本。
典型子类代码如下:
public class UserAction extends StrutsEntityAction<User,UserManager> {
private UserManager userManager;
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
}
第一 extends StrutsEntityAction<User,UserManager>,声明管理的Entity类型是User,管理的Entity是UserManager,UserManager必须实现EntityDao<T>接口;
第二 定义userManager用于依赖注入的setter函数;
2.原理
StrutsEntityAction 会持有一个EntityDao接口的实体来做CRUD的操作,子类通过在泛型中声明UserAction<User, UserManager>,自动查找属性中类型为UserManager的属性作为EntityDao。如果子类有多个UserManager属性(很少的情况),就需自行实现getEntityManager()函数。
CRUD现在主要封装了list、edit、view、save、delete 5个流程,一般会调用doListEntity、doGetEntity、doNewEntity、doSaveEntity(),doDeleteEntity 5个业务函数去做相应的业务操作。
在controller中很重要的request 数据与POJO的转换,由initEntity、initForm 两个函数完成。
initEntity 先调用bindObject 函数用BeanUtils 直接copy lazyBean的FormBean 和 Entity POJO,然后调用子类的onInitEntity()函数。initForm是同样的原理。
通常还有一些辅助的对象,比如Book 修改页要有Category列表做下拉选择框,这些辅助对象统一子类重载onRefrence()函数放入request.attributes.
3.扩展与客户化
EntityAction必须预留足够的扩展点给子类重载,具体函数注释见StrutsEntityAction的JavaDoc, 包括:
1.list、edit、view、save、delete: 五种action的流程封装;
2.doListEntity、doGetEntity、doNewEntity、doSaveEntity(),doDeleteEntity: 五种业务函数调用;
3.initEntity、initForm : FormBean与业务对象的初始化函数及refrenceData,onInitForm,onInitEntity 三个回调函数;
4.savedMessage、deletedMessage: 两种业务操作成功后显示的信息的回调函数。
几个回调函数在子类重载,而如果几个封装函数不合心意,请重新扩展一个基类或完全重新封装。