什么是值栈?
��1.之前在web阶段,在servlet里面进行操作,把数据放到域对象里面,在页面中使用el表达式获取到,域对象在一定范围内,存值和取值。
��2.在Struts2里面本身提供一种存储机制,类似域对象,是值栈,可以存值和取值。
在action里面把数据放到值栈里面,在页面中获取到值栈数据。
servlet和action区别:
Servlet:默认在第一次访问时创建,创建一次,单实例对象
Action:访问时创建,每次访问action时,都会创建action对象,创建多次,多实例对象
值栈存储位置
1.每次访问action时,都会创建action对象,在每个action对象里面都会有一个值栈对象(只有一个)
获取值栈对象:
-在action中使用ActionContext类(可以获取表单数据的类)里的方法得到值栈
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
每个action对象中只有一个值栈对象。
值栈内部结构:
栈:后进先出,栈中最上面的元素就是栈顶元素 。
1.主要操作root部分,结构是list集合。另一部分是context,结构是map集合
2.context结构存储的对象引用 key值有“request,session,application,parameters,attr” 对应的值分别是对应对象的引用。attr值是获取域对象里面的值,获取域范围最小里面的值。
3.Struts2里面标签s:debug,使用这个标签可以查看值栈结构和存储值。通过action访问有该标签的jsp页面。
4.在action中没有任何操作的话,栈顶元素是该action的路径
action对象里面有值栈对象,值栈对象里面有action引用。
向值栈放数据方式(需要继承ActionSupport类):
在action定义变量,生成变量的get方法(常用)。还有使用值栈对象里面的set或push这两种方法。
使用set方法会分配一个map空间,在action中定义变量的方法可以减少空间的分配。
向值栈中放对象(需要继承ActionSupport类):
方法类似于向值栈中放入数据,在action中定义对象变量并创建对象,生成对象的get方法,在执行方法中set变量值。
向值栈中放list集合(需要继承ActionSupport类):
在action中首先定义list变量,再生成get方法,然后再方法中向list中创建对象并给对象设置值。
从值栈中获取数据
使用struts2的标签+ognl表达式获取值栈数据
<s:property value="ognl表达式"/>
获取对象
在action中定义对象变量并创建对象,生成对象的get方法,在执行方法中给相应的对象set变量值。 ognl表达式为”对象.变量值"。
获取list集合
使用struts2标签类似jstl的foreach标签,<s:iterator>,遍历值栈的list集合
①<s:iterator value="list"> //list是创建的list集合对象名
<s:property value="变量1"/>
<s:property value="变量2"/>
<s:property value="变量3"/>
</s:iterator>
html注释标签不能注释带有标签的属性,jsp注释标签可以注释。
②<s:iterator value="list" var=“user”>
//此方式机制:把每次遍历出来的user对象放到context里面,获取context里面数据特点就是写ognl表达式,使用特舒符号#
<s:property value="#user.变量1"/>
<s:property value="#user.变量2"/>
<s:property value="#user.变量3"/>
</s:iterator>
ognl表达式%使用
在Struts2标签里面使用ognl表达式,如果直接在Struts2表单标签里面使用ognl表达式不识别,只有%之后才会识别。
格式:<s:textfield name="username" value="%{request.req}"></s:textfield>