ValueStack

时间:2016-08-01 08:40:12

标签: java struts2 iteration valuestack actioncontext

这个我的代码,当我执行它时显示我的大小为3,但当我弹出对象时,我只得到2个对象。 请解释一下我是否做错了? 我想知道 ValueStack 中存储的对象是什么,如何检索这些对象?

import java.util.*;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {

    private static final long serialVersionUID = 1L;
    private String name;

    public String execute() throws Exception {
        ValueStack stack = ActionContext.getContext().getValueStack();
        Map<String, Object> context = new HashMap<String, Object>();

        context.put("key1", new String("This is key1"));
        context.put("key2", new String("This is key2"));
        context.put("key3", new String("This is key3"));
        stack.push(context);

        System.out.println("Size of the valueStack: " + stack.size());

        for (int i = 0; i < stack.size(); i++) {
            System.out.println(i + ": " + stack.pop().toString());
        }
        return "success";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2 个答案:

答案 0 :(得分:2)

您错误地处理了上下文和地图。首先,您获得了一个动作上下文valueStack。然后,您创建了一个名为context的地图,并将其推送到堆栈。然后你开始迭代堆栈,但堆栈是一个推翻context的不同对象。要从堆栈中恢复上下文,您需要pop()peek()来自valueStack。然后,您可以将其迭代为Map

代码:

context = (Map<String, Object>)stack.pop();
for (Map.Entry<String, Object> entry : context.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

答案 1 :(得分:1)

您的代码中存在两个错误,即阻止正确打印结果。

错误n.1

i <= stack.size()应为i < stack.size(),否则有3个元素,您将尝试打印4个元素(i从0开始,size()从1开始)。
由于错误n.2。您没有遇到此错误。

错误n.2

System.out.println(i + ": " + stack.pop().toString());
  

.pop():将对象放在堆栈顶部,然后从堆栈中删除

然后你应该在循环之前存储大小,否则每次迭代时堆栈的大小都会改变

这就是发生的事情:

for (int i = 0; i <= 3; i++) {

for (int i = 1; i <= 2; i++) {

for (int i = 2; i <= 1; i++) { // not performed. And you don't fall in error n.1.

工作代码

int size = stack.size();

for (int i = 0; i < size; i++) {
    System.out.println(i + ": " + stack.pop().toString());
}

这将正确打印结果,但它会改变值堆栈;为了防止这种情况,你应该从迭代器中循环值栈的对象,你可以使用getRoot()方法获得:

Iterator itr = stack.getRoot().iterator();
while (itr.hasNext()) {
    System.out.println(itr.next().toString()); 
    // or .getClass().getName(), ReflectionToStringBuilder.toString(), or whatever...
}