`

OGNL表达式概述

 
阅读更多

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>  
 

 

分享到:
评论

相关推荐

    JS:ognl表达式

    #### 一、OGNL表达式概述 OGNL (Object-Graph Navigation Language) 是一种强大的表达式语言,用于获取和设置 Java 对象的属性。它最初是由 John Rose 和 Luke Blanshard 开发,并被广泛应用于多种框架中,尤其是在 ...

    表达式与言EL和OGNL

    而在显示用户信息时,同样可以通过OGNL表达式获取数据,如`getUser.getUsername()`。 **值堆栈(OgnlValueStack)** 在Struts 2中,OGNL的核心应用是通过值堆栈(OgnlValueStack)来实现的。值堆栈是一个存储对象的栈...

    struts2中的ongl表达式相关简介

    ### Struts2中的OGNL表达式相关简介 #### OGNL概述 OGNL(Object-Graph Navigation Language,对象图导航语言)是Struts 2框架的默认表达式语言,它极大地增强了Struts 2的数据访问能力和代码简洁性。OGNL不仅能够...

    教案第五章struts2的标签库.pdf

    $ 符号用于在国际化资源文件中引用 OGNL 表达式和在 Struts 2 框架的配置文件中引用 OGNL 表达式。 Struts 2 标签库可以分为三类:UI 标签、数据标签和逻辑标签。UI 标签用于生成用户界面,数据标签用于显示和输出...

    OGNL中的#、%和$符号用法说明

    综上所述,`#`、`%`和`$`这三个符号在OGNL表达式中扮演着不同的角色,分别用于访问根对象属性、计算字符串类型的表达式值以及引用OGNL表达式。熟练掌握它们的用法可以帮助开发者更高效地利用OGNL表达式进行数据处理...

    第五章struts2的标签库.pdf

    $ 符号用于在国际化资源文件中引用 OGNL 表达式和在 Struts 2 框架的配置文件中引用 OGNL 表达式。 Struts 2 的标签库可以分为三类:UI 标签、数据标签和逻辑标签。UI 标签主要用于生成 HTML 页面,数据标签用于...

    Struts2 & OGNL

    开发过程中,有一些工具可以帮助我们调试和优化OGNL表达式,如Struts2的开发工具插件和在线OGNL表达式测试工具。这些工具可以即时验证表达式的正确性,提高开发效率。 **安全注意事项** 虽然OGNL功能强大,但如果不...

    #和$的区别

    ### Struts2中#与$的区别及OGNL表达式的运用 #### 一、OGNL概述与Struts2中的角色 **OGNL**(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取或设置Java对象图中的属性。在Struts2框架中,OGNL...

    struts2中ongl表达式的使用和具体实例应用

    ### Struts2中OGNL表达式的使用与具体实例解析 #### 一、OGNL概述 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取或设置一个对象图中的属性值。它广泛应用于Struts2框架中,用于简化...

    ognl guide

    开发者可以在Action类中定义属性,然后在JSP页面中通过OGNL表达式直接访问这些属性,简化了MVC架构中的数据传递。 ### 示例 ```java // 假设有一个Person类 public class Person { private String name; private ...

    OGNL百度百科OGNL百度百科

    ### OGNL (Object-Graph Navigation Language) 概述与应用 #### 一、OGNL 简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于访问对象图中的属性。OGNL 是一种标准的表达式语言...

    struts2 ognl

    8. **Struts2中的OGNL拦截器**:Struts2框架使用了一系列拦截器来增强OGNL的功能,例如ValueStack,它可以将Action上下文中的所有对象暴露给OGNL表达式。这使得在视图层直接访问Action的属性变得简单。 总的来说,...

    Java实训教程 Java软件开发实战 Java开发框架介绍 struts2_4_OGNL 共71页.pptx

    #### 一、OGNL概述 **OGNL (Object Graph Navigation Language)** 是一种强大的表达式语言,允许开发者通过简单的语法来读取和设置 Java 对象的属性值,调用对象的方法,遍历整个对象的结构图,并实现字段类型转换...

    struts2安全漏洞修复

    例如,可以禁用`struts2-convention-plugin`和`struts2-ognl-plugin`,或者限制OGNL表达式的执行。 3. 使用过滤器:在Web应用的部署描述符(如web.xml)中,添加过滤器来拦截并验证HTTP请求,防止恶意输入。例如,...

    struts2 漏洞利用工具.rar

    此外,企业应限制OGNL表达式的使用,启用安全配置,如禁用不受信任的OGNL表达式,过滤输入数据,以及使用Web应用防火墙(WAF)进行额外保护。 6. **应急响应**: 如果检测到Struts2漏洞,应立即采取补救措施,如打...

    OGNL中文参考手册.pdf

    - **基本单位**:OGNL表达式的最基本单位被称为导航链(Chain),通常包含属性名称、方法调用和数组索引等元素。 - **导航链示例**:`name.toCharArray()[0].numericValue.toString()`,这个表达式的含义是: - ...

    struts2 漏洞 "cve-2017-5638" 研究文档

    这里的问题在于,异常信息中包含的非法`content-type`被错误地解释为OGNL表达式,从而导致远程代码执行。 #### 漏洞原理 在Struts2中,如果HTTP请求的`content-type`不合法,那么在解析上传文件的过程中就会抛出...

    Struts2框架基础 二

    通过以上内容,我们可以看到Struts2框架不仅提供了强大的功能,如OGNL表达式语言和ValueStack数据管理工具,还允许开发者通过自定义拦截器等方式来扩展框架的行为,从而满足更加复杂的应用场景需求。这对于理解和...

    Struts2教程-2(私塾在线)视频配套学习资料

    - `default`:当按照`value`属性指定的OGNL表达式求值后返回空值时,可使用`default`属性指定默认输出的内容。 - `escape`:是否转义HTML,默认为`true`。 - `escapeJavaScript`:是否转义JavaScript,默认为`...

    Struts 2中的OGNL教程

    #### 一、OGNL 概述 OGNL(Object-Graph Navigation Language)是一种用于方便地操作对象属性的开源表达式语言。这种语言允许开发者以一种非常直观的方式来访问和修改对象属性,从而大大简化了程序的编写过程。OGNL...

Global site tag (gtag.js) - Google Analytics