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
上面的代码都是往ContextMap中存放数据。因为这些值都是具有映射关系的。
方法2
通过执行上述代码把”msg”和”msg_object”放入到了ContextMap中。
值栈中存数据
最后被压入到list中的对象在最下面。
方法2
新创建的Student对象被放到了第一个位置,因为
Index的值为0,所以是第一个位置。
方法3
把一个键值对存放在对象栈中
方法4
Push方法把新创建的Person对象放入到了对象栈的首个位置。
小结:
把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中的属性就赋值了
对象栈:把属性放入到对象栈中
说明
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中的属性就赋值了
对象栈:把属性放入到对象栈中
相关文章推荐
- JQuery+Strusts1.x无刷新登录
- java struts常见错误以及原因分析
- Struts之logic标签库详解
- 通过实例深入学习Java的Struts框架中的OGNL表达式使用
- Java的Struts框架中append标签与generator标签的使用
- struts2的select标签用法实例分析
- SSH框架网上商城项目第20战之在线支付平台
- 在Java的Struts框架下进行web编程的入门教程
- 详解Java的Struts框架中注释的用法
- java中struts 框架的实现
- 利用Java的Struts框架实现电子邮件发送功能
- 在Java的Struts框架中ONGL表达式的基础使用入门
- 详解Java的Struts框架中栈值和OGNL的使用
- Java的Struts框架简介与环境配置教程
- Java的Struts框架中的if/else标签使用详解
- 简单说明Java的Struts框架中merge标签的使用方法
- 详解Java的Struts框架中上传文件和客户端验证的实现
- Java的Struts框架中Action的编写与拦截器的使用方法
- sprng和struts有什么区别?
- Java的Struts框架中<results>标签的使用方法