strut2接收引數的三種方式(屬性驅動\物件驅動\模型驅動)
一.屬性驅動
Jsp程式碼
<body>
<h1>屬性驅動</h1>
<form action="${pageContext.request.contextPath}/Demo1Action" method="post">
使用者名稱:<input type="text" name="name" ><br>
年齡:<input type="text" name="age" ><br>
入職日期:<input type="text" name="hireDate" ><br>
<input type="submit" value="提交" ><br>
</form>
</body>
Action程式碼
//使用Action獲得表單提交引數
//1.在Action中準備與引數鍵相同的屬性,並提供相應的set方法,引數值會自動封裝到屬性中.
//2.封裝引數還會幫我們自動型別轉換. (8大基本資料型別|指定格式的Date型別)
public class Demo7Action extends ActionSupport {
private static final long serialVersionUID = 1L;
private String name;
private Integer age;
private Date hireDate;
@Override
public String execute() throws Exception {
System.out.println("name:"+name+",age:"+age+",hireDate:"+hireDate);
return SUCCESS;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
}
二.物件驅動
Jsp程式碼
<body>
<h1>物件驅動</h1>
<form action="${pageContext.request.contextPath}/Demo8Action" method="post">
使用者名稱:<input type="text" name="user.name" ><br>
年齡:<input type="text" name="user.age" ><br>
入職日期:<input type="text" name="user.hireDate" ><br>
<input type="submit" value="提交" ><br>
</form>
</body>
Action程式碼
//使用Action獲得表單提交引數
//1 在action中準備物件屬性.並提供物件的set/get方法
//2 表單提交的鍵格式:物件屬性名.屬性名
public class Demo8Action extends ActionSupport {
private static final long serialVersionUID = 1L;
private User user;
@Override
public String execute() throws Exception {
System.out.println(user);
return SUCCESS;
}
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
}
三.模型驅動
Jsp程式碼
<body>
<h1>模型驅動</h1>
<form action="${pageContext.request.contextPath}/Demo9Action" method="post">
使用者名稱:<input type="text" name="name" ><br>
年齡:<input type="text" name="age" ><br>
入職日期:<input type="text" name="hireDate" ><br>
<input type="submit" value="提交" ><br>
</form>
</body>
Action程式碼
//使用Action獲得表單提交引數
//1 action實現ModelDriven介面.在實現方法中返回封裝引數的User物件
//2 表單提交引數時,直接寫物件中屬性名即可.
public class Demo9Action extends ActionSupport implements ModelDriven<User> {
private static final long serialVersionUID = 1L;
private User user = new User();
public User getModel() {
return user;
}
@Override
public String execute() throws Exception {
System.out.println(user);
return SUCCESS;
}
}
這種方式應該不算是引數封裝的方式,但我們很多情況下都用屬性驅動的方式接收引數,因為這種方式方便,簡潔,易控制。屬性驅動在Action中提供與表單欄位一一對應的屬性,然後一一set賦值,採用屬性驅動的方式時,是由每個屬性來承載表單的欄位值,運轉在MVC流程裡面。
ModelDrivenAction類的執行流程是:首先呼叫getModel()方法得到User物件,接著根據JavaBean的原則將客戶端傳過來的屬性,一個一個的set到User物件的屬性中,將屬性全部set完之後,再執行execute()方法。
到底是用屬性驅動和是模型驅動呢?
1)統一整個系統中的Action使用的驅動模型,即要麼都是用屬性驅動,要麼都是用模型驅動。
2)如果你的DB中的持久層的物件與表單中的屬性都是一一對應的話,那麼就使用模型驅動吧,畢竟看起來程式碼要整潔得多。
3)如果表單的屬性不是一一對應的話,那麼就應該使用屬性驅動,否則,你的系統就必須提供兩個Bean,一個對應表單提交的資料,另一個用與持久層。