原文地址:http://blog.csdn.net/wyply115/article/details/8257140

一、OGNL表达式

1.ognl是struts2中使用的一种表达式语言,可用于jsp的标签库中,以方便访问各种对象的属性。它用于把界面的参数传递到Action中(并进行类型转换),它还可以用于struts2的配置文件中。

2. Root对象。

  OGNL称为对象图导航语言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象,例如:

public class User{
private String username;
private Group group;
//省略setter,getter方法
}
public class Group{
private String name;
private Organization org;
//省略setter,getter方法
}
public class Organization{
private String orgId;
//省略setter,getter方法
}

以上三个类,描述了通过User对象可以导航到Group对象,进而导航到Organization对象。以User为根,通过基本的getters方法,可以访问到此根对象的其它关联对象.【对象图的导航,必须通过getters方法导航】。

注意:

  * 导航的目的,就是为了获取某个对象的值或设置某个对象的值或调用某个对象的方法.

  * OGNL表达式语言的真正目的,是为了在那些不能写java代码的地方执行java代码,或者是为了更方便的执行java代码.

3.Context对象

* 在OGNL表达式中,有可能需要访问到多个毫不相干的对象,这时候,我们需要给OGNL传递一个Map类型的对象,把表达式中需要用到的对象放到Map中即可.而这个Map对象称为Context。

  * 要在表达式访问到context中的对象,需要使用"#对象名称"的语法规则

  * 存在context的主要原因就是在OGNL中,不支持多个root对象,而如果需要在表达式中访问多个毫不相关的对象时,只能通过一个Map来把这些对象统一传递给OGNL。

二、ValueStack

  1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用实现了ValueStack接口的类OgnlValueStack.它ValueStack的默认实现类.

  2.ValueStack贯穿整个action的生命周期,每一个action实例都拥有一个ValueStack对象,其中保存了当前action对象和其他相关对象.

  3.struts2把ValueStack对象保存在名为:struts.valueStack的request域中.即ValueStack作用域为request.当action创建的时候,ValueStack就创建了,action被销毁的时候,ValueStack就销毁了

  4.ValueStack中的数据分两部分存放:root(栈结构,CompoundRoot)和context(map形式,OgnlContext) 

(1)

* 其中的root对象是CompoundRoot,CompoundRoot继承了ArrayList,提供了额外的方法:push(),和pop()方法,用来对root对象中所包含的数据进行存取.正是由于这两个方法,CompoundRoot变成了一个栈结构.

* struts2中,一个请求在最终到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack 的CompoundRoot中),所以action对象是CompoundRoot中的一个元素.

(2)

* 其中的context对象是OgnlContext,它实现了map接口,在valuestack的默认实现类中,即OgnlValueStack类中,调用ongl中的方法:Ognl.createDefaultContext(..)给context赋值,查看源代码可知,此方法返回的是一个OgnlContext对象.

  5.获取ValueStack的三种方式

(1)ValueStack valueStack = ActionContext.getContext().getValueStack();

    ActionContext为Action的上下文,其中有重要的6大对象valueStack,parameters,request,session,application,attr。而ognl表达式必须选择AcitonContext中的一个对象作为根对象(root),默认为valueStack,因此访问valueStack中的数据不加#,而如果要使用另外5个对象作为根对象,需要加#前缀。

  (2)ValueStack valueStack = ServletActionContext.getValueStack(ServletActionContext.getRequest());

  ServletActionContext继承了ActionContext,它与web容器耦合,可以获取web容器的一些信息.

  (3)ValueStack valueStack = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");

  因为ValueStack被置于Request域中。

  6.ValueStack内存结构图

  原博文图涉及底层实现细节,该图是我简化后,原博文图片(http://img.my.csdn.net/uploads/201212/04/1354620065_9013.png

  7.常用的存储数据的方法

  (1)向Map栈中存数据,即ValueStack中的context中存储数据。

    通过request, session等向map中存储数据:

  ServletActionContext.getRuquest().setAttribute("username","xxx") ;

  ServletActionContext.getSession().put("pwd","123");

   直接向Map栈中存放数据:

  ActionContext.getContext().put("msg","hello") ;

  (2)向对象栈中存数据,即ValueStack中的root(CompoundRoot)对象

  * 先得到root,再把数据压入到root中,这中方式是放入到栈底

ValueStack valueStack =ActionContext.getContext().getValueStack();
valueStack.getRoot().add(new Person());

* 先得到root,利用add(index,Object)把一个对象压入到root中指定位置.

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

 valueStack.getRoot().add(0,new Person());//这里0,表示压入栈顶.

* 存放一个map到对象栈中

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

valueStack.set("msg","dude"); //先封装成Map,在把Map放入到对象栈中,且放入栈顶.

* 利用valueStack的push方法把一个对象直接压入栈顶

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

valueStack.push(new Person());

8.利用OGNL表达式取ValueStack中的数据

(1)<s:property />:取栈顶的元素.
(2)<s:iterator />:取栈顶的元素.
注意:此标签的value属性值无论来自对象栈还是Map栈,都可以不加#前缀(<s:select/>标签也适用).
因为此标签在迭代的时候,总是把当前正在迭代的元素放入到栈顶.

  

Struts2_ValueStack,OGNL详解(转)的更多相关文章

  1. Struts2_ValueStack,OGNL详解

    一.ValueStack    1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用实现了Value ...

  2. OGNL详解

    A.什么是OGNL? 全称叫ObjectGraphic Navigation Language(对象图导航语言),它是struts2框架里面的第三方语言(即可以再别的地方用,struts2只是拿过来了 ...

  3. Strust OGNL详解

    首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...

  4. struts2中的OGNL详解

    先了解一下OGNL的概念 OGNL的全名称Object Graph Navigation Language.全称为对象图导航语言,是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取J ...

  5. java框架篇---struts之OGNL详解

    OGNL(Object Graph Navigation Language),是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性.调用Java对象树的方法. ...

  6. Struts2中的OGNL详解 《转》

    首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...

  7. struts OGNL详解

    首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...

  8. struts2中的ognl详解,摘抄

    http://blog.csdn.net/tjcyjd/article/details/6850203     很全很细致,自己再分析原理进阶

  9. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

随机推荐

  1. PHP获取当前页面的URL

    /** * 获取当前页面完整URL地址 * * @author 52php.cnblogs.com */ function http_get_page_url() { global $_G; if ( ...

  2. 限制帐号同时两处以上登录-ASP.NET

    ///登录页面 Hashtable haol = (Hashtable)Application["olTable"]; if (haol == null) { haol = new ...

  3. MySQL 视图

    一.视图是一种虚拟存在的表,并不在数据库中实际存在.数据来自于视频中查询使用的表,在使用视图时动态生成的. 二.视图的优势: (A) 简单:已经是过滤好的复合条件的结果集 (B) 安全:表的权限不能限 ...

  4. (原)android的alertdialog中加入edittext但是不弹出软键盘等问题的解决与原因

    摘要:alertdialog中加入edittext但是不弹出软键盘等问题网上有很多不管用的解决方案, 本文意在给出更有效的解决办法,并初步探究其原因 正文 在对话框中插入文本框是十分常见的需求 通常我 ...

  5. 【ZJOI2013】k大数查询 BZOJ 3110

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  6. .NET LINQ 联接运算

    联接运算      将两个数据源“联接”就是将一个数据源中的对象与另一个数据源中共享某个通用特性的对象关联起来.      当查询所面向的数据源相互之间具有无法直接领会的关系时,联接就成为一项重要的运 ...

  7. Hotaru's problem(hdu 5371)

    题意:给出一个数字串,询问最长的子串,满足以下要求:将子串平均分为三部分,一三部分相等,一二部分对衬. /* 在manachar的基础上,枚举回文串的中心,再找第三部分. */ #include< ...

  8. GitHub使用心得

    PHP今天算是学习结束了;版本控制也了解很久了,比较熟悉的是svn,Git一直都不太熟,也可能是它是英文的缘故,感觉很费劲,所以用的不多,但不得不说,它功能真的很强大;今天试着和朋友用Git开发一个简 ...

  9. Xshell5连接虚拟机出现连Could not connect to '192.168.47.128' (port 22): Connection failed,解决办法

    该日记写于2016年11月28日.在用Xshell5连接ubuntu虚拟OS时一直连接不上.出现这种情况的原因可能很多,有像百度上面说的没有关闭linux的防火墙,没有启动linux的ssh服务.但这 ...

  10. GitHub团队项目合作流程

    已在另一篇博客中写出关于以下问题的解决,点此进入: 同步团队项目到本地时出现冲突怎么办? 项目负责人merge一个Pull Request后发现有错怎么回退? 目录: 零.前期准备 一.创建开发分支 ...