向值栈里面放数据(储存的位置在root域里面)
向值栈放数据有多种方式,往往我们只用其中一种
1.set方法压栈
1)在Action中获取值栈对象,使用set()方法向值栈存放数据
ActionContext.getContext().getValueStack().set("key","value");
2)在jsp中获取值栈数据,根据set方法的名称(key)获取
<s:property value="key"></s:property>
2.push方法压栈
1)在Action中获取值栈对象,使用push()方法向值栈存放数据,push方法只有设置的值(value),没有名称(key)
ActionContext.getContext().getValueStack().push("XXX");
2)push()方法会把值栈中存放的数据存到top数组中,push的取值方法有点特殊,是通过直接把栈顶元素取出来的。
3)在jsp中获取push方法设置的值,根据top数组获取值
<s:property value="[0].tap"></s:property>//这里的top是root的域实体对象名称,也就是List对象的名称
3.在action定义变量,生成变量的get方法
向值栈中放对象
实现步骤:
第一步:定义对象变量
第二步:生成变量的get方法
第三步:在执行的方法里面向对象中设置值
向值栈中放List对象
第一步:定义List集合变量
第二步:生成变量的get方法
第三步:在执行的方法里面向List集合设置值
4.扩展
值栈:在struts2里面提供了本身的一种存储机制,类似于域对象,是值栈,可以存值和取值。
servlet和action的区别:
Servlet:默认在第一次访问的时候创建,只创建一次,是一个单例对象!!
Action:一样是访问的时候创建对象,每次访问action的时候都会创建新的action对象,创建多次,是一个多实例对象!!
值栈的存储位置:
- 每次访问action的时候都会创建action对象。
- 在每个action对象里面都会有一个值栈对象。(注意:每个action对象只有一个)(在同一个action值栈只有一个)
获取值栈对象有多种方式!
- 常用的方式:使用ActionContext对象里面的方法(getValueStack())获取值栈对象。
值栈内部结构
栈:先进后出!
最上面是栈顶的元素,向栈里面放数据的操作叫做压栈。
值栈分为两个部分,root和context
root专业叫做ObjectStack(对象栈)
context专业叫做ContextMap(Map栈),Map类型的栈。(在我们访问里面的对象的时候,会通过出栈的方式取东西,效率比较低,一般我们不会用)
root结构是List集合
context结构是Map集合
(要想查看到值栈的结构可以用调试(debug)的方法,通过struts2的标签<s:debug></s:debug>,值栈确实分为两个部分,一个root,一个context
)