所謂modeldriven,意思是直接把實體類當成頁面資料的收集物件。比如,有實體類user如下:
package cn.com.leadfar.struts2.actions;
public class user
public void setusername(string username)
public string getpassword()
public void setpassword(string password)
public int getage()
public void setage(int age)
public string getaddress()
public void setaddress(string address)
public int getid()
public void setid(int id) 假如要寫乙個action,用來新增user。
第一種做法是直接在action中定義所有需要的屬性,然後在jsp中直接用屬性名稱來提交資料:
useraction:
public class useraction
public int getid()
public void setid(int id)
public string getusername()
public void setusername(string username)
public string getpassword()
public void setpassword(string password)
public int getage()
public void setage(int age)
public string getaddress()
public void setaddress(string address) add_input.jsp:
上述做法不好之處是:如果實體類的屬性非常多,那麼action中也要定義相同的屬性。
第二種做法是將user物件定義到useraction中,然後在jsp中通過user屬性來給user賦值:
useraction:
public class useraction
public user getuser()
public void setuser(user user) add_input.jsp:
這種做法不好的地方是:jsp頁面上表單域中的命名變得太長
第三種做法是利用modeldriven機制,讓useraction實現乙個modeldriven介面,同時實現介面中的方法:getmodel()。如下所示:
public class useraction implements modeldriven
return user;
}public string add()
public user getuser()
public void setuser(user user) jsp的**如下:
可見,第三種做法是比較好的,action和jsp寫起來都比較簡單。
modeldriven背後的機制?
modeldriven背後的機制就是valuestack。介面通過:username/age/address這樣的名稱,就能夠被直接賦值給user物件,這證明user物件正是valuestack中的乙個root物件!
那麼,為什麼user物件會在valuestack中呢?它是什麼時候被壓入valuestack的呢?答案是:modeldriveninterceptor(關於interceptor的概念,請參考後續章節的說明)。modeldriveninterceptor是預設的***鏈的一部分,當乙個請求經過modeldriveninterceptor的時候,在這個***中,會判斷當前要呼叫的action物件是否實現了modeldriven介面,如果實現了這個介面,則呼叫getmodel()方法,並把返回值(本例是返回user物件)壓入valuestack。
請看modeldriveninterceptor的**:
public class modeldriveninterceptor extends abstractinterceptor
@override
public string intercept(actioninvocation invocation) throws exception
if (refreshmodelbeforeresult)
}return invocation.invoke();
}從modeldriveninterceptor中,即可以看到model物件被壓入valuestack中!
Git學習系列之為什麼選擇Git?
為什麼選擇git?流行的軟體版本開源管理軟體,有cvs svn git版本管理工具,git的優勢在 呢?git 和 cvs svn不同,是乙個分布式的源 管理工具,它很強,也很快,linux核心的 就是用git管理的,它給我們帶來的直接好處有 1.初始化,git init,git commit a,...
Git學習系列之為什麼選擇Git?
為什麼選擇git?流行的軟體版本開源管理軟體,有cvs svn git版本管理工具,git的優勢在 呢?git 和 cvs svn不同,是乙個分布式的源 管理工具,它很強,也很快,linux核心的 就是用git管理的,它給我們帶來的直接好處有 1.初始化,git init,git commit a,...
前端碎碎念 之 為什麼
類似標題中的問題還有很多,例如 為什麼 false 而 true?or 1 1 是true 還是 false?如果對 操作符一知半解,就很難解答類似的問題。我們直接開門見山,看看 是如何工作的,這裡的難點主要涉及到js中的隱式強制型別轉換。判斷步驟如下 如果有乙個運算元是布林值,則在比較相等性之前先...