SSH框架前後端資料互動
一、屬性驅動
1.action中無實體類的屬性驅動
無實體類的屬性驅動,即前端頁面傳送到action中的資料不是action中實體類的某個屬性,而是單獨的,普通的變數。例如jsp頁面要將一個username傳送到action中:
jsp頁面:
<form action="test.action" method="post">
<input type="text" name="username">
<input type="submit" value="提交">
</form>
jsp頁面通過表單用post方式將資料傳送到名為test的動作方法中
動作類:
@ParentPackage("struts-default") public class testAction extends ActionSupport{ //別忘了繼承ActionSupport private String username ; //這裡的變數名要與頁面表單中input框的name屬性值一致 //生成getter、setter方法 public String getUsername(){ return username ; } public void setUsername(String username){ this.username = username ; } //處理完畢之後跳轉到result.jsp @Action(value="test",results= {@Result(name="success",location="/result.jsp")}) public String execute(){ System.out.println(username); return SUCCESS ; } }
動作類中宣告變數的名稱要與頁面表單中該屬性的名稱一致,同時生成getter、setter方法
此時,struts2的值棧棧頂物件是當前執行的動作類,該username屬性在這個動作類物件中,使用struts2提供的debug標籤檢視result.jsp中的值棧內容:
此時,在result.jsp中就可以用el表示式獲取該username屬性的值:
${username}
el表示式獲取屬性值是直接查詢Property Name,從上到下依次查詢,找到了第一個與el表示式中名稱一樣的屬性就返回屬性值。這裡不討論值棧中Property Name有多個同名屬性的問題。
二、模型驅動——有實體類
這種方式是action使用一個實體類物件去接收前端jsp頁面傳來的值
要求:
1、動作方法實現**ModelDriven<實體類名稱>**介面,並覆寫getModel()方法。
2、同時要先定義一個用來接收資料的實體類(記得實現可序列化介面)。
3、前端jsp頁面表單中的引數名稱要與實體類的資料成員名稱一致。
User類:
public class User implements Serializable {
private String username ;
private String password ;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
動作類中:
public class testAction2 extends ActionSupport implements ModelDriven<User> {
//先例項化一個user物件
private User user = new User() ;
//在覆寫的getMode()方法中返回這個user物件
@Override
public User getModel() {
return user;
}
}
這麼一來,user物件就會被自動壓入值棧中,此時的棧頂物件就是這個user物件
動作方法:
@Action(value=“test2”,results= {@Result(name=“success”,location="/result.jsp")})
public String execute() {
System.out.println(user);
return SUCCESS ;
}
前端jsp頁面:
<form action="test2.action" method="post">
username:<input type="text" name="username">
password:<input type="text" name="password">
<input type="submit" value="提交">
</form>
<s:debug></s:debug>
提交後action中的user物件的username和password就有值了,同時,result.jsp中的棧頂物件是該user物件:
一樣可以通過el表示式取出值:
${username}
${password}
如果前端頁面的表單中只有username,而沒有password,則到action中這個引數password的值就是預設值null,到值棧中也是預設值null
結語:
請求引數封裝事實上是由struts2自動的呼叫了setter和getter方法給實體類物件或者action中的變數賦值了。
通過這兩種方式從前臺表單獲取資料,很基礎很方便很重要。事實上還有一種有實體類的屬性驅動,但是個人認為用的不多,因此沒有介紹。