三、StrutsOGNL表达式与值栈

1、OGNL

1.1、OGZL 概述

  OGNL:对象图导航语言,比 EL 表达式强大很多倍的语言。

    EL:从域对象中获取数据,从 EL 的11和对象中获取。${name}、${pageContext.request.contextPAth}

    OGNL :调用对象的方法,获取 Struts2 的值栈的数据。OGNL 其实是第三方的表达式语言。

1.3、OGNL 的要素

  了解了什么是 OGNL 表达式及其特点以后,接下来,分析一下 OBNL 的结构。OGNL 的操作实际上就是围绕着 OGNL 结构的三个要素而进行的,分别是表达式(Expression)、根对象(Root Object)、上下文对象(Context),下面分别讲解这三个要素。

  表达式

  表达式是整个 OGNL 的核心,OGNL 会根据表达式去对象中取值。所有 OGNL 操作都是针对表达式解析后进行的。它表明了此次 OGNL 操作要“做什么”。表达式就是一个带有语法含义的字符串,这个字符串规定了操作的类型和操作的内容。OGNL 支持大量的表达式语法,不仅支持 这种“链式”对象访问路径,还支持在表达式中进行简单的计算。

  根对象(Root)

  Root 对象可以理解为 OGNL 的操作对象,表达式规定了“做什么”,而 Root 对象则规定了“对谁操作”。OGNL 称为对象图导航语言,所谓对象图,即以任意一个对象为根,通过 OGNL  可以i访问与这个对象相关的其他对象。

  Context 对象

  实际上 OGNL 的取值还需要一个上下文环境,设置 Root 对象,OGNL 可以对 Root 对象进行取值或写值等操作,Root 对象所在环境就是 OGNL 的上下文环境(Context)。上下文规定了 OGNL 的操作“在哪里进行”。上下文环境 Context 是一个 Map 类型的对象,在表达式中访问 Context 中的对象,需要使用“#”号加上对象名称,即“#对象名称”的形式。

1.4、OGNL 的 Java 环境入门 (了解)

1.4.1、访问对象的方法

 

1.4.2、访问对象的静态方法

1.4.3、访问 Root 中的数据(不加“#”)

  一般会向 Root 对象中存放 Java 对象,

1.4.4、访问 Context 中的数据(需要加“#”)

1.5、OGN L的入门:Struts2环境入门

  在 Struts2 使用 OGNL 主要式获取一些数据,主要是在页面上获取数据,所以说 OGNL 在 Struts2 中的应用主要也是在页面上。

  在 Struts2 环境中默认不允许访问静态成员,需要开启一个常量。

  在 Struts2 环境下,想要获取 Root 或者 Context 中的数据,这个就必须经过Action,Action 需要向里面存值,这就涉及到 Struts2 的值栈了。

 

 

2、值栈(ValueStack)

2.1、值栈的概述

2.1.1、什么是值栈

ValueStack 其实类似于一个数据中转站(Struts2 的框架当中的数据就都保存到了 ValueStack 中)。

  ValueStack 接口,实现类 OgnlValueStack 对象。

  ValueStack 贯穿整个 Action 的生命周期(Action 一旦创建了,框架就会创建一个 ValueStack 对象 )。

2.1.2、值栈的内部结构

  ① 查看源代码(OgnlValueStack)

  ② 通过 DeBug 运行

  ③ 通过 DeBug  标签

ValueStack 中有两个主要的区域:

  root 区域:其实就是一个 ArrayList。里边一般放置对象(获取 Root 的数据不需要加 #)。

  context区域:其实就是一个 Map。里边放置是 Web 开发的常用的对象数据的引用(获取 Context 的数据需要加 #)。

    request

    session

    application

    parameters

    attr

所说的操作值栈,通常指的是操作 ValueStack 中的 Root 区域。

2.1.3、值栈与 ActionContext 的关系

ServvletContext:Servlet 的上下文。

ActionContext:Action 的上下文。

  通过源码看到:当请求过来的时候,执行过滤器中的 doFilter 方法,在这个方法中创建 ActionContext,在创建 ActionContext 过程中,创建 ValueStack 对象 ,将 ValueStack 对象床底给ActionContext 对象。所以可以通过 ActionConntext 获取值栈对象。

  Actioncontext 对象之所以能够访问 Servlet 的 API (访问是域对象的数据),因为在其内部有值栈的引用。

2.1.4、获得值栈

通过 ActionContext  对象获取值栈。

在 Struts2 的内部,将值栈存入 request 中一份。

 

一个 Action 的实例,只会创建一个 ValueStack 的对象;一个 ValueStack 的对象只能被一个 Action 实例创建。

2.1.5、操作值栈(向值栈中存入数据——Root 区域)

在 Action 中提供属性的 get 方法的方式。

  默认情况下,将 Action对象压入到值栈。Action 的属性呢?(也会在值栈中)

 

使用 ValueStack  中本身的方法的方式。

 

 

 

 

  利用 Action 本身就在值栈中的特性,不习惯于用这种。要是传递太多的数据,会导致 Action 中太乱了。都会在这里有方法,往页面上传数据也会传很多;导致在这里定义的属性,属性的get/set 方法特别多,Action 就特别长,让人读起来很乱,容易降低 Action 的可读性。

  取的是栈顶的数据,同名数据取栈顶的,即最后后存入的数据。

2.1.6、获得值栈数据

获得值栈中的数据就是在页面中使用 OGNL 表达式即可。

  获取 root 的数据:不需要加 #;

   获取 context 的数据:需要加 #;

 

2.1.7、EL 为什么可以访问值栈数据

   因为 Struts2 的框架的底层对 request.getAttribute{String nsme} 进行了增强;

 

 

3、OGNL 中的特殊字符

3.1、# 号

3.1.1、获取 context 得分数据

3.1.2、使用 #  号构建 Map

 

3.2、% 号

  Struts2 中的标签,有的属性会强制识别为 OGNL 表达式,有的会强制不识别为 OGNL 表达式。

3.2.1、强制解析为 OGNL

 

3.2.2、强制不解析  OGNL(没用)

 

 

 传统标签可以,但 Struts2 标签不可以再嵌套标签。

 

3.3、$ 号

  在再配置文件中变量,需要使用到 $,会被识别为 OGNL。

放在值栈

 

 

转载于:https://www.cnblogs.com/xifengbuqi/p/9748960.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值