一、OGNL概述

  1.1OGNL是对象图导航语言(Object-Graph Navigation Languaged)的缩写,他是一种功能强大的表达式语言,通过简单一致的表达式语法,可以存取Java对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型的转化功能。他使用相同的表达式去存取对象的属性。如果吧表达式看作一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与java对象之间沟通的桥梁。

  1.2OGNL的要素

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

    根对象(ROOT):Root对象可以理解为OGNL的操作对象,表达式规定了“做什么”,而Root对象则规定了“对谁操作"。OGNL称为对象图导航语言,所谓对象图,就是以任意对象为根,通过OGNL可以访问这个对象关联的其他。

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

二值栈的概述

    在struts2里面提供本身一种存储机制,类似于域对象,是值栈,可以存值和取值
      在action里面把数据放到值栈里面,在页面中获取到值栈数据
    servlet和action区别
         Servlet:默认在第一次访问时候创建,创建一次,单实例对象
         Action:访问时候创建,每次访问action时候,都会创建action对象,创建多次
    值栈存储位置
每次访问action时候,都会创建action对象
在每个action对象里面都会有一个值栈对象(只有一个)
 
注:每个action对象总只有一个值栈对象

  2.1ValueStack是Struts的一个借口,字面意义为值栈,OgnlValueStack是ValueStack的一个实现类,客户端发起一个请求struts2架构会创建一个action'对象实例,同时也创建一个OgnlValueStack值栈实例,OgnlValueStack会贯穿真个Action的生命周期,struts2中使用OGNL将请求Action的参数封装为对象存储到值栈中,并通过OGNL表达式读取值栈中的对象属性值。

  2.2值栈的内部结构

在OgnlValueStack中包括两部分:  

第一部分 root,结构是list集合一般操作都是root里面数据

   

          第二部分 context,结构为map集合

注:可以在页面中使用<s:debug/>这个标签产看值栈结构和存储值。

三、对值栈的存取操作   

 3.1获取值栈对象

        1.通过ActionContext对象获取值栈

      

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

        2.通过request获取值栈

ValueStack stack2 = (ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

 3.2对值栈的操作

      1.向值栈中放数据:可以通过值栈的set,push方法或者在action中提供成员变量然后提供get方法即可。

          

      2.从值栈中取数据:使用struts2的标签+ognl表达式获取值栈数据 <s:property value=”ognl表达式”/>

          获取对象:

向值栈中放数据

在页面中获取

           获取list集合:

第二种实现方式:

        获取set方法向值栈中放入的数据:

         获取push方法向值栈中放入的数据:

使用push方法设置值,没有名称,只有设置的值

向值栈放数据,把向值栈放数据存到数组里面,数组名称 top,根据数组获取值

EL表达式获取值栈数据:

底层增强request对象里面的方法getAttribute方法

(1)首先从request域获取值,如果获取到,直接返回

(2)如果从request域获取不到值,到值栈中把值获取出来,把值放到域对象里面

四、 OGNL的#,%的使用

4.11.使用#获取context里面的数据

4.12.演示向request域中放值,在页面用ognl获取

4.2%号的使用

  在struts2标签里面使用ognl表达式,如果直接在struts2表单标签里面使用ognl表达式不识别,只有%之后才会识别。

最新文章

  1. iOS开发系列--打造自己的&ldquo;美图秀秀&rdquo;
  2. Entity Framework 数据库先行、模型先行、代码先行
  3. TCP connect的错误返回值
  4. Unix/Linux进程间通信(一):概述
  5. ReportingServies——SQLServer报表开发综合实例
  6. svm特征
  7. PopupWindwo和AlertDialog的区别
  8. WPF 中如何使用第三方控件 ,可以使用WindowsFormsHost 类
  9. bzoj 1924 [Sdoi2010]所驼门王的宝藏(构图,SCC,DP)
  10. cloudstack安装篇3-SELinux配置、NTP时间同步、配置ClouStack软件库
  11. O2O的理解
  12. Java导入证书失败Keystore was tampered with, or password was incorrect
  13. Week15(12月19日):授课综述2
  14. 一个解析RTSP 的URL函数
  15. C/C++中static关键字的用法
  16. 基于HTML5的WebGL经典3D虚拟机房漫游动画
  17. [Swift]LeetCode34. 在排序数组中查找元素的第一个和最后一个位置 | Find First and Last Position of Element in Sorted Array
  18. 万维网(WWW)
  19. Kibana简单使用教程
  20. 学习WPF——使用Font-Awesome图标字体(一)

热门文章

  1. 《SQL必知必会》读书笔记
  2. Scala中 object 和 class的区别
  3. 【Linux】 升级CentOS6的内核到3.10
  4. RxJS -- Subscription
  5. Matlab绘图基础——图形修饰处理(入门)
  6. PHP对大小写敏感问题
  7. Beta 第二天
  8. js计时功能
  9. 项目Beta冲刺预热
  10. 高校学生征信系统Postmortem结果