值栈
在struts2中提供的一种存储机制,类似于域对象,可以存值和取值在action里把数据放到值栈中,在页面中获取到值栈数据servlet和action的区别:
Servlet:默认在第一次访问时创建,只创建一次,单实例对象Action:访问时创建,每次访问action时,都会创建一个action对象,创建多次,多实例对象值栈存储位置:
每次访问action时,都会创建action对象在每个action对象里有且只有一个值栈对象获取值栈对象:
常用方式:使用ActionContext类里面的方法得到值栈对象
(ActionContext.getContext()).getValueStack()值栈的内部结构:
分两部分
root:继承ArrayLiat类,结构是list集合context:继承Map类,结构是map集合使用s:debug标签可以查看值栈结构和存储值值栈对象中有action的引用向值栈中存放数据的三种方式
获取值栈对象,调用值栈对象里的set方法获取值栈对象,调用值栈对象里的push方法在action中定义变量,生成变量的get方法
变量定义在action中,不用分配额外空间向值栈中存放对象
实现步骤:
定义对象变量生成变量的get方法在执行的方法里面设置对象的值
ognl
struts2默认的表达式语言,不属于struts2,但一般一起使用在struts2中操作值栈数据ognl.jar包在jsp页面引入ognl标签库<%@ taglib uri="/struts-tags" prefix="s"%>
ognl操作值栈
从值栈中获取数据
获取字符串:在jsp页面ognl标签中的name和值栈中的属性名相同,如获取对象:
获取list对象:
<s:property value="list[0].username"/>
“`java //遍历值栈list集合 *
* ```java
//用这种方式遍历会在值栈的
context部分分配一段临时空间,把遍历出来的user对象放到里面,因为
context是
map结构,所以放进去的key是ognl表达式var的值,value是遍历出来的user对象的引用。要取
context中的值在ognl表达式中要加#符号
<s:iterator value=
"list" value=
"user">
<s:
property value=
"#user.username"/>
<s:
property value=
"#user.password"/>
</s:iterator>获取push方法设置的值
使用push方法设置的值没有名称,只有设置的值用push方法向值栈放的数据都存在top数组中,根据数组来获取值
EL表达式也能获取到值栈中的值,但效率低,因为它先在域对象中找对应的值,如果找到则直接返回,如果没找到则到值栈中的获取,并放入域对象中
ognl中的#和%
#:获取context中的数据, 如<s:property value="#request.req"/>%:struts2标签中的表单标签
如果直接在struts2表单标签里使用ognl表达式不能够被识别。只有%之后才会识别。如<s:textfield name="username" value="%{#request.req}"></s:textfield>
转载请注明原文地址: https://ju.6miu.com/read-10218.html