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 (Object-Graph Navigation Language) 是一种强大的表达式语言,用于获取和设置 Java 对象的属性。它最初是由 John Rose 和 Luke Blanshard 开发,并被广泛应用于多种框架中,尤其是在 ...
而在显示用户信息时,同样可以通过OGNL表达式获取数据,如`getUser.getUsername()`。 **值堆栈(OgnlValueStack)** 在Struts 2中,OGNL的核心应用是通过值堆栈(OgnlValueStack)来实现的。值堆栈是一个存储对象的栈...
### Struts2中的OGNL表达式相关简介 #### OGNL概述 OGNL(Object-Graph Navigation Language,对象图导航语言)是Struts 2框架的默认表达式语言,它极大地增强了Struts 2的数据访问能力和代码简洁性。OGNL不仅能够...
$ 符号用于在国际化资源文件中引用 OGNL 表达式和在 Struts 2 框架的配置文件中引用 OGNL 表达式。 Struts 2 标签库可以分为三类:UI 标签、数据标签和逻辑标签。UI 标签用于生成用户界面,数据标签用于显示和输出...
综上所述,`#`、`%`和`$`这三个符号在OGNL表达式中扮演着不同的角色,分别用于访问根对象属性、计算字符串类型的表达式值以及引用OGNL表达式。熟练掌握它们的用法可以帮助开发者更高效地利用OGNL表达式进行数据处理...
开发过程中,有一些工具可以帮助我们调试和优化OGNL表达式,如Struts2的开发工具插件和在线OGNL表达式测试工具。这些工具可以即时验证表达式的正确性,提高开发效率。 **安全注意事项** 虽然OGNL功能强大,但如果不...
### Struts2中#与$的区别及OGNL表达式的运用 #### 一、OGNL概述与Struts2中的角色 **OGNL**(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取或设置Java对象图中的属性。在Struts2框架中,OGNL...
### Struts2中OGNL表达式的使用与具体实例解析 #### 一、OGNL概述 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取或设置一个对象图中的属性值。它广泛应用于Struts2框架中,用于简化...
开发者可以在Action类中定义属性,然后在JSP页面中通过OGNL表达式直接访问这些属性,简化了MVC架构中的数据传递。 ### 示例 ```java // 假设有一个Person类 public class Person { private String name; private ...
### OGNL (Object-Graph Navigation Language) 概述与应用 #### 一、OGNL 简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于访问对象图中的属性。OGNL 是一种标准的表达式语言...
8. **Struts2中的OGNL拦截器**:Struts2框架使用了一系列拦截器来增强OGNL的功能,例如ValueStack,它可以将Action上下文中的所有对象暴露给OGNL表达式。这使得在视图层直接访问Action的属性变得简单。 总的来说,...
#### 一、OGNL概述 **OGNL (Object Graph Navigation Language)** 是一种强大的表达式语言,允许开发者通过简单的语法来读取和设置 Java 对象的属性值,调用对象的方法,遍历整个对象的结构图,并实现字段类型转换...
例如,可以禁用`struts2-convention-plugin`和`struts2-ognl-plugin`,或者限制OGNL表达式的执行。 3. 使用过滤器:在Web应用的部署描述符(如web.xml)中,添加过滤器来拦截并验证HTTP请求,防止恶意输入。例如,...
此外,企业应限制OGNL表达式的使用,启用安全配置,如禁用不受信任的OGNL表达式,过滤输入数据,以及使用Web应用防火墙(WAF)进行额外保护。 6. **应急响应**: 如果检测到Struts2漏洞,应立即采取补救措施,如打...
- **基本单位**:OGNL表达式的最基本单位被称为导航链(Chain),通常包含属性名称、方法调用和数组索引等元素。 - **导航链示例**:`name.toCharArray()[0].numericValue.toString()`,这个表达式的含义是: - ...
这里的问题在于,异常信息中包含的非法`content-type`被错误地解释为OGNL表达式,从而导致远程代码执行。 #### 漏洞原理 在Struts2中,如果HTTP请求的`content-type`不合法,那么在解析上传文件的过程中就会抛出...
通过以上内容,我们可以看到Struts2框架不仅提供了强大的功能,如OGNL表达式语言和ValueStack数据管理工具,还允许开发者通过自定义拦截器等方式来扩展框架的行为,从而满足更加复杂的应用场景需求。这对于理解和...
- `default`:当按照`value`属性指定的OGNL表达式求值后返回空值时,可使用`default`属性指定默认输出的内容。 - `escape`:是否转义HTML,默认为`true`。 - `escapeJavaScript`:是否转义JavaScript,默认为`...
#### 一、OGNL 概述 OGNL(Object-Graph Navigation Language)是一种用于方便地操作对象属性的开源表达式语言。这种语言允许开发者以一种非常直观的方式来访问和修改对象属性,从而大大简化了程序的编写过程。OGNL...
- **用途**:主要用于将文本属性解析为OGNL表达式,适用于原本是OGNL表达式的场景。 - **注意事项**:对于已经是OGNL表达式的属性不起作用。 - **示例**: ```xml ``` 这里`%{username}`会被解析为OGNL表达式,...