1. 程式人生 > >Struts2屬性驅動與模型驅動

Struts2屬性驅動與模型驅動

1屬性驅動是指用Action的屬性來封裝來回請求的引數.

2.模型驅動     模型驅動是指使用JavaBean來封裝來回請求的引數.(個人理解

建議使用模型驅動,因為相比struts 1的Action類,struts 2的Action類承擔了太多的責任:既用於封裝來回請求的引數,   也保

護了控制邏輯,這使它的結構不夠清晰.這就是模型驅動的優勢.

 3.到底是用屬性驅動和是模型驅動呢?  這個問題困擾了很多Struts2的初學者,我這裡提供一些

建議:  (1)請你統一整個系統中的Action使用的驅動模型,即要麼都是用屬性驅動,要麼都是用

模型驅動。  (2)如果你的DB中的持久層的物件與表單中的屬性都是一一對應的話,那麼就使用模

型驅動吧,畢竟看起來程式碼要整潔得多。  (3)如果表單的屬性不是一一對應的話,那麼就應該使

用屬性驅動,否則,你的系統就必須提供兩個Bean,一個對應表單提交的資料,另一個用與持久層。

以下是博主寫的例子:

屬性驅動:

1、在action中宣告屬性,屬性的名稱和頁面元素中name屬性的值保持一致

2、action中的屬性必須有set和get方法

package test;

public class DriverAction2{
    private User user;
    
    public String execute(){
        return "success";
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}


jsp頁面form表單
    <form action="login.action" method="post">
   姓名 <input type="text" name="user.username"><br/>
   密碼 <input type="text" name="user.password"><br/>
   年齡 <input type="text" name="user.age"><br/>
    <input type="submit" value="submit">
    </form>

可以看到值棧


模型驅動:

1、action實現一個介面ModelDriver

 2、在action中宣告一個屬性,該屬性會封裝頁面中的資料,並且用new的方法

給該屬性建立物件
填充介面中的方法getModel,返回該屬性的值

package test;

import com.opensymphony.xwork2.ModelDriven;

public class ModelAction implements ModelDriven<User>{
//直接例項化物件
	private User user=new User();
public String execute(){
	return "success";
}
	@Override
	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}

}


從上圖可以看出,ModelDriverInterceptor有兩個作用:

1、  當前請求的action必須實現ModelDriver介面

2、  把model物件放入到了棧頂

可以看到值棧顯示object 為User封裝類 property name 為user的屬性


總結:

當表單中資料提交到對應的action中時,struts2容器會建立action,並且把action放入到棧頂,實

現ModelDriven的action類在物件棧中會有一個屬性為model(username,password),之後

ModelDrivenInterceptor類會把action中的model屬性放入棧頂(這樣model屬性直接可以訪問了),

之後再由ParameterInterceptor類負責把頁面上表單中的值賦值給物件棧中的屬性,由該類中的

doInterceptor方法返回invocation.invoke()放行,回到action中,最後由jsp頁面通過ognl表達

式顯示對應的資訊。