zoukankan      html  css  js  c++  java
  • Struts2中的值栈

     1关于值栈

    1)在项目时,我们用${productName}来读取ProductName的值,实际上该属性并不是在request等域对象中,而是从值栈中获取到的
    2.valueStack
    1)可以在ActionContext中获取值栈对象
    2)值栈可以分为两个逻辑部分

    >Map栈:实际上就是OGNLContext类型,也就是一个Map,也是对ActonContext的一个引用里边保存着各种Map对象;
    例如requestMap,sessionMap,applicationMap,parameterMap,attr等对象,这些跟Servlet对象差不多,

    >对象栈:就是真正存好信息的对象栈,实际上就是CompoundRoot类型,是一个使用ArrayList定义的栈,里边保存着各种和当前Action实例相关的对象
    是一个真正意义上的栈,保存的信息:action 中的属性

    2.....Struts2利用s:property标签和OGNL表达式来读取值栈中的属性值
    1)...值栈中的属性值

    >对于对象栈:对象栈中某一个对象的属性值

    >Map栈:request,Session,application,attr的一个属性值或一个请求参数的值,attr可以引用访问其他各种对象,例如list,Map


    2)..读取对象栈中的对象属性:

    >若想访问 Object Stack 里的某个对象的属性. 可以使用以下几种形式之一:
    Object.PropertyName,Object['propertyName'] ,object["propertyName"]
    >ObjectStack 里的对象可以通过一个从零开始的下标来引用. ObjectStack 里的栈顶对象可以用 [0] 来引用,
    它下面的那个对象可以用 [1] 引用. 若希望返回栈顶对象的 message 属性值:
    [0].message 或 [0][“message”] 或 [0][‘message’]
    >若在指定的对象里没有找到指定的属性, 则到指定对象的下一个对象里继续搜索. 即 [n] 的含义是从第 n 个开始搜索,
    而不是只搜索第 n 个对象
    >若从栈顶对象开始搜索, 则可以省略下标部分
    例如打印productName的属性值:${productName}

    >结合s:property标签(可以打印对应属性的值):<s:property value="productName"/>等同于<s:property value="[0].productName"/>


    3)默认的情况下,Action对象会被Struts2自动的放到值栈的栈顶
    2读取Map栈的属性的值
    在属性名称面前添加#号就可以访问:例如 访问ProductName > <s:property value=" #session.Product.ProductName"/>


    2 Struts2会自动的把Action对象放入值栈中

    1)放入的时间为:当Action终将调用Action类的Action方法之前,具体的实现过程如下;
    >先创建一个Struts2 Actionproxy对象
    >在创建StrutsActionproxy之后,对其进行初始化时,把Action对象放入值栈中


    2)个人理解:
    【每次发生一个Action请求时,并不是把立刻跳到相应的Action中,而是先生成一Action实例,把Action实例的属性都放入值栈中,
    此时放入值栈的Action对象的属性还是没有赋值的只是默认值,然后当执行到Action相对应的方法时,会自动的把属性和Action请求信息中的属性一一匹配】
    (可以在值栈放入Action之前进行调试,了解全过程CompoundRoot的add()方法设置断点)

    就是存放action的堆栈,当我们提交一个请求道服务器端 action时,就有个堆栈,如果action在服务器端进行跳转,所有action共用一个堆栈,当需要保存在action中的数据时,首先从栈顶开始 搜索,若找到相同的属性名(与要获得的数据的属性名相同)时,即将值取出,但这种情况可能出现找到的值不是我们想要的值,那么解决此问题需要用TOP语法 和N语法来进行解决。 
    当在客服端进行跳转时,当有请求提交到服务器的action时,只有一个堆栈存在,堆栈中存放的是当前的请求的action,而原来那么则销毁了

    当有请求的时候,Struts2会为每个请求创建一个新的值栈,也就是说,栈和请求是一一对应的,不同的请求,值栈也不一样,而值栈封装了一次请求所有需要操作的相关的数据。

    正是因为值栈和请求的对应关系,因此值栈能保证线程安全的为每个请求提供公共的数据存取服务。

    而值栈是怎样产生的呢??伴随Action请求而产生
    值栈怎样获得呢?ValueStack valueStack=ActionContext.getContext().getValueStack();




































  • 相关阅读:
    半夜的时候,干了个活,反了个小软件
    bzoj2243[SDOI2011]染色
    bzoj4034[HAOI2015]T2
    bzoj2661[BeiJing wc2012]连连看
    bzoj1406[AHOI2007]密码箱
    bzoj1452[JSOI2009]Count
    bzoj1934[Shoi2007]Vote 善意的投票
    bzoj1787[Ahoi2008]Meet 紧急集合&bzoj1832[AHOI2008]聚会
    bzoj1293[SCOI2009]生日礼物
    bzoj1221[HNOI2001] 软件开发
  • 原文地址:https://www.cnblogs.com/jeremy-blog/p/3990120.html
Copyright © 2011-2022 走看看