在上一篇文章《深入淺出理解struts2中的值棧》中,我們已經(jīng)了解了struts2為我們提供的一種靈活方便的存儲(chǔ)機(jī)制“值?!薄D敲催@篇文章大家一起來(lái)了解一下往struts2值棧中存儲(chǔ)數(shù)據(jù)的三種方式
1. 使用值棧對(duì)象中的set方法
步驟:
- 在action中獲取值棧對(duì)象
- 調(diào)用值棧對(duì)象的set方法存值
代碼示例:
public class ValueStackDemoAction extends ActionSupport {
public String execute() throws Exception {
//1 獲取值棧對(duì)象
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
//2 調(diào)用值棧對(duì)象中的set方法
stack.set("demo", "DemoData");
return "success";
}
}
set方法使用map方式儲(chǔ)存值,第一個(gè)元素為String類(lèi)型的key,第二個(gè)元素為Object類(lèi)型的value,value中可以存放任意對(duì)象。
使用set方法向值棧中存值后,我們用debug標(biāo)簽來(lái)查看一下值棧的結(jié)構(gòu),如圖:

如圖我們清晰的看到,set方式是使用HashMap的方式將值存入到值棧中,然后取值的時(shí)候更具M(jìn)ap中的key值即可將其value取出。
2. 使用值棧對(duì)象中的push方法
步驟:
- 在action中獲取值棧對(duì)象
- 調(diào)用值棧對(duì)象的push方法存值
代碼示例:
public class ValueStackDemoAction extends ActionSupport {
public String execute() throws Exception {
//1 獲取值棧對(duì)象
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
//2 調(diào)用值棧對(duì)象中的push方法
stack.push("abcd");
return "success";
}
}
push方法只接收一個(gè)Object類(lèi)型的參數(shù),可以存放任意類(lèi)型的對(duì)象
push方式是自動(dòng)將所存的數(shù)據(jù)轉(zhuǎn)為對(duì)應(yīng)的對(duì)象類(lèi)型,然后放入值棧中,如圖:

3. 在action中定義變量(或?qū)ο螅褂孟鄳?yīng)的get方法(最常用,最重要的方法)
步驟:
- 在action定義變量
- 生成變量的get方法
- 在執(zhí)行方法里面為變量賦值
代碼示例:
public class ValueStackDemoAction extends ActionSupport {
//1. 聲明變量
public String name;
//2. 生成變量的get方法
public String getName(){
return name;
}
//3. 在執(zhí)行方法中為變量賦值
public String execute() throws Exception {
name = "DemoData";
return "success";
}
}
我們來(lái)看一下使用這種方法存值后值棧中的數(shù)據(jù)結(jié)構(gòu),如圖:

可以看出這種方式存值不會(huì)在值棧中創(chuàng)建新的對(duì)象,而是直接將值存進(jìn)了值棧中原有的action對(duì)象中,這種方式的好處就是避免了值棧中存儲(chǔ)空間的浪費(fèi),不用為每個(gè)值都分別設(shè)置存儲(chǔ)空間。因此這種方式更加常用。
使用這種方法做一個(gè)向值棧中存放一個(gè)list集合的示例
代碼如下:
- User實(shí)體類(lèi)
public class User {
private String username;
private String password;
private String address;
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 getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
- Action類(lèi)
public class ListDemoAction extends ActionSupport {
// 1. 定義list變量
private List<User> list = new ArrayList<User>();
// 2. 生成get方法
public List<User> getList() {
return list;
}
public String execute() throws Exception {
//3 向list中設(shè)置值
User user1 = new User();
user1.setUsername("小奧");
user1.setPassword("123");
user1.setAddress("美國(guó)");
User user2 = new User();
user2.setUsername("小王");
user2.setPassword("250");
user2.setAddress("越南");
list.add(user1);
list.add(user2);
return "success";
}
-
值棧中的結(jié)構(gòu)如下:
使用第三種方法向值棧中存放list集合后值棧的結(jié)構(gòu).png
由圖可知我們已經(jīng)成功的這個(gè)list集合存放進(jìn)了值棧中。
