Struts2中的OGNL表达式
一、OGNL表达式简介
OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象。通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
Struts2框架使用OGNL作为默认的表达式语言
二、OGNL三要素和五大功能
三大要素:
(1).expression 求值表达式——首先会被解析成对象树
(2).rootobject 根对象——默认的操作对象
(3).context OGNL执行环境——OGNL执行的上下文环境
OGNL context是一个Map结构,ognl.OgnlContext类implements Map接口,root对象也在context里面,并且做为一个特殊的对象处理,具体表现为对root对象的操作不需要加#指示符号(并且加上了#一定取不到root对象里面的值)。
OGNL中的Ognl类提供了一些额静态方法用于对comtext中的对象进行操作。
五大功能
(1)支持对象方法调用,如xxx.doSomeSpecial();
(2)支持类静态的方法调用和值访问
(3)访问OGNL上下文(OGNL context)和ActionContext; (重点 操作ValueStack值栈 )
(4)支持赋值操作和表达式串联
(5)操作集合对象。
三、Struts2中OGNL
OGNL的功能非常强大,Struts2在原生的OGNL上又做了一些扩展。比如在Struts2中使用valueStack来作为数据存储的载体,并且在Strtus2扩展的OGNL中,root对象可以不只是一个。在Strtus2中的Root使用的是CompoundRoot对象,而CompoundRoot继承了ArrayList,所以他可以存储一系列的对象,这些对象可以看作是OGNL中的root对象。当我们当问某个属性时,CompoundRootAccessor对象实例会负责在CompoundRoot对象中找到包含我们指定属性的对象。一般情况下我们只会接触到OGNL的一小部分功能,所以我们就主要学习一下我们可能会用到的知识点。
四、valueStack
1、对于每个动作调用,Struts2在执行相应的动作方法之前会先创建一个名为valueStack的对象。valueStack用来保存该动作对象和其他对象。在对动作进行处理的过程中,拦截器需要访问valueStack,视图也需要访问valueStack才能显示动作和其他信息。
valueStack的内部包含两个逻辑部分,一个叫做Object Stack,另一个叫做Context Map。Struts2将动作和相关对象压入Object Stack,把各种各样的映射关系(Map类型的对象)压入Context Map。其中的Object Stack中的对象都相当于OGNL中的”root”对象,因此对他们可以直接访问。如果要访问Context Map中的对象,那么就得在OGNL表达式前面加上”#”符号。如果没有加”#”,那么Struts2默认会在Object Stack中进行搜索。
Strut2会把下面的这些映射关系压入到Context Map中:
(1) parameters:这个Map中包含当前请求的请求参数
(2) request:包含当前请求的所有属性
(3) session:包含当前请求的会话的所有属性
(4) pplication:包含当前应用程序的ServletContext属性
(5) attr:这个Map用来按照这个顺序来检索某个属性:request、session、application
注意:请求参数总是返回一个String类型的数组。比如我们要想知道请求参数的个数,那么正确的表达式应该是#parameters.count[0],而不是#parameters.count。
2、Object Stack
访问Object Stack里某个对象的属性,可以使用一下几种形式:
(1) object.propertyName
(2) object[‘propertyName’]
(3) object[“propertyName”]
另外,Object Stack里的对象还可以通过一个从零开始的下索引来引用。最顶端的对象用[0]来引用,以此类推。Strtus2中Action对象一定是位于valueStack的最顶端。
例如:[0].propertyName [0][‘propertyName’] [0][“propertyName”]
Struts2中的OGNL还有个特征:如果我们指定的对象上没有找到指定的属性,那么会到指定对象的下一个对象里继续搜索,直到找到这个属性或者到达栈低。(其实现原理就是我们上面说的CompoundRoot和CompoundRootAccessor)。
还有就是如果我们指定的属性本身也是对象,那么还可以通过同样的语法去访问这个属性对象的属性。例如:user.name.firstName。
3、Context Map
访问Context Map上的属性的方法我们在介绍valueStack的时候已经学习过了。这里要说的是如果我们访问的属性也是对象,那么还可以通过同样的语法来访问它的属性。例如:#request[“User”][“name”]。
五、静态属性和方法
OGNL除了能够调用压入valueStack中的对象外,还能对任意的Java类的静态属性和方法进行调用。其表达式形式如下:
调用静态属性: @类的全称(含包名)@静态属性名
调用静态方法: @类的全称(含包名)@静态方法名(参数列表)
对于压入valueStack中的对象,如果要调用其方法,直接使用object.methodName(arglist)形式进行调用.
六、投影与选择
OGNL支持类似数据库中的投影(projection) 和选择(selection)。
投影就是选出集合中每个元素的相同属性组成新的集合,类似于关系数据库的字段操作。投影操作语法为 collection.{XXX},其中XXX 是这个集合中每个元素的公共属性。
例如:group.userList.{username}将获得某个group中的所有user的username属性列表。
选择就是过滤满足selection 条件的集合元素,类似于关系数据库的纪录操作。选择操作的语法为:collection.{X YYY},其中X 是一个选择操作符,后面则是选择用的逻辑表达式。而选择操作符有三种:
? 选择满足条件的所有元素
^ 选择满足条件的第一个元素
$ 选择满足条件的最后一个元素
例如:group.userList.{?#this.name != null}将获得某个group中user的name不为空的user的列表。
七、几种与OGNL有关的符号
在Struts2中使用OGNL经常会接触到几个有关的符号:”#”,”%”,”$”。刚开始学习的时候经常分布清楚这几个符号的作用,这里我们对他们的作用大致做一个列举。
“#”的作用:
(1)访问非root对象的属性。例如:#session[“userName”]
(2)对集合进行投影与选择
(3)构造对象,
“%”的作用:
在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式 <s:property value="%{#foobar['foo1']}" />
“$”的作用:
(1)在配置文件中引用OGNL表达式(访问Action的属性)。
(2)在国际化资源文件中引用OGNL表达式(学习国际化时会学到)
八、OGNL中的this指针
在很多编程语言中,都有this指针的概念,它表示调用当前函数(方法)的对象。那么在OGNL中也有类似的概念。
我们已经学过,OGNL表达式是以”.”进行串联的的一个串字符串表达式。这个表达式在被执行的时候,从左到右,每一次计算都会返回一个临时的当前对象,并在此临时对象上再次进行调用,直到执行完毕。这个临时的当前变量就存储在一个叫做this的变量中,这个this变量我们就叫它this指针。通过使用this指针,我们可以是OGNL更加灵活,更加强大。
注:使用this指针时,必须在this前面加”#”,即this指针必须以“#this”的形式出现。
例如:group.userList.size().(#this+1).toString()
Struts2中的OGNL表达式的更多相关文章
- (补充)9.Struts2中的OGNL表达式
OGNL表达式概述 1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写 * 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关 ...
- struts2中使用ognl表达式时各种符号的使用规则$,#,%
OGNL表达式struts2标签“%,#,$” 一.什么是OGNL,有什么特点? OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言.是一 ...
- 2018.11.24 struts2中的OGNL表达式及两者的结合
OGNL表达式 OGNL:对象视图导航语言. ${user.addr.name} 这种写法就叫对象视图导航. OGNL不仅仅可以视图导航.支持比EL表达式更加丰富的功能. 理解图示 使用OGNL准备工 ...
- Struts2中使用OGNL表达式语言访问静态方法和静态属性
1.一定要在struts.xml配置文件中配置允许使用OGNL访问静态方法,否则不能使用OGNL访问静态方法 2.<s:property value="@com.gk.StaticTe ...
- [转]STRUTS2中的OGNL
OGNL表达式是(Object-Graph Navigation Language)是对象图形化导航语言.OGNL是一个开源的项目,struts2中默认使用OGNL表达式语言来显示数据.与serlve ...
- 在Struts2框架中使用OGNL表达式(在jsp页面中使用OGNL表达式)
1. Struts2引入了OGNL表达式,主要是在JSP页面中获取值栈中的值 2. 具体在Struts2中怎么使用呢?如下步骤 * 需要先引入Struts2的标签库(在JSP页面的最上面位置) > ...
- struts2框架之OGNL表达式概述(在代码中使用OGNL表达式)
1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写 * 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象 * 通 ...
- struts2中的OGNL详解
先了解一下OGNL的概念 OGNL的全名称Object Graph Navigation Language.全称为对象图导航语言,是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取J ...
- 浅析Struts2中的OGNL和ValueStack
要了解Struts2与OGNL表达式的关系,我们必须先搞清楚以下三个概念: 1. ActionContext它是Action运行的上下文环境,Action的多项设置都存放在次,我们每一次Action ...
随机推荐
- JavaWeb学习总结(十二)——Session(转)
一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...
- Python入门--16--模块
模块的定义: 模块是一个包含所有你定义的函数和变量的文件,其后缀是.py.模块可以被别的程序引入,以使用该模块中的函数等功能 比如 import random secret=random.randin ...
- dedecms--二次开发文章内容页未登录禁止访问和同一个帐号只允许一个ip登录
最近在用dedecms二次开发会员功能,领导要求,会员未登录不允许访问文章内容页,和同一个账号只允许一个ip登录,我是将这两个在一起判断的,判断session存不存在,不存在的情况下就是未登录,这时候 ...
- consul UI用127可以访问,指定ip无法访问
./consul agent -dev 只能127.0.0.1可以访问 ./consul agent -dev -client 0.0.0.0 -ui 指定ip可以访问
- poj 3204(最小割--关键割边)
Ikki's Story I - Road Reconstruction Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 7 ...
- jq 全选、反选、判断选中的条数
1.全选或全不选.当勾选全选按钮#selectAll旁边的复选框#all时,列表中的选项全部选中,反之取消勾选则列表中的选项全部为未选中状态. $("#all").click(fu ...
- Jmeter骚操作—文件上传、下载
最近很多同学都在问jmeter上传.下载文件的脚本怎么做,要压测上传.下载文件的功能,脚本怎么做,网上查了都说的很含糊,这次呢,咱们就好好的把jmeter的上传下载文件好好缕缕,都整明白了,怎么个过程 ...
- mysql InnoDb存储引擎索引
B+树索引:使用B+树索引查找数据时,并不能找到一个给定键值的具体行,只是找到被查找数据行所在的页,然后数据库通过把页读取到内存,再在内存中进行查找,最后得到要查找的数据. 聚集索引:按照表中主键构造 ...
- Leetcode总结之Union Find
package UnionFind; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; p ...
- BT种子文件文件结构分析(转)
估计80%以上接触互联网的人都知道bt是什么东西,任何一个用bt下载的人都知道这样一个概念,种子.bt种子就是记录了p2p对等网络中tracker, nodes, files等信息,也就是说,这个种子 ...