Struts2中的ValueStack如何工作?

时间:2011-04-15 12:02:54

标签: struts2 valuestack

请考虑以下代码。

public class SampleAction {
  private  String[] sampleArray1 = new String[]{"item1","item2","item3"};
  private  String[] sampleArray2 = new String[]{"a","b","c"};
  private List lst = new ArrayList();
  lst.add(1)
  lst.add(2)
  //Getters and setters
}

当我们尝试在JSP中访问它时,上面的哪些属性将在值栈中?它是否像普通堆栈一样工作,即继续推送它读取的任何属性?

2 个答案:

答案 0 :(得分:7)

我认为你很困惑:Struts2在堆栈中放置的不是属性,而是包含这些属性的对象。

在你的jsp中写一下你写的

 <s:property value="xxx" />

然后Struts2将在您的堆栈中迭代以查找具有属性xxx的对象,即具有公共方法getXxx()的类。 Struts2将当前操作(SampleAction的实例)放在堆栈顶部。因此,它将首先搜索SampleAction.getXxx()方法 - 如果找不到,它将在堆栈中向下看。 (实际上你可以将其他对象放在堆栈中,在Action之上 - 也许在同一个jps中 - 但让它保持简单)。

然后,在您的示例中,所有sampleArray1 sampleArray2 lst(如果他们有公共getter)将在jsp中可访问。但是并不是sampleArray1在堆栈中“(甚至更少其元素!),动作在堆栈中。

所以,例如你可以写:

<s:iterator value="sampleArray1">
  <p>item is: <s:property/></p>
</s:iterator>

这里,在第一行中,在动作中找到sampleArray1属性,即在堆栈中。然后迭代器标记将sampleArray1中的每个值放在值堆栈的顶部,然后在第二行中抓取并打印。

答案 1 :(得分:1)

价值堆栈

Struts-2使用值堆栈来存储重要对象。 ActionInstance和成员变量存储在值栈中,JSP可以通过值栈访问它。

注意:值堆栈表现为虚拟对象。

如果两个成员变量具有相同的名称,值堆栈如何处理冲突? 值堆栈接收成员变量请求,然后如果成员变量名称匹配则从头到尾搜索,它将值发送到JSP。要访问特定成员变量,我们必须访问或遍历对象图。