中1.值栈和ognl表达式:
1.只要是一个MVC框架,必须解决数据的存和取的问题
2.struts2利用值栈来存数据,所以值栈是一个存储数据的内存结构
1、 ValueStack是一个接口,在struts2中使用OGNL表达式实际上是使用实现了ValueStack接口的类 OgnlValueStack,这个类是OgnlValueStack的基础。
2、 ValueStack贯穿整个action的生命周期。每一个action实例都拥有一个ValueStack对象。其中保 存了当前action对象和其他相关对象。
3、 Struts2把ValueStack对象保存中名为struts.valueStack的request域中。
3.把数据存放在值栈中,在页面上利用ognl表达式显示出来
4.ognl框架对象导航语言
5.ognl类图:
2.值栈的生命周期:
1.一次请求;
3.值栈的内存结构:
1.获取值栈路径:
2.说明:
1、 值是一样的,说明只有一个对象
2、 因为有一种是从request域中获取的,所以是一次请求
3内存结构:
1.大致图:
2.详细图:
说明:
_root:(CompoundRoot)
_values:(HashMap)这里存放request、response、session、application等servlet容器
2._root图的放大:
说明:
和ValueStack中的root是一致的
值栈的内存总图:
说明:
从上图中可以看出valueStack总共分为两个部分:
对象栈:root
Map栈:_values
1.1.1 OgnlContext组织结构
1.1.1.1 _values
从上述可以看出,OgnlContext实际上有一部分功能是Map。所以可以看出_values就是一个Map属性。而运行一下下面的代码就可以看到:
|
在_values的map中:
key |
value |
application |
ApplicationMap |
request |
RequestMap |
action |
自己写的action |
com.opensymphony.xwork2.ActionContext.session |
SessionMap |
而request中的值为:
|
可以看出在程序中存放在request作用域的值被放入到了_values的request域中。
而com.opensymphony.xwork2.ActionContext.session的值为:
|
从上图中可以看出在程序中被加入到session的值在_values中也体现出来。
1.1.1.2 _root
从图中可以看出_root实际上CompoundRoot类,从类的组织结构图中可以看出,这个类实际上是继承了ArrayList类,也就是说这个类具有集合的功能。而且在默认情况下,集合类的第一个为ValueStackAction,也就是我们自己写的action。
4.存放数据到值栈:
1.1对象栈的存放:
方法1:
Push方法:
方法二:
add方法:
1.2.对象栈的提取(栈顶):
从上图可以看出,peek方法为获取对象栈的栈顶元素;
这行代码也可以获取对象栈的栈顶元素;
1.3.对象栈元素的弹出:
1.4.操作对象栈中的对象:
说明:可以利用valueStack的setParameter方法改变对象栈中的属性值;
关于对象栈:
从图中可以看出来,对象栈的属性来自于对象栈中的每一个对象的属性的get方法;
把一个对象放进对象栈中:
在<s:dubug></s:dubug>中:
如果在对象栈中存在两个相同的属性:案例:两个name
上述的两个类中都同时有name属性,而且当前请求的action在对象栈中
利用该方法就把person对象放入到栈顶了
可以利用上述的方法改变对象栈中的name属性,但是从上往下找,只要找到一个,改变了值就完事了。
2.Map栈的存放:
改方法将一个字符串放到map栈中的request域中;
通过该方法可以把一个字符串放入到map栈中的application域中
通过该方法可以把一个字符串放入到map栈中
5.Threadlocal:
1.本地线程类;
2.可以存放一个对象;
3.Threadlocal对象只能当前线程访问,不能被其他线程访问;
4.传递参数;
案例:
说明:通过参数的传递,一个字符串很容易的从客户端传递到tl1中的tl1方法,再传递到tl2中的tl2方法
2.
说明:
在TL1Super中用到一个字符串
在TL2Super中用到同样的字符串,但是这两个类是完全松耦合,这个时候要用
Threadlocal传递数据,因为不管是否是送耦合的,但是可以肯定在同一个线程中。所以可以得到同一个线程threadlocal对象中的数据
6.显示值栈中的数据:
6.1:Ognl标签:
6.1.1:准备:
1.导入标签库:
2.标签库位置:
3.action类:
4.作用:可以通过网页的形式把valueStack中值提取出来;
6.1.2:Property标签:输出标签
属性分析:value: 指定要输出的内容;如果在对象栈中直接指定属性也可以直接调用方法;如果在Map栈中,用 # 指定,如果value属性不写,则默认输出栈顶的元素;
一:访问对象栈中的元素:
页面上:
把一个对象放入到对象栈中,可以利用s:prototype标签的value属性直接访问
该对象的属性。如果对象栈中出现两个相同的属性,则prototype标签的value属性会
从栈顶往下查找,直到找到为止。赋值的为第一个。
把一个对象放入到map中,再把map放入到对象栈中,在页面上可以利用
二:利用该标签访问Map栈中的元素:
注意:加 # 号访问
7.
8.
9