1. 程式人生 > >Struts2的傳值方式

Struts2的傳值方式

從前臺到後臺,struts2的傳值方式共三種:屬性驅動物件驅動以及模型驅動

一、屬性驅動

頁面程式碼:input框中的name值只是填寫單純的屬性名稱

<form action="FieldDrivenValueAction" method="POST">
		使用者名稱:<input name="username">
		<br>
		密碼:<input name="password">
		<br>
		性別:<input name="sex">
		<br>
		年齡:<input name="age">
		<br>
		<input type="submit" value="提交"/>
</form>

後臺程式碼:注意點:要為類中的每個屬性提供getXXX和setXXX方法。這樣前臺提交form表單時,我們就能在後臺接收到相應的屬性值。

public class FieldDrivenValueAction extends ActionSupport{

	private static final long serialVersionUID = 1L;
	
	private String username;
	private String password;
	private String sex;
	private String age;
	
	
	public String addUser(){
		System.out.println(username);
		System.out.println(age);
		return "success";
	}
	
	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;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	
}

二、物件驅動

1.首先我們要新建實體類,目的是為了解耦,在action中將不是邏輯處理的程式碼抽離出來。

public class User {
	private String username;
	private String password;
	private String sex;
	private String age;
	........getXXX\setXXX略
}

2.頁面,input框中name屬性的填寫方式也變了,並不是單純的屬性名了,而是“物件.屬性名”的方式

<form action="ObjectDrivenValueAction" method="POST">
		使用者名稱:<input name="user.username">
		<br>
		密碼:<input name="user.password">
		<br>
		性別:<input name="user.sex">
		<br>
		年齡:<input name="user.age">
		<br>
		<input type="submit" value="提交"/>
</form>

3.後臺,新建一個屬性為我們的實體物件,並提供getXXX和setXXX方法。這樣提交form表單時,我們就能在實體物件中取得前臺傳過來的屬性值。

public class ObjectDrivenValueAction extends ActionSupport{

	private static final long serialVersionUID = 1L;
	
	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	
	public String addUser(){
		System.out.println(user.getUsername());
		System.out.println(user.getAge());
		return "success";
	}
}

三、模型驅動(也是最為常用的一種方式)

1.我們同樣需要新建實體物件

2.頁面,input框中的name屬性只是填寫簡單的屬性值

form action="ModelDrivenValueAction" method="POST">
		使用者名稱:<input name="username">
		<br>
		密碼:<input name="password">
		<br>
		性別:<input name="sex">
		<br>
		年齡:<input name="age">
		<br>
		<input type="submit" value="提交"/>
</form>

3.後臺,前兩種方式Action只是繼承自ActionSuppport,模型驅動就有些不同了,我們要實現ModelDriven介面,並且重寫它的getModel方法,這樣前臺的屬性值就會傳到後臺定義的實體屬性User中去。

public class ModelDrivenValueAction implements ModelDriven<User>{
	
	private User user;
	
	@Override
	public User getModel() {
		if(user==null){
			user = new User();
		}
		return user;
	}
	
	public String addUser(){
		System.out.println(user.getUsername());
		System.out.println(user.getSex());
		return "success";
	}

}	

手動分割線

前臺向後臺的傳值都熟知了,那麼後臺怎麼往前臺傳值呢?這裡就要用到struts的值棧Ognl表示式了。關於值棧,分為兩個部分,一個是root(本質是一個List集合),一個是context(本質是存放有鍵值對的map物件),這裡不做過多介紹了。後臺向前臺傳值的時候,可以將值直接放入值棧中,也可以放入到context中,這樣前臺就可以通過ognl表示式獲取到前臺穿過來的值了,詳細看例子。

1.頁面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>    
<!--使用struts2的標籤,必須加上該指令-->
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>資訊展示頁面</title>
</head>
<body>
    <!--便於看到值棧-->
	<s:debug></s:debug>
    <!--從值棧中取值,直接填寫屬性值-->
	username:<s:property value="username"/><br/>
	Age:<s:property value="age"/>
	<hr>
    <!--從ActionContext中取,必須加上‘#’-->    
	username2:<s:property value="#user2.username"/>
	age2:<s:property value="#user2.age"/>
	
</body>
</html>

2.後臺

public class AfterToBeforeAction extends ActionSupport{

	private static final long serialVersionUID = 1L;
	

	public String receiveValue(){
		User user = new User();
		user.setUsername("haha");
		user.setAge("88");
		
		User user2 = new User();
		user2.setUsername("boniu");
		user2.setAge("8");
		
		ActionContext ac = ActionContext.getContext();
        //從context中獲取到值棧物件
		ValueStack stack = ac.getValueStack();
		//壓棧,將值放入到棧中,前臺取值時通過屬性名即可獲取
		stack.push(user);
		//放入context中,前臺取值時要加'#'號
		ac.put("user2", user2);
		return "success";
	}

}

值棧具體是什麼樣子的,可以通過我們頁面上使用的struts2標籤<s:debug />看到其部分,這裡貼兩張圖,供大家參考,有機會再詳談值棧。

圖1中綠色標記的,即是我們通過stack.push()方法將user物件壓入棧中的體現

圖2中的user2即是我們通過context.put()方法放入context中的user2物件