strus2中獲取表單數據有兩種方式屬性驅動和模型驅動,屬性驅動即使用Action的屬性元素封裝請求參數,而模型驅動是使用javaBean來封裝來回請求參數。
【struts2中模型驅動的使用方法】
一個Action要想成爲模型驅動的話,就必須實現ModelDriven接口,請看下面一個例子:
上面的代碼,首先BaseAction實現了ModelDriven接口,在BaseAction生命了實例變量model,然後再BaseAction的子類中就可以使用model來進行參數的傳遞。
UserAction的部分代碼:
【struts2中模型驅動原理】
要說驅動模型實現,首先先介紹以下ModelDrivenInterceptor,該攔截器處於defaultStack第九的位置。ModelDrivenInterceptor攔截器主要做的事就是調用Action的getModel()方法然後把返回的model壓入值棧。下面是該攔截器intercept方法源碼:
@Override
public String intercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();//獲取當前正在執行的Action
//如果Action實現了ModelDriven接口
if (action instanceof ModelDriven) {
ModelDriven modelDriven = (ModelDriven) action;
ValueStack stack = invocation.getStack();
Object model = modelDriven.getModel();//通過getModel方法獲取model
if (model != null) {//如果model不爲null則把model壓入值棧
stack.push(model);
}
if (refreshModelBeforeResult) {//在執行Result之前是否要更新model對象,默認爲false
invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));
}
}
return invocation.invoke();//調用下一個攔截器
}
此方法就是就是把getModel方法返回的結果壓入值棧而已,我們一般實現這個接口是利用壓入值棧的model對象接收從頁面提交過來的數據,因爲Action也是在值棧中,而struts2在賦值參數的時候是在值棧從棧頂往棧底尋找有相應setter方法的對象,而這時model壓入了值棧,它是處於棧頂的,所以從頁面提交過來的參數也就被model對象接收了。
下面是struts2請求執行流程圖:
對於屬性驅動,我們需要在Action中定義與表單元素對應的所有的屬性,因而在Action中會出現很多的getter和setter方法,使得Action代碼量增加了很多,而且不利於封裝和繼承,模型驅動使得Action更加簡潔,可以使Action更加專注於是控制業務邏輯。