请考虑以下代码。
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中访问它时,上面的哪些属性将在值栈中?它是否像普通堆栈一样工作,即继续推送它读取的任何属性?
答案 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。要访问特定成员变量,我们必须访问或遍历对象图。