Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ValueStack中存储了哪些对象_Java_Struts2_Iteration_Valuestack_Actioncontext - Fatal编程技术网

Java ValueStack中存储了哪些对象

Java ValueStack中存储了哪些对象,java,struts2,iteration,valuestack,actioncontext,Java,Struts2,Iteration,Valuestack,Actioncontext,下面是我的代码,当我执行它时,它显示大小为3,但当我弹出对象时,我只得到2个对象 import java.util.*; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class HelloWorldAction extends ActionSupp

下面是我的代码,当我执行它时,它显示大小为3,但当我弹出对象时,我只得到2个对象

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;
    }
}
 
import java.util.*;
导入com.opensymphony.xwork2.util.ValueStack;
导入com.opensymphony.xwork2.ActionContext;
导入com.opensymphony.xwork2.ActionSupport;
公共类HelloWorldAction扩展了ActionSupport{
私有静态最终长serialVersionUID=1L;
私有字符串名称;
公共字符串execute()引发异常{
ValueStack stack=ActionContext.getContext().getValueStack();
Map context=newhashmap();
put(“key1”,新字符串(“这是key1”);
put(“key2”,新字符串(“这是key2”);
put(“key3”,新字符串(“这是key3”);
stack.push(上下文);
System.out.println(“valueStack的大小:+stack.Size());
对于(int i=0;i
请解释一下我是否做错了


我想知道
ValueStack
中存储的对象是什么?我如何检索这些对象?

您错误处理了
上下文和映射

首先,您得到了一个action
context
valueStack

然后创建了一个名为
context
的映射,并将其推送到堆栈中

然后,您已经开始迭代堆栈,但堆栈是另一个对象,它已被
context
覆盖

要从堆栈中获取上下文,您需要从
valueStack
中获取上下文。然后可以将其作为贴图进行迭代

代码:

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


代码中有两个错误,导致无法正确打印结果


错误n.1


i您正在将一个对象推到值堆栈上:
context
:|是的,我只推一个对象,值堆栈中的另一个对象是action对象,这意味着只有两个对象,因此值堆栈的大小应该是2,但它给我3作为对象的大小,这就是我关心的问题,我想知道为什么它显示的是3号大小?在值堆栈中有很多东西。例如,在点击视图层之前,动作本身被推到堆栈上。实际上,你错了。我的观点是,当我打印对象的大小时,它给出3作为输出,但当我从值堆栈中弹出对象时,我只得到2个对象。实际上,我想了解值堆栈中存储了哪些对象,我只得到了2个对象。您打印堆栈的大小,而不是堆栈中对象的大小。使用stack.pop()我正在尝试检索堆栈中的对象。但无论如何,谢谢你,我得到了我的答案。你应该检索(
pop()
)你推过的唯一对象,这就是重点。@SachinSingh,是吗?你能给我一个链接吗?或者可能有人已经问过这个问题了?谢谢你指出这一点,但这就是我试图检查它是否引发任何异常的原因,你会很高兴知道它没有引发任何异常。你需要注意的另一件事是,我没有使用i,peek只返回stackMate中最顶层的元素,但是在pop()的情况下,它也不会抛出任何异常。但这不是我关心的问题,我通过使用getroot()方法得到了答案,它给了我valuestack中的3个对象,它们是[{key3=这是key3,key2=这是key2,key1=这是key1},com.sachin。HelloWorldAction@4e857327,com.opensymphony.xwork2。DefaultTextProvider@1b4b2db7]谢谢你help@SachinSingh您得到了相同的对象,并且大小没有更改,因为
valueStack
是线程安全的。您只需使用另一种方法来检索对象,但API是相同的,唯一的例外是您在编写Java代码时遇到了很多错误。没有线索说明为什么他没有得到第三个元素,也没有线索说明为什么他没有尝试得到不存在的第四个元素,然后是@RomanC。但整个问答过程令人困惑,因此可能会everything@AndreaLigios你说得对。int size=stack.size();对于(inti=0;iSystem.out.println(i + ": " + stack.pop().toString());
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());
}
Iterator itr = stack.getRoot().iterator();
while (itr.hasNext()) {
    System.out.println(itr.next().toString()); 
    // or .getClass().getName(), ReflectionToStringBuilder.toString(), or whatever...
}