首页 > 代码库 > 框架学习之Struts2(三)---OGNL和值栈

框架学习之Struts2(三)---OGNL和值栈

一、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=http://www.mamicode.com/”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表达式不识别,只有%之后才会识别。

技术分享

 

框架学习之Struts2(三)---OGNL和值栈