可以根據(jù)Action屬性的不同將它分為兩類:Field-Driven(屬性驅(qū)動) Action和Model-Driven(模型驅(qū)動) Action。
一、Field-Driven(屬性驅(qū)動)Action,Action擁有自己的屬性,這些屬性一般是Java的基本類型。表單字段直接和Action的屬性 對應(yīng)。
二、實現(xiàn)了modelDriven接口可以在action中直接獲得例如User對象,它會將Object getModel()取得的User放到ValueStack中。可以理解為將這個User的屬性追加到Action中。它主要是作用是實現(xiàn)類似 Struts的FormBean功能。
在struts2中,提供了一種直接使用領(lǐng)域?qū)ο蟮姆绞剑褪亲宎ction實現(xiàn)com.opensymphony.xwork2.ModelDriven接口,ModelDriven讓你可以直接操作應(yīng)用程序中的領(lǐng)域?qū)ο螅试S你在web層和業(yè)務(wù)層使用相同的對象。
ModelDriven接口只有一個方法
public Object getModel() {
return null;
}
該方法返回一個用于接收用戶輸入數(shù)據(jù)的對象模型,在這個模型對象中的屬性可以直接通過(屬性名)userName來訪問,而不需要使用(對象名.屬 性名)user.userName這種格式來訪問了,在action也不需要對對象提供getter和setter方法了,但是必須要在action中進(jìn) 行new操作
如下
// ModelDriven要使用泛型哦
public class LoginAction extends ActionSupport implements ModelDriven<User>{
private static final long serialVersionUID = -6434128483294080524L;
//這里必須要new
private User user=new User();
public String login() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
//這里是實現(xiàn)接口方法
@Override
public User getModel() {
// TODO Auto-generated method stub
//別忘記了,要把返回值寫上哦
return user;
}
}
這樣一個ModelDriven就實現(xiàn)完畢了
和屬性驅(qū)動的Action有很大的區(qū)別,下面一一列舉:
(1)模型驅(qū)動的Action必須實現(xiàn)ModelDriven接口,而且要提供相應(yīng)的泛型,這里當(dāng)然就是具體使用的Java Bean了。
(2)實現(xiàn)ModelDriven的getModel方法,其實就是簡單的返回泛型的一個對象。
(3)在Action提供一個泛型的私有對象,這里就是定義一個User的user對象,并提供相應(yīng)的getter與setter。
好了,上面的三件事做完之后,Action就會去自動調(diào)用User的setter將表單中的name屬性的值賦給User中的屬性。而Action的后續(xù)處理的Jsp頁面后者是Servlet就可以使用user對象了。
到底是用屬性驅(qū)動和是模型驅(qū)動呢?
這個問題困擾了很多Struts2的初學(xué)者,我這里提供一些建議:
(1)請你統(tǒng)一整個系統(tǒng)中的Action使用的驅(qū)動模型,即要么都是用屬性驅(qū)動,要么都是用模型驅(qū)動。
(2)如果你的DB中的持久層的對象與表單中的屬性都是一一對應(yīng)的話,那么就使用模型驅(qū)動吧,畢竟看起來代碼要整潔得多。
(3)如果表單的屬性不是一一對應(yīng)的話,那么就應(yīng)該使用屬性驅(qū)動,否則,你的系統(tǒng)就必須提供兩個Bean,一個對應(yīng)表單提交的數(shù)據(jù),另一個用與持久層。