OGNL表达式概述:
OGNL 是Object Graph Navigation Language 的简称,OGNL 是一个对象,属性的查询语言。在OGNL 中有一个类型为Map 的Context (称为上下文),在这个上下文中有一个根元素(root),对根元素的属性的访问可以直接使用属性名字,但是对于其他非根元素属性的访问必须加上特殊符号#.在Struts2中上下文为ActionContext,根元素位ValueStack(值堆栈,值堆栈代表了一族对象而不是一个对象,其中Action类的实例也属于值堆栈的一个).因为Action实例被放在ValueStack中,而ValueStack又是根元素(root)中的一个,所以对Action 中的属性的访问可以不使用标记# ,而对其他的访问都必须使用#标记。
OGNL
表达式的作用:
1. 基本对象树的访问
对象树的访问就是通过使用点号将对象的引用串联起来进行。
例如:name,department.name,user.department.factory.manager.name
2. 对容器变量的访问
对容器变量的访问,通过#符号加上表达式进行。
例如:#name,#department.name,#user.department.factory.manager.name
3. 使用操作符号
OGNL表达式中能使用的操作符基本跟Java里的操作符一样,除了能使用 +, -, *, /, ++, --, ==, !=, = 等操作符之外,还能使用 mod, in, not in等。
4. 容器、数组、对象
OGNL支持对数组和ArrayList等容器的顺序访问:
例如:group.users[0]
同时,OGNL支持对Map的按键值查找:
例如:#session['mySessionPropKey']
不仅如此,OGNL还支持容器的构造的表达式:
例如:{"green", "red", "blue"}构造一个List,#{"key1" : "value1", "key2" : "value2", "key3" : "value3"}构造一个Map
你也可以通过任意类对象的构造函数进行对象新建:
例如:new java.net.URL("http://localhost/")
5. 对静态方法或变量的访问
要引用类的静态方法和字段,他们的表达方式是一样的@class@member或者@class@method(args):
例如:@com.javaeye.core.Resource@ENABLE,@com.javaeye.core.Resource@getAllResources
6. 方法调用
直接通过类似Java的方法调用方式进行,你甚至可以传递参数:
例如:user.getName(),group.users.size(),group.containsUser(#requestUser)
7. 投影和选择
OGNL支持类似数据库中的投影(projection) 和选择(selection)。
投影就是选出集合中每个元素的相同属性组成新的集合,类似于关系数据库的字段操作。投影操作语法为 collection.{XXX},其中XXX 是这个集合中每个元素的公共属性。
例如:group.userList.{username}将获得某个group中的所有user的name的列表。
选择就是过滤满足selection 条件的集合元素,类似于关系数据库的纪录操作。选择操作的语法为:collection.{X YYY},其中X 是一个选择操作符,后面则是选择用的逻辑表达式。而选择操作符有三种:
? 选择满足条件的所有元素
^ 选择满足条件的第一个元素
$ 选择满足条件的最后一个元素
例如:group.userList.{? #this.name != null}将获得某个group中user的name不为空的user的列表。
OGNL
中# $ %的用法:
#:
1.
访问
OGNL
上下文和
Action
上下文,
#
相当于
ActionContext.getContext()
;可以访问这几个
ActionContext
中的属性:
2.
用于过滤和投影(
projecting)
集合,如
books.{?#this.price<100}
;
3.
构造
Map
,如
#{'foo1':'bar1', 'foo2':'bar2'}
,在
select
和
radio
标签中经常用到。
%:
“%”的用途是在标志的属性为字符串类型时,计算
OGNL
表达式的值
$:
1.
用于在国际化资源文件中,引用
OGNL
表达式。
2.
EL表达式
${sessionScope.user.sex}
等于
${sessionScope.user["sex"]}
一样的,如果是${username}
没有指定
scope
那么查找顺序是
Page---Request---Session---Application
3.
在
Struts 2
配置文件中,引用
OGNL
表达式,如
<action name="downloadCaseFile" class="com.business.action.DownloadFileAction">
<result type="stream">
<param name="contentType">${contentType}</param>
<param name="contentLength">${contentLength}</param>
<param name="contentDisposition">attachment;filename="${filename}"</param>
<param name="inputName">fileStream</param>
<param name="bufferSize">4096</param>
</result>
</action>
分享到:
相关推荐
ognl表达式 ognl表达式 ognl表达式 ognl表达式
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势: 1、 支持对象方法调用,如xxx.doSomeSpecial(); 2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@...
struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用
ognl表达式在struts中的用法解析
Struts2的标签库及OGNL表达式语言
JS:ognl表达式 JS:ognl表达式 JS:ognl表达式
NULL 博文链接:https://huguifuture.iteye.com/blog/761843
在web开发技术中最常用到的OGNL表达式,对于ognl有点模糊的朋友,试试看思路必定会很清晰,用起来顺手。
ognl表达式的用法,叫你熟练掌握ognl 表达式
struts2中ognl表达式的用法,详细介绍了ognl表达式与struts2基本标签的结合。
struts2标签和OGNL表达式struts2标签和OGNL表达式
ognl表达式的详细教学描述,介绍如何使用ognl表达式和ognl的运行原理
NULL 博文链接:https://chaoyi.iteye.com/blog/2158731
struts2-OGNL表达式测试代码
关于OGNL表达式的使用的整理以及提供的文档说明,ps:文档说明是英文的,可能需要翻译
NULL 博文链接:https://z-one.iteye.com/blog/1584602
NULL 博文链接:https://takeme.iteye.com/blog/1668255
`Strtus2 OGNL表达式的结合
与上一讲上传的资源,OGNL表达式2讲,只要是一些常用标签使用的案例