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表達
式顯示對應的資訊。