一、什么是OGNL,有什么特点?
OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。OGNL有如下特点:
1、支持对象方法调用,形式如:objName.methodName();
2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路)]@[方法名 | 值名],例如:
@java.lang.String@format(‘foo %s’, ‘bar’)或@tutorial.MyConstant@APP_NAME;
3、支持赋值操作和表达式串联,例如:
price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
4、访问OGNL上下文(OGNL context)和ActionContext;
5、操作集合对象。
二、使用OGNL表达式
OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”、“#”、“$”这三个符号的使用。由于$广泛应用于EL中,这里重点写%和#符号的用法。
1、“#”符号有三种用途:
(1)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:
parameters
包含当前HTTP请求参数的Map
#parameters.id[0]作用相当于request.getParameter(“id”)
request
包含当前HttpServletRequest的属性(attribute)的Map
#request.userName相当于request.getAttribute(“userName”)
session
包含当前HttpSession的属性(attribute)的Map
#session.userName相当于session.getAttribute(“userName”)
application
包含当前应用的ServletContext的属性(attribute)的Map
#application.userName相当于application.getAttribute(“userName”)
注:attr 用于按request > session > application顺序访问其属性(attribute),#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止。用于过滤和投影(projecting)集合,如books.{?#this.price<100};构造Map,如#{‘foo1′:’bar1′, ‘foo2′:’bar2′}。
(2)、用于过滤和投影(projecting)集合,如: books.{?#this.price>35}
books.{?#this.price>35}
(3)、构造Map,如: #{‘foo1′:’bar1′, ‘foo2′:’bar2′}
#{‘foo1′:’bar1′, ‘foo2′:’bar2′}这种方式常用在给radio或select、checkbox等标签赋值上。如果要在页面中取一个map的值可以这样写:
<s:property value=”#myMap['foo1']“/>
<s:property value=”#myMap['foo1']“/>
2、“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。
这是一开始最让我不能理解的符号,原因是一些相关资源在表述时不太准备,经过一翻痛苦的探索,终于明白了它的用途。实际上就是让被理解为字符串的表达式,被真正当成ognl来执行。很有点类似javascript里面的eval_r()功能,例如 :
var oDiv = eval_r(“document.all.div”+index)
var oDiv = eval_r(“document.all.div”+index)
当index变量为1时,语句就会被当作var oDiv = document.all.div1 var oDiv = document.all.div1来执行。%{}就是起这个作用。举例:
<s:set name=”myMap” value=”#{‘key1′:’value1′,’key2′:’value2′}”/>
<s:property value=”#myMap['key1']“/>
<s:url value=”#myMap['key1']” />
<s:set name=”myMap” value=”#{‘key1′:’value1′,’key2′:’value2′}”/>
<s:property value=”#myMap['key1']“/>
<s:url value=”#myMap['key1']“/>
上面的代码第2行会在页面上输出“value1”,而第3行则会输出”#myMap['key1']“这么一个字符串。 如果将第3行改写成这样:
<s:url value=”%{#myMap['key1']}”/>
<s:url value=”%{#myMap['key1']}”/>
则输出为“value1”。
这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签“看不懂”类似“#myMap['key1']”的语句时,就要用%{}来把这括进去,“翻译”一下了。
3.“$”有两种用途
(1)、在国际化资源文件中,引用OGNL表达式。
(2)、在Struts 2配置文件中,引用OGNL表达式:
<action name=”saveUser” method=”save”>
<result type=”redirect”>listUser.action?msg=${msg}</result>
</action>
<action name=”saveUser” method=”save”>
<result type=”redirect”>listUser.action?msg=${msg}</result>
</action>
相关推荐
4. **方法调用**:可以直接在ONGL表达式中调用对象的方法,如`user.getAge()`。 5. **条件和逻辑操作**:ONGL提供了`?`操作符进行三元条件判断,以及`&&`、`||`进行逻辑操作。 6. **运算符支持**:包括算术运算符...
### Struts2中OGNL表达式的使用与具体实例解析 #### 一、OGNL概述 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,...对于深入理解和掌握Struts2框架而言,熟练掌握OGNL的使用方法是非常必要的。
通过这种方式,我们可以方便地在视图层使用OGNL表达式来展示模型对象的信息,无需编写复杂的Java代码来处理数据的获取和展示。 **小结** OGNL是Struts 2框架中的一项关键技术,它简化了视图层与模型层之间的交互,...
EL表达式通常在JSF组件的属性中使用,以便动态地获取或设置值。例如,`#{bean.property}` 这样的表达式会查找名为`bean`的JavaBean对象,并尝试访问其`property`属性。 EL具有以下主要特性: 1. **简化的对象访问**...
OGNL是一种强大的表达式语言,它允许开发者通过简洁的语法来访问和操作对象的属性以及调用方法。它可以遍历对象图,执行类型转换,并且在对象间导航。OGNL的上下文是其工作的核心,它是一个Map对象,由ognl.Ognl...
`Ognl.getValue`方法用于解析和执行ONGL表达式,返回结果是`User`对象的`name`属性值。 **与MVEL、SpEL等比较** ONGL虽然强大,但并非唯一的选择。例如,MVEL和Spring Expression Language (SpEL)也是类似的表达式...
本篇文档将详细介绍ONGL在访问上下文、集合操作以及构造Map等方面的使用方法,以及如何解决在使用过程中可能遇到的问题。 **一、访问OGNL上下文和Action上下文** 1. **#parameters**: OGNL提供了一个便捷的方式,...
本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系...用法:OGNL是通常要结合Struts 2的标志一起使用。主要是#、%和$这三个符号的使用;
本篇文章将深入探讨如何在Struts 2中使用OGNL表达式。 首先,OGNL的优势在于它能够方便地处理对象的方法调用。例如,你可以直接通过`xxx.doSomeSpecial()`来调用对象的方法,这在处理业务逻辑时十分便捷。不仅如此...
Mybatis是一款强大的持久层框架,它允许开发者将SQL语句直接写在XML配置文件...理解并熟练掌握这些动态SQL标签,对于提升Mybatis的使用技能至关重要。在实际开发中,可以根据具体需求灵活运用,使SQL语句更加简洁高效。
- **独立使用**:ONGL也可单独作为工具库,用于在任何Java程序中执行动态表达式。 通过研究jkuhnert-ognl-1483b9a的源代码,你可以深入理解ONGL的内部实现,学习如何构建和执行表达式,以及如何处理对象图的各种...
这个压缩包包含了Struts2中的ONGL包源码,对于理解Struts2的工作原理和深入学习OGNL的使用非常有帮助。 OGNL是Object-Graph Navigation Language的缩写,它的主要功能是在对象图中导航并执行操作。在Struts2中,...
本篇将详细介绍OGNL的使用方法及其核心概念。 一、OGNL的基础知识 1. **表达式语法**:OGNL表达式通常由对象名、点号和属性名组成,例如`user.name`,表示获取`user`对象的`name`属性。也可以通过索引访问集合元素...
**ONGL(Object-Graph Navigation Language)是一种强大的表达式语言,用于在Java应用程序中操作对象图。它在Web开发领域,特别是在Struts2框架中,被广泛用来简化视图层的逻辑,允许开发者通过简洁的表达式来访问和...
ONGL(Object-Graph Navigation Language)是Java平台上的一种表达式语言,主要用于访问和操作对象的属性,以及执行动态方法调用。它简化了在Java应用程序中处理对象模型的复杂性,尤其是在MVC(Model-View-...
**ONGL源码详解** ONGL (Object-Graph Navigation Language...总的来说,最新的ONGL源码提供了深入学习和研究的机会,结合unittest代码,开发者可以全面了解其工作原理,并提升在Java应用开发中的表达式语言使用技巧。
- **用法**: OGNL 通常与 Struts2 标签一起使用,不能单独在 Struts 页面中使用;而 EL 可以直接在 JSP 页面中使用。 - **取值**: OGNL 更适合于复杂的对象图导航,而 EL 更适用于简单的数据访问。 **与 JSTL 的...
例如,在提供的代码片段中,可以看到`<%@ taglib prefix="s" uri="/struts-tags"%>`引入了Struts2的标签库,这使得在JSP中可以方便地使用OGNL表达式来操作页面上的Java对象。 ```jsp ("sex", Sex.MALE); %> This ...
根据提供的文件信息,我们可以归纳出以下关于Struts2中OGNL(Object-Graph Navigation Language)的知识点: ...通过掌握 OGNL 的基本概念和使用方法,开发者可以有效地提高应用程序的功能性和灵活性。
除了这些基础用法,OGNL还支持访问静态方法和变量,通过`@`符号结合类名和成员名。例如,`()" />`会输出一个随机数,`@examples.chap8.Muppet@OG_MUPPET`和`@examples.chap8.Muppet@getOgMuppet()`分别访问了类的...