值栈
- 在struts2中提供的一种存储机制,类似于域对象,可以存值和取值
- 在action里把数据放到值栈中,在页面中获取到值栈数据
- servlet和action的区别:
- Servlet:默认在第一次访问时创建,只创建一次,单实例对象
- Action:访问时创建,每次访问action时,都会创建一个action对象,创建多次,多实例对象
- 值栈存储位置:
- 每次访问action时,都会创建action对象
- 在每个action对象里有且只有一个值栈对象
- 获取值栈对象:
- 常用方式:使用ActionContext类里面的方法得到值栈对象
- (ActionContext.getContext()).getValueStack()
- 常用方式:使用ActionContext类里面的方法得到值栈对象
- 值栈的内部结构:
- 分两部分
- 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>
- “`java
- 获取push方法设置的值
- 使用push方法设置的值没有名称,只有设置的值
- 用push方法向值栈放的数据都存在top数组中,根据数组来获取值
EL表达式也能获取到值栈中的值,但效率低,因为它先在域对象中找对应的值,如果找到则直接返回,如果没找到则到值栈中的获取,并放入域对象中
ognl中的#和%
- #:获取context中的数据, 如
<s:property value="#request.req"/>
- %:struts2标签中的表单标签
- 如果直接在struts2表单标签里使用ognl表达式不能够被识别。只有%之后才会识别。如
<s:textfield name="username" value="%{#request.req}"></s:textfield>
- 如果直接在struts2表单标签里使用ognl表达式不能够被识别。只有%之后才会识别。如