struts2_valueStack(二)

ValueStack
说明
1、ValueStack是一个接口,在struts2中使用OGNL表达式实际上是使用实现了ValueStack接口的类OgnlValueStack,这个类是OgnlValueStack的基础。
2、ValueStack贯穿整个action的生命周期。每一个action实例都拥有一个ValueStack对象。其中保存了当前action对象和其他相关对象。
3、Struts2把ValueStack对象保存中名为struts.valueStack的request域中。

valueStack

说明:
1、上图是ognl完整的数据结构图,可以清晰得看出数据的组成。
2、Context中的_root和ValueStack中的root(对象栈)里的数据结构和值是一样的。
3、这就意味着我们只需要操作OgnlContext就可以完成对数据的存和取的操作。
4、ValueStack内部有两个逻辑的组成部分:
a)ObjectStack
Struts会把动作和相关的对象压入到ObjectStack中。
b)ContextMap
Struts会把一些映射关系压入到ContextMap中

存数据
方法1

//向map中存放数据
ServletActionContext.getRequest().setAttribute("req_username","req_username");
ServletActionContext.getRequest().setAttribute("req_psw", "req_psw");
ActionContext.getContext().getSession().put("session_username", "session_username");
ActionContext.getContext().getSession().put("session_psw", "session_psw");

上面的代码都是往ContextMap中存放数据。因为这些值都是具有映射关系的。

方法2

ActionContext.getContext().put("msg", "msg_object");

通过执行上述代码把”msg”和”msg_object”放入到了ContextMap中。

值栈中存数据

/*
 * 把对象放入到值栈中
 */
//方法一:先得到root,把一个对象压入到root中
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.getRoot().add(new Person());
valueStack.getRoot().add(new Student());

最后被压入到list中的对象在最下面。

方法2

/*
 * 方法二:先得到root,利用add(index,Object)把一个对象压入到root中
 *      这里index指的是集合中的位置
 */
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.getRoot().add(new Person());
valueStack.getRoot().add(0, new Student());

新创建的Student对象被放到了第一个位置,因为
Index的值为0,所以是第一个位置。

方法3
把一个键值对存放在对象栈中

*
 * 方法三:
 *          把一个键值对存放在对象栈中
 */

ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.set("msg","msg_object");

方法4

/*
 * 方法4
 *      利用ValueStack的push方法可以把一个对象直接压入对象栈的第一个位置
 */
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.push(new Person());

Push方法把新创建的Person对象放入到了对象栈的首个位置。

小结:

1、获取valueStack的三种方式
    ValueStack valueStack = ActionContext.getContext().getValueStack();
    ValueStack valueStack2 = ServletActionContext.getContext().getValueStack();
    ValueStack valueStack3 = (ValueStack)ServletActionContext.getRequest().getAttribute("struts.valueStack");
2、valueStack的生命周期是一次请求
3、valueStack的内存结构:
     root:对象栈
     context:OgnlContext
          _root:对象栈
          _values:map栈
4、对象栈的操作
    1、把数据放入到对象栈中
        valueStack.push  放入到对象栈的栈顶
        valueStack.getRoot().add("aaaa");  放入到了对象栈的栈底
        ActionContext.getContext().getValueStack().set("aaa", "asfd");  把一个map放入到了对象栈的栈顶
        valueStack.getRoot().add(0,"aaaa"); 放入到了对象栈的栈顶
    2、从对象栈中把数据提取出来
        ActionContext.getContext().getValueStack().getRoot().get(0);
        ActionContext.getContext().getValueStack().peek();
           获取对象栈的栈顶的元素
    3、移除栈顶元素
         ActionContext.getContext().getValueStack().getRoot().remove(0);
         ActionContext.getContext().getValueStack().pop();
5、map栈的操作
    1、可以把一个对象放入到map栈中的reuqest域中
        ServletActionContext.getRequest().setAttribute("aaa", "aaa");
    2、可以把一个对象放入到map栈的application域中
        ServletActionContext.getServletContext().setAttribute("aaaa", "aaaa");
    3、可以把一个对象放入到map栈中
        ActionContext.getContext().put("aaa", "aaaa");

把valueStack中的数据显示到页面上

2、struts2的标签
1、引入标签库
<%@ taglib prefix=”s” uri=”/struts-tags” %>
标签库的位置在struts2-core-2.3.1.2.jar包中的META-INF/struts-tags.tld
2、s:debug
是一个超级链接,当点击该超级链接的时候,valueStack中的内容显示出来了
3、访问valueStack中的数据
1、如果要访问map栈中的数据,加”#”
2、如果要访问对象栈中的数据,直接访问属性即可
4、s:property标签
说明:
1、是一个输出标签
2、如果不写value属性,输出栈顶的元素
3、如果执行了下面的代码
Person person = new Person();
person.setPid(1L);
person.setName(“王二麻子”);
//把person对象放入到了栈顶
ActionContext.getContext().getValueStack().push(person);
把对象放入到栈顶,其属性会直接暴漏出来,在页面上可以直接访问其属性

其页面上的对象栈中的属性的名称来自于方法
4、如果一个对象在对象栈中,那么该对象如果有set或者get方法,例如:
getAaa(){
return “xxx”;
}
那么aaa会作为属性的名称,xxx会作为属性的值保存在对象栈中
5、如果对象栈中出现相同的属性,则会从上向下找,直到找到就停止了
6、如果把一个对象放入到request域中
ServletActionContext.getRequest().setAttribute(“person”, person);
页面上可以


7、如果把一个对象放入到各种域中
ServletActionContext.getServletContext().setAttribute(“a_app”, “a_app”);
在页面上可以利用
从各种域中查找相应的key值
8、可以利用parameters输出表单中的内容

5、s:iterator标签
1、当value属性不写,则默认迭代栈顶的元素
2、value属性指向了要迭代的集合List,Set,Map,[]
3、当前正在迭代的元素在栈顶
4、var属性的值表示正在遍历的元素,该值在map栈中
5、status属性表示正在遍历的那一行的状态
int getCount() 返回当前迭代的元素个数
int getIndex() 返回当前迭代元素的索引
boolean isEven() 返回当前迭代元素的索引是否是偶数
boolean isOdd() 返回当前迭代元素的索引是否是奇数
boolean isFirst() 返回当前迭代元素是否为第一个元素
boolean isLast() 返回当前迭代元素是否为最后一个元素
6、使行变色

对象栈的作用:

1、页面上利用ognl表达式可以显示数据
2、可以利用对象栈的概念用s:iterator标签迭代很多层集合:
当前正在迭代的对象在栈顶
3、把数据放入到对象栈中,在页面上利用struts2标签中的name属性就可以回显
4、属性驱动利用了对象栈,可以利用valueStack.setValue/setParameter方法给对象栈中的属性赋值
拦截器和对象栈的结合:
拦截器负责整个过程:
1、把页面上的表单获取到map中
2、把map中的key,value赋值到对象栈中的属性中
3、这样给action中的属性就赋值了
对象栈:把属性放入到对象栈中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值