九、值栈(数据传递的介质)

一、什么是值栈?

==> Struts2是在有请求到达的时候为每个请求创建一个新的值栈,也就是说值栈和请求是一一对应的,值栈封装了一次请求所需要的所有数据。因此,Strus2引入值栈最主要的目的,就是在页面与Action之间进行数据交换。
  其作用:用于在前台-后台之间传递数据,最典型的做法就是将Struts2标签与OGNL表达式的结合,ValueStack(值栈)实际上是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是OGNL的基础。

值栈封装了一次请求所需要的所有相关数据,要获取值栈中存储的数据,首先应该获取值栈。
因此,这种一一对应的关系使值栈能够线程安全的为每个请求提供公共的数据存取服务。
  ValueStack的生命周期是随着request的创建而创建,随request的销毁而销毁。
  ValueStack贯穿整个 Action 的生命周期,每个Action 类的对象实例都拥有一个ValueStack对象, 在其中保存当前Action 对象和其他相关对象。Struts2框架把ValueStack 对象保存在名为 “struts.valueStack” 的request属性中,也就是说ValueStack与Action的生命周期保持一致。

二、如何获取值栈

方法一:在request中获取值栈

request.setAttribute(“struts.valueStack”,valuestack对象);

方法二:在ActionContext中获取值栈

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

三、值栈内部组成

ObjectStack(对象栈):是CompoundRoot类型,用ArrayList定义,Struts2把动作和相关对象压入ObjectStack中。

ContextMap(Map栈):是OgnlContext类型,是个Map集合,Struts2 把各种各样的映射关系(一些Map类型的对象)压入ContextMap中。

四、应用方式

  • 属性驱动:每次请求访问Action的对象时,Action中的属性对象会被自动压入ValueStack中。
  • 模型驱动:Action如果实现了ModelDriven接口,那么ModelDrivenInterceptor拦截器会生效,会将model对象压入到valueStack中。

  在Struts2中,同样支持使用EL表达式直接访问值栈中的数据,只需把页面取值表达式换成EL表达式即可。

五、OGNL表达式

  OGNL的全称是对象图导航语言(Object-Graph Navigation Language)
是一种功能强大的开源表达式语言,可以通过某种表达式语法,存取Java对象的任意属性,调用Java对象的方法,同时能够自动实现必要的类型转换。是Struts2默认的表达式语言。

1.支持对象方法调用。
objName.methodName();
2.支持类静态方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名]。
java.lang.String@format(‘foo %s’, ‘bar’);
3.支持赋值操作和表达式串联。

例如:price=100,discount=0.8,calculatePrice(),在方法中进行乘法计算会返回80。

4.访问OGNL上下文(OGNL context)和ActionContext。
5.操作集合对象。

OGNL结构的三个要素

1.表达式

  OGNL的getValue()方法中有两个参数:第一个参数是表达式。OGNL会根据表达式去对象中取值。所有OGNL操作都是针对表达式解析后进行的。

2.Root对象

  OGNL的getValue()方法中的第二个参数就是Root对象,Root对象可以理解为OGNL的操作对象

3.Context对象

  Root对象所在环境就是OGNL的上下文环境(Context)。上下文环境Context是一个Map类型的对象,在表达式中访问Context中的对象,需要使用“#”号加上对象名称,即“#对象名称”的形式。

OGNL的调用方式

OGNL表达式是通过“对象名.方法名()”的形式来调用对象方法表达式的
Ognl.getValue("方法名", 对象名);


作者: 肖sir@ZHBIT
2018 年 09月 27日


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容