Struts2中的ValueStack如何工作?

Vin*_*C M 0 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
}
Run Code Online (Sandbox Code Playgroud)

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

leo*_*loy 7

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

让我们在你写的jsp中说

 <s:property value="xxx" />
Run Code Online (Sandbox Code Playgroud)

然后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>
Run Code Online (Sandbox Code Playgroud)

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