Struts2中:值栈(ValueStack)、值栈中的Action实例、Struts2中的其他命名对象 小结

值栈(ValueStack)

  Struts2将OGNL上下文设置为Struts2中的ActionContext(内部使用的仍然是OgnlContext),并将值栈设为OGNL的根对象。   我们知道,OGNL上下文中的根对象可以直接访问,不需要使用任何特殊的“标记”,而引用上下文中的其他对象则需要使用“#”来标记。由于值栈是上下文中的根对象,因此可以直接访问。那么对于值栈中的对象该如何访问呢?Struts2提供了一个特殊的OGNLPropertyAccessor,它可以自动查找值栈内的所有对象(从栈顶到栈底),直接找到一个具有你所查找的属性的对象,找不到,就报错。也就是说,对于值栈中的任何对象都可以直接访问,而不需要使用“#”。       假设值栈中有两个对象:student和employee,两个对象都有name属性,student有学号属性number,而employee有薪水属性salary。employee先入栈;而student后入栈,位于栈顶,那么对于表达式name,访问的就是student的name属性,因为student对象位于栈顶;表达式salary,访问的就是employee的salary属性。正如你所见,访问值栈中的对象属性或方法,无须指明对象,也不用“#”,就好像值栈中的对象都是OGNL上下文中的根对象一样。这就是Struts2在OGNL基础上做出的改进。

值栈中的Action实例

  Struts2框架总是把Action实例放在栈顶。因为Action在值栈中,而值栈又是OGNL中的根,所以引用Action的属性可以省略“#”标记,这也是为什么我们在结果页面中可以直接访问Action的属性的原因。

Struts2中的其他命名对象

  Struts2还提供了一些命名对象,这些对象没有保存在值栈中,而是保存在ActionContext中,因此访问这些对象需要使用“#”标记。这些命名对象都是Map类型。   

parameters

  用于访问请求参数。如:#parameters['id'] 或 #parameters.id ,相当于调用了HttpServletRequest对象的getParameter()方法。       注意,parameters本质上是一个使用HttpServletRequest对象中的请求参数构造的Map对象,一旦对象被创建(在调用Action实例之前就已经创建好了),它和HttpServletRequest对象就没有了任何关系。 

request

  用于访问请求属性。如:#request['user'] 或 #request.user ,相当于调用了HttpServletRequest对象的getAttribute()方法。   

session

  用于访问session属性。如:#session['user'] 或 #session.user ,相当于调用了HttpSession对象的getAttribute()方法。

application

  用于访问application属性。如:#application 或 #application.user ,相当于调用了ServletContext对象的getAttribute()方法。   

attr

  如果PageContext可用,则访问PageContext,否则依次搜索request、session和application对象。


先分清楚下ActionContext 、ValueStack 、Stack Context三者:

ActionContext   一次Action调用就会创建一个ActionContext。即OGNL上下文。   调用:ActionContext context = ActionContext.getContext()

ValueStack   由OGNL框架实现。   可以把它简单的看作一个栈(List)。 存放表单中的值。

Stack Context(map)   是栈上下文,它包含一系列对象,包括request/session/attr/application的Map等。 (就是传说中的大Map)

Stack Object   放入stack中的对象,默认是动作类。


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏androidBlog

Rxjava 2.x 源码系列 - 变换操作符 Map(上)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

7620
来自专栏小樱的经验随笔

Codeforces 810C Do you want a date?(数学,前缀和)

C. Do you want a date? time limit per test:2 seconds memory limit per test:256 m...

27450
来自专栏公众号_薛勤的博客

Apache Commons Codec的Base64加解密库

下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi

12640
来自专栏编程心路

SSH框架之旅-struts2(3)

OGNL,全称是 Object-Graph Navigation Language(对象导航语言),是一种功能强大的开源表达式语言,通过简单的表达式语法就可以存...

13560
来自专栏Java3y

Struts2【OGNL、ValueStack】

什么是OGNL表达式? OGNL是Object Graphic Navigation Language 是操作对象属性的开源表达式。 Struts2框架使用OG...

35470
来自专栏前端黑板报

Javascript即将迎来Optional Chaining

Optional Chaining 现在处于 Stage 1。 它是什么? Optional Chaining 使我们能检查一个对象上面是否存在某属性。其它一些...

37750
来自专栏爱撒谎的男孩

Struts2之OGNL的使用

42250
来自专栏PHP在线

CTF之PHP黑魔法总结

php黑魔法,是以前做CTF时遇到并记录的,很适合在做CTF代码审计的时候翻翻看看。 一、要求变量原值不同但md5或sha1相同的情况下 1.0e开头的全部相等...

70680
来自专栏LanceToBigData

struts2(六)之ognl表达式与ActionContext、ValueStack

前言   前面已经把struts2讲内容说了一半了,我写的很详细,希望对博友们有帮助。 一、OGNL表达式语言概述 1.1、OGNL表达式简介   百度上是这样...

31070
来自专栏拭心的安卓进阶之路

RxJava 1.x 笔记:创建型操作符

本篇文章是阅读 官方文档 的笔记。  作者:shixinzhang RxJava 也用了有段时间,那么多操作符总不想去记,遇到了才去查一下,查的次数多了感觉效率...

25580

扫码关注云+社区

领取腾讯云代金券