struts2_valueStack(二)

来源:互联网 发布:sketchup是什么软件 编辑:程序博客网 时间:2024/06/05 11:10

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中的属性就赋值了
对象栈:把属性放入到对象栈中

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2个月宝宝拉稀水怎么办 2个月的宝宝腹泻怎么办 2个月的宝宝拉稀怎么办 宝宝不喝补液盐怎么办 4个月宝宝腹泻怎么办 6个月宝宝腹泻怎么办 四个月的宝宝拉肚子怎么办 7个月婴儿便秘怎么办 宝宝9个月拉肚子怎么办 2个月宝宝拉肚子怎么办 4个月宝宝没奶怎么办 宝宝又吐又拉怎么办 冬季车放在外面怎么办 冬天车放在外面怎么办 新车被拖走了要怎么办 门钥匙拔不出来怎么办 婴儿换尿布就哭怎么办 芥末吃多了胃疼怎么办 孕妇吃了甜白酒怎么办 43岁意外怀二胎怎么办 38岁意外怀二胎怎么办 脚崴了没有肿怎么办 我出轨了怎么办很痛苦 老公有了小三老婆应该怎么办 厦门学生卡丢了怎么办 比熊嘴巴毛发黄怎么办 比熊犬不吃狗粮怎么办 泰迪不吃不喝怎么办 贵宾狗不吃狗粮怎么办 比熊犬突然呕吐怎么办 胃不舒服怎么办想吐恶心 比熊幼犬没精神怎么办 比熊呕吐不吃饭怎么办 比熊拉稀不爱动怎么办 幼狗晚上一直叫怎么办 比熊半夜一直叫怎么办 比熊总是呜呜叫怎么办 比熊晚上老是叫怎么办 比熊幼犬晚上叫怎么办 玩游戏动感情了怎么办 80端口被4占用怎么办