首先声明:本文是从博客园博友的文章转载过来的,感觉说的不错。在此附上地址:http://www.cnblogs.com/jerryxing/archive/2012/04/23/2467299.html

通过对struts2的一段时间的接触,将自己对OGNL的核心值栈说说。值栈:简单的说,就是存放action的堆栈,当我们提交一个请求道server端 action时,就有个堆栈,假设action在server端进行跳转,全部action共用一个堆栈,当须要保存在action中的数据时,首先从栈顶開始
搜索。若找到同样的属性名(与要获得的数据的属性名同样)时,即将值取出。但这样的情况可能出现找到的值不是我们想要的值。那么解决此问题须要用TOP语法 和N语法来进行解决。

当在客服端进行跳转时。当有请求提交到server的action时,仅仅有一个堆栈存在,堆栈中存放的是当前的请求的action。而原来那么则销毁了(本人观 点,感觉如同request请求一样)。 



  众所周知。Struts2的Action类通过属性能够获得全部相关的值,如请求參数、Action配置參数、向其它Action传递属性值(通过chain结果)等等。要获得 这些參数值,我们要做的唯一一件事就是在Action类中声明与參数同名的属性,在Struts 2调用Action类的Action方法(默认是execute方法)之前,就会为对应的Action属性赋值。

  要完毕这个功能,有非常大程度上。Struts 2要依赖于ValueStack对象。这个对象贯穿整个Action的生命周期(每一个Action类的对象实例会拥有一个ValueStack对象)。当 Struts 2接收到一个.action的请求后,会先建立Action类的对象实例。但并不会调用Action方法。而是先将Action类的对应属性放到
ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。仅仅是全部的属性值都是默认的值。如String类型的属性值为 null,int类型的属性值为0等。

  在处理完上述工作后。Struts 2就会调用拦截器链中的拦截器。当调用全然部的拦截器后,最后会调用Action类的Action方法,在调用Action方法之前,会将 ValueStack对象顶层节点中的属性值赋给Action类中对应的属性。大家要注意,在这里就给我们带来了非常大的灵活性。也就是说。在Struts 2调用拦截器的过程中,能够改变ValueStack对象中属性的值。当改变某个属性值后。Action类的对应属性值就会变成在拦截器中最后改变该属性
的这个值。 



  从上面的描写叙述非常easy知道。在Struts 2的的Action类能够获得与属性同名的參数值就是通过不同的拦截器来处理的。如获得请求參数的拦截器是params,获得Action的配置參数的拦 截器是staticParams等。在这些拦截器内部读取对应的值,并更新ValueStack对象顶层节点的对应属性的值。而ValueStack对象
就象一个传送带,将属性值从一个拦截器传到了还有一个拦截器(当然。在这其间。属性值可能改变),最后会传到Action对象,并将ValueStack对 象中的属性的值终值赋给Action类的对应属性 



 众所周知,Strut 2的Action类通过属性能够获得全部相关的值,如请求參数、Action配置參数、向其它Action传递属性值(通过chain结果)等等。

要获得 这些參数值,我们要做的唯一一件事就是在Action类中声明与參数同名的属性,在Struts 2调用Action类的Action方法(默认是execute方法)之前,就会为对应的Action属性赋值。 



  要完毕这个功能。有非常大程度上,Struts 2要依赖于ValueStack对象。

这个对象贯穿整个Action的生命周期(每一个Action类的对象实例会拥有一个ValueStack对象)。当 Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的对应属性放到
ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。仅仅是全部的属性值都是默认的值,如String类型的属性值为 null,int类型的属性值为0等。 



  在处理完上述工作后,Struts 2就会调用拦截器链中的拦截器,当调用全然部的拦截器后,最后会调用Action类的Action方法。在调用Action方法之前,会将 ValueStack对象顶层节点中的属性值赋给Action类中对应的属性。大家要注意,在这里就给我们带来了非常大的灵活性。也就是说。在Struts 2调用拦截器的过程中。能够改变ValueStack对象中属性的值,当改变某个属性值后。Action类的对应属性值就会变成在拦截器中最后改变该属性
的这个值。 



  从上面的描写叙述非常easy知道,在Struts 2的的Action类能够获得与属性同名的參数值就是通过不同的拦截器来处理的。如获得请求參数的拦截器是params,获得Action的配置參数的拦 截器是staticParams等。在这些拦截器内部读取对应的值,并更新ValueStack对象顶层节点的对应属性的值。而ValueStack对象
就象一个传送带。将属性值从一个拦截器传到了还有一个拦截器(当然,在这其间,属性值可能改变),最后会传到Action对象。并将ValueStack对 象中的属性的值终值赋给Action类的对应属性.

struts Value Stack 值栈的更多相关文章

  1. Struts学习之值栈的理解

    转自:http://blog.csdn.net/hanxuemin12345/article/details/38559979 页面一个请求发送过来,依次经过一系列拦截器(处理公共部分,如:往数据中心 ...

  2. Struts2学习记录-Value Stack(值栈)和OGNL表达式

    仅仅是学习记录.把我知道的都说出来 一.值栈的作用 记录处理当前请求的action的数据. 二,小样例 有两个action:Action1和Action2 Action1有两个属性:name和pass ...

  3. Ognl值栈对象及struts标签

    用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionContext对象:然后把Action对象放入值栈中: 最后再把值栈对象放入request中,传入jsp页面 ...

  4. Struts2 (三) — OGNL与值栈

    一.OGNL表达式 1.概述 1.1什么是OGNL ​ OGNL是Object-Graph Navigation Language的缩写,俗称对象图导航语言. 它是一种功能强大的表达式语言,通过它简单 ...

  5. 10.Struts2值栈

    1.什么是值栈 * 值栈就相当于Struts2框架的数据的中转站,向值栈存入一些数据.从值栈中获取到数据. * ValueStack 是 struts2 提供一个接口,实现类 OgnlValueSta ...

  6. struts2中的值栈对象ValueStack

    ValueStack, 即值栈对象. 值栈对象: 是整个struts数据存储的核心,或者叫中转站. 用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionCont ...

  7. Struts2 值栈总结(ValueStack)

    1.获取值栈 //获取值栈的第一种方式 ValueStack valueStack1 = (ValueStack) ServletActionContext.getRequest().getAttri ...

  8. 请描述一下Struts2的值栈结构,以及它是如何工作的?

    值栈 Value Stack 值栈是Struts2框架的核心概念.所有的核心组件都以某种方式与之进行交互,它提供对上下文信息和执行环境中元素的访问机制.值栈的内容由如下4个层级组成. 1.临时对象 这 ...

  9. Struts(九):值栈(OGNL)

    引言 在我们开发过程中,往往会使用一个对像传递到一个具体的action中,之后到跳转页面中访问对应对象的具体的参数. 比如:我们搭建一个struts2项目: 回顾下如何搭建strut2: 1.下载的s ...

随机推荐

  1. Activity四种launchMode

    更多内容在这里查看 https://ahangchen.gitbooks.io/windy-afternoon/content/ 总共有四篇关于Activity,task,launchMode的文章, ...

  2. MFC 全部自绘控件 界面库

    http://download.csdn.net/detail/q97082645/8160793 http://download.csdn.net/user/q97082645/uploads/3

  3. ios jsbrige

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  4. svn 问题汇总

    1.当删除了原来的仓库时,再次新建,更新版本时会出现这个问题:

  5. [置顶] 请听一个故事------>你真的认为iPhone只是一部手机?苹果惊天秘密!!

    在网上看到的一篇小说,感觉有点意思,转载过来大家一起围观下,作者很幽默很风趣. 导读:iPhone的隐藏功能!Jobs的军方身份!图灵服毒自杀的传奇故事!中兴华为的神秘背景! 你真的认为iPhone只 ...

  6. android 屏幕适配问题【转】

      如何将一个应用程序适配在不同的手机上,虽然这不算是一个技术问题,但是对于刚刚做屏幕的开发人员来说,还真不是一件多么简单的事情. 首先:你需要在AndroidManifest.xml文件的<m ...

  7. C#DataTable DataSet DataRow区别详解

    DataSet 是C#中用来存储数据库数据的.其实,它的作用是在内存中模拟数据库.我们现实生活中的数据库从大到小的基本结构类似于:数据库实例,表,列,行.在C#语言中,我们在内存中也模拟出了一个这样的 ...

  8. 8月9日,PS、计算机基础(预科)

    一.   PS         掌握简单的图标修改. 1.图层                 2.保存PSD格式,有图层:JPG格式,没有图层.                 3.魔棒工具(调整值 ...

  9. MSSQL 当前会话设置隔离级别与查询

    之前因为MySQL没有with(nolock)这种写法,于是想设置隔离级别,结果被坑. 直觉以为和MSSQL一样只要打set transaction isolation level xxx 就能搞定 ...

  10. c# 小数的处理

    数值类型处理小数 1.Math.Round(x) 四舍五入      Math.Round(0.4) 0     Math.Round(-1.7) -2 2.Math.floor(x) 小于等于 x, ...