您的位置:首页 > 编程语言 > Java开发

struts2_valueStack(二)

2016-06-23 16:14 423 查看
ValueStack

说明

1、ValueStack是一个接口,在struts2中使用OGNL表达式实际上是使用实现了ValueStack接口的类OgnlValueStack,这个类是OgnlValueStack的基础。

2、ValueStack贯穿整个action的生命周期。每一个action实例都拥有一个ValueStack对象。其中保存了当前action对象和其他相关对象。

3、Struts2把ValueStack对象保存中名为struts.valueStack的request域中。



说明:

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中的属性就赋值了

对象栈:把属性放入到对象栈中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts struts2.0