Struts2模型驅動

Struts2即支持屬性驅動,也支持模型驅動
屬性驅動:在Action中提供與表單字段一一對應的屬性,而後一一set賦值
模型驅動:使得表單字段都自動被set到一個JavaBean中,相似於Struts1.X的ActionForm
採用屬性驅動的方式時,是由每一個屬性來承載表單的字段值,運轉在MVC流程裏面
採用模型驅動的方式時,是由模型對象來承載全部的屬性值,運轉在MVC流程裏面
若使用模型驅動方式的話,就必須單獨提供一個JavaBean
可能與持久層打交道的JavaBean不太同樣,所以極可能要對每一個對象提供兩個JavaBean
好比Struts1的ActionForm,通常來講絕對不會把ActionForm做爲JavaBean跟持久層交互
ActionForm僅僅是聯繫Web和Action的一個橋樑,所以推薦使用屬性驅動接收表單字段app


--------------------------------------------------------------------------------ide

在com.opensymphony.xwork2.ModelDriven接口源代碼中有一段很重要的說明,現抄錄以下
ModelDriven Actions provide a model object to be pushed onto the ValueStack in addition
to the Action itself,allowing a FormBean type approach like Struts
翻譯:模型驅動的Action。將模型對象以及Action對象都放到ValueStack裏面
容許像Struts同樣的FormBean方式
也即:一個Action要想成爲模型驅動的話,就必須實現ModelDriven接口
而咱們以前所一直繼承的ActionSupport類並無實現ModelDriven接口
如下是採用模型驅動的Action代碼示例
view plaincopy to clipboardprint?
public class ModelDrivenAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
public User getModel() {
System.out.println(user);
return user;
}
public String execute() throws Exception {
System.out.println("Username is :" + user.getUsername());
System.out.println("Password is :" + user.getPassword());
return SUCCESS;
}
}
public class ModelDrivenAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
public User getModel() {
System.out.println(user);
return user;
}
public String execute() throws Exception {
System.out.println("Username is :" + user.getUsername());
System.out.println("Password is :" + user.getPassword());
return SUCCESS;
}
} ModelDrivenAction類的執行流程是:首先調用getModel()方法獲得User對象
接着根據JavaBean的原則將客戶端傳過來的屬性,一個一個的set到User對象的屬性中
將屬性所有set完以後,再執行execute()方法。對於模型驅動,只要瞭解這些就足夠了翻譯


--------------------------------------------------------------------------------orm

模型驅動的底層實現機制
這裏用到了defaultStack攔截器棧中的modelDriven攔截器
它對應com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor類,其API描述以下
public class ModelDrivenInterceptor extends AbstractInterceptor
Watches for ModelDriven actions and adds the action`s model on to the value stack.
翻譯:觀察模型驅動的Action,並將這個Action的模型【這裏指User對象】放到值棧中
Note:The ModelDrivenInterceptor must come before the both StaticParametersInterceptor
and ParametersInterceptor if you want the parameters to be applied to the model.
翻譯:若但願將表單提交過來的參數應用到模型裏面
那麼ModelDrivenInterceptor攔截器就必須位於StaticParametersInterceptor和ParametersInterceptor攔截器前面
實際上struts-default.xml已完成這個工做了。能夠在defaultStack攔截器棧中查看三者位置
因此對於採用模型驅動的方式的話,在struts.xml中只須要指定模型驅動的類就能夠了
其它的都不須要咱們手工修改xml


--------------------------------------------------------------------------------對象

ModelDrivenInterceptor的部分源代碼以下所示
view plaincopy to clipboardprint?
public class ModelDrivenInterceptor extends AbstractInterceptor{
public String intercept(ActionInvocation invocation) throws Exception{
Object action = invocation.getAction();
// 這個action就是當前攔截器準備攔截的Action對象
// 咱們這裏的action就是ModelDrivenAction,它實現了ModelDriven<User>接口
// 根據多態性,可認爲子類對象就是父類的一個實例,故action屬於ModelDriven的實例
if(action instanceof ModelDriven){
// 將action強制轉換爲ModelDriven類型,得到ModelDriven的實例
ModelDriven modelDriven = (ModelDriven)action;
ValueStack stack = invocation.getStack();
// 調用getModel(),此時ModelDrivenAction中的getModel()纔會被執行,得到User對象
Object model = modelDriven.getModel();
if(model != null){
// 得到User對象以後,就把它推入【壓入】到值棧中,供後面調用
stack.push(model);
}
 繼承

相關文章
相關標籤/搜索