1. 程式人生 > >SSH框架前後端資料互動

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中的變數賦值了。
通過這兩種方式從前臺表單獲取資料,很基礎很方便很重要。事實上還有一種有實體類的屬性驅動,但是個人認為用的不多,因此沒有介紹。