框架学习之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=”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表达式不识别,只有%之后才会识别。

时间: 2024-10-28 15:25:50

框架学习之Struts2(三)---OGNL和值栈的相关文章

Struts2 (三) — OGNL与值栈

一.OGNL表达式 1.概述 1.1什么是OGNL ? OGNL是Object-Graph Navigation Language的缩写,俗称对象图导航语言. 它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能. ? Eg: hibernate 查询方式 : 对象导航查询. ? 其实就是查询出来了一个对象之后,通过对象里面的getXXX() 来获取关联的对象. ? 它是一个开源项目,并不是struts发明

Struts2.x教程(二) OGNL和值栈

一.OGNL是什么 OGNL(Object Graph Nvigation Language,对象图导航语言)是一个开源的表达式引擎.通过使用OGNL的表达式语法可以存取Java对象树的任意属性和调用Java对象树的方法等. 我们通过一个示例来了解OGNL. 分别创建三个实体类(全部省略了getter.setter方法): //学生类 public class Student { private String name; private Integer age; private Grade gr

YMP框架学习笔记(三)------处理器、控制器、拦截器

一.处理器 1.事件处理器 添加类WebEventHandler.java并继承IWebEventHandler public class WebEventHandler implements IWebEventHandler { public void onInitialized() { } public void onRequestReceived(IRequestContext context) { } public void onRequestCompleted(IRequestCont

struts2框架学习笔记5:OGNL表达式

OGNL取值范围分两部分,root.Context两部分 可以放置任何对象作为ROOT,CONTEXT中必须是Map键值对 示例: 准备工作: public void fun1() throws Exception { // 准备ONGLContext // 准备Root User rootUser = new User("tom", 18); // 准备Context Map<String, User> context = new HashMap<String, U

走进Struts2(五)— 值栈和OGNL

值栈 1.值栈是什么? 简单说:就是对应每一个请求对象的轻量级的内存数据中心. Struts2引入值栈最大的好处就是:在大多数情况下,用户根本无须关心值栈,不管它在哪里,不用管它里面有什么,只需要去获取自己需要的数据就可以了. 2.值栈能干什么? 简单说:就是能够线程安全的为每一个请求提供公共的数据式服务. 3.值栈包含Map栈和对象栈,值栈通过ActionContext的getValueStack()方法来获取值栈,但是在通常情况下,向valuestack中压入值都是由Struts2去完成的,

OGNL表达式&amp;值栈&amp;拦截器

OGNL 什么是ognl OGNL是Object-Graph Navigation Language的缩写,对象图导航语言. 他并不是Struts2的一部分,他只是经常和Struts2一起使用 ognl有啥作用 支持对象方法的调用 支持静态方法的调用和值访问 来操作值栈中的数据,访问OGNL上下文和ActionContext 操作集合对象 ognl的要素 Root对象 Context对象 值栈 什么是值栈 Struts2将XWork对Ognl的扩展这一套机制封装起来,这个对象叫ValueStac

OGNL与值栈

一.OGNL入门 1.什么是OGNL OGNL的全称是对象图导航语言(Object-Graph Navigation Language),它是一种功能强大的开源表达式语言.使用这种表达式语言,可以通过使用某种表达式语言,来存取Java对象的任意属性,调用Java的方法,同时能够自动实现必要的数据类型转换, 2.OGNL的作用 Struts2默认的表达式语言就是ognl表达式语言,该语句具有以下的特点 支持对象方法的调用.例如:objectName.methodName(). 支持静态方法调用和值

Ognl表达式 值栈对象ValueStack

ValueStack值栈主要包含另个部分: 1.map栈(非根元素) context:主要存储域对象. 2.list栈(根元素) root:主要存储 (1)通过值栈的push()方法存放的对象 (2)Map对象(通过值栈的set()方法存放的数据) (3)Action对象 (4)其他代理对象. 测试类OgnlDemo2 <span style="font-size:14px;"><span style="font-family:Courier New;&qu

Struts工作机制图+OGNL+EL+值栈(Map,对象栈)

struts 值栈  通过get set方法 方便的获取,设置属性值      比如从jsp页面传来的參数...从Action设置jsp所要回显的内容 注意EL表达式,struts2对request进行了封装,所以它的查找顺序 多了一个findvalue() 如上图 再看以下的代码: public class UserAction { private String username; //查看用户的具体信息 public String detail(){ username = "张三"