栈值的内存区域的介绍

中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属性。而运行一下下面的代码就可以看到:

//在request域中设置一个参数

ServletActionContext.getRequest().setAttribute("req_username","req_username");

//在request域中设置一个参数

ServletActionContext.getRequest().setAttribute("req_psw", "req_psw");

//在session域中设置一个参数

ActionContext.getContext().getSession().put("session_username", "session_username");

//在session域中设置一个参数

ActionContext.getContext().getSession().put("session_psw", "session_psw");

//获取OGNL值栈

ValueStack valueStack = ActionContext.getContext().getValueStack();

 

   在_values的map中:

                                  

key

value

application

ApplicationMap

request

RequestMap

action

自己写的action

com.opensymphony.xwork2.ActionContext.session

SessionMap

而request中的值为:

{

       req_psw=req_psw,

       req_username=req_username,

       __cleanup_recursion_counter=1,

       struts.valueStack=com.opensymphony.xwork2.ognl.OgnlValueStack@3d58b2,

       struts.actionMapping=org.apache.struts2.dispatcher.mapper.ActionMapping@1f713ed

}

 

                

可以看出在程序中存放在request作用域的值被放入到了_values的request域中。

而com.opensymphony.xwork2.ActionContext.session的值为:

 
 

{session_username=session_username, session_psw=session_psw}

 

从上图中可以看出在程序中被加入到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

猜你喜欢

转载自www.cnblogs.com/biaogejiushibiao/p/9380190.html
今日推荐