SpringSide的Struts封裝
1.概述?
?? SpringSide對(duì)Struts做了兩層封裝:
?? 第一層:StrutsAction,繼承于DispatchAction,附帶一些Utils函數(shù),另外注冊(cè)了幾個(gè)Converter。
?? 第二層:StruttsEntityAction,繼承于StrutsAction, 演示了如何為單個(gè)對(duì)象的CRUD操作(增刪改查)封裝了默認(rèn)Action,子類只需要范型聲明所管理的對(duì)象類型和管理類型,即擁有CRUD操作的能力。
????大家各自項(xiàng)目的習(xí)慣不同,流程,可以參考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必須實(shí)現(xiàn)EntityDao<T>接口;
?? 第二 定義userManager用于依賴注入的setter函數(shù);
2.原理
???? StrutsEntityAction 會(huì)持有一個(gè)EntityDao接口的實(shí)體來(lái)做CRUD的操作,子類通過(guò)在泛型中聲明UserAction<User, UserManager>,自動(dòng)查找屬性中類型為UserManager的屬性作為EntityDao。如果子類有多個(gè)UserManager屬性(很少的情況),就需自行實(shí)現(xiàn)getEntityManager()函數(shù)。
???? CRUD現(xiàn)在主要封裝了list、edit、view、save、delete 5個(gè)流程,一般會(huì)調(diào)用doListEntity、doGetEntity、doNewEntity、doSaveEntity(),doDeleteEntity 5個(gè)業(yè)務(wù)函數(shù)去做相應(yīng)的業(yè)務(wù)操作。
???? 在controller中很重要的request 數(shù)據(jù)與POJO的轉(zhuǎn)換,由initEntity、initForm? 兩個(gè)函數(shù)完成。
???? initEntity 先調(diào)用bindObject 函數(shù)用BeanUtils 直接copy lazyBean的FormBean 和 Entity POJO,然后調(diào)用子類的onInitEntity()函數(shù)。initForm是同樣的原理。
?????通常還有一些輔助的對(duì)象,比如Book 修改頁(yè)要有Category列表做下拉選擇框,這些輔助對(duì)象統(tǒng)一子類重載onRefrence()函數(shù)放入request.attributes.
3.擴(kuò)展與客戶化
?? EntityAction必須預(yù)留足夠的擴(kuò)展點(diǎn)給子類重載,具體函數(shù)注釋見StrutsEntityAction的JavaDoc
, 包括:
??? 1.list、edit、view、save、delete: 五種action的流程封裝;
?? 2.doListEntity、doGetEntity、doNewEntity、doSaveEntity(),doDeleteEntity: 五種業(yè)務(wù)函數(shù)調(diào)用;
? ?3.initEntity、initForm?: FormBean與業(yè)務(wù)對(duì)象的初始化函數(shù)及refrenceData,onInitForm,onInitEntity 三個(gè)回調(diào)函數(shù);
?? 4.savedMessage、deletedMessage: 兩種業(yè)務(wù)操作成功后顯示的信息的回調(diào)函數(shù)。
??幾個(gè)回調(diào)函數(shù)在子類重載,而如果幾個(gè)封裝函數(shù)不合心意,請(qǐng)重新擴(kuò)展一個(gè)基類或完全重新封裝。