OGNL构成三要素:
1.表达式
表达式会规定OGNL操作到底要“干什么”;OGNL不仅支持链式描述对象访问路径,还支持在表达式中进行简单的计算,甚至还支持Lambda表达式;
2.root对象
OGNL的root对象可以理解为OGNL的操作对象,表名"对谁干";OGNL的root对象实际上是一个java对象,是所有OGNL操作的实际载体。这意味着如果有一个OGNL表达式,那么我们实际上是针对root对象来进行OGNL表达式的计算并返回结果。
3.上下文环境;
有了root和表达式,其实我们已经可以开始进行OGNL的基本功能了。不过事实上在OGNL内部,所有的操作都会在一个特定的数据环境中进行,这个数据环境就是OGNL的上下文环境;其实这个上下文环境规定了OGNL的操作“在哪里干”;
OGNL的上下文环境是一个Map结构,称之为OgnlContext,root对象也会被添加到这个环境中,并且被当做一个特殊的对象进行处理。
OGNL本身没有数据结构的概念,OGNL仅仅是提供了一些对数据进行操作的方法;
OGNL基本操作:
1.针对root对象的访问
针对root对象的对象树的访问是通过使用“点号”将对象的引用串联起来实现的。
通过这种方式,OGNL实际上将一个树形的对象结构转化成一个链式结构的字符串来表达语义;
2.对上下文基本环境的访问
#introduction
其他的基本操作,请参照:
http://zhujianguo1981.iteye.com/admin/blogs/1746726
深入this指针
this指针是许多编程语言都具备的特殊关键字。绝大多数语言中的this指针的含义都类似,表示“当前所在函数的调用者”。
#符号的三种用途:
(1)加在普通OGNL表达式前面,用于访问OGNL上下文的变量;
(2)使用#{}语法动态构建Map;
(3)加在this指针前表示对this指针的引用;
实例代码如下:
public class BasicOgnlTest {
public void testGetValue() throws Exception{
//创建Root对象
User user = new User();
user.setId(1);
user.setName("downpour");
//创建上下文环境
Map context = new HashMap();
context.put("introduction", "my name is");
//从root对象中获取name值
//Ognl.parseExpression("name"),将name转化为OGNL表达式
Object name = Ognl.getValue(Ognl.parseExpression("name"), user);
System.out.println((String)name);
//直接写OGNL表达式获取name值
Object name1 = Ognl.getValue("name", user);
System.out.println((String)name1);
//从上下文环境中获取introduction
Object contextValue = Ognl.getValue(Ognl.parseExpression("#introduction"), context,user);
System.out.println((String)contextValue);
//测试同时从将ROOT对象和上下文环境作为表达式的一部分进行计算
Object hello = Ognl.getValue(Ognl.parseExpression("#introduction + name"), context,user);
System.out.println((String)hello);
}
public void testSetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("downpour");
//对ROOT对象进行写值操作
// Ognl.setValue("group.name", user, "dev");
//对root对象user的age属性赋值为18
Ognl.setValue("age",user, "18");
//TODO
// Object temp = Ognl.getValue(Ognl.parseExpression("group.name"), user);
// System.out.println((String)temp);
Object temp1 = Ognl.getValue(Ognl.parseExpression("age"), user);
System.out.println(temp1);
Object temp2 = Ognl.getValue("age", user);
System.out.println(temp2);
}
public static void main(String [] args){
try{
BasicOgnlTest bot = new BasicOgnlTest();
bot.testGetValue();
bot.testSetValue();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
分享到:
相关推荐
`ognl-3.0.6-sources.jar` 包含了OGNL的源代码,这是一门强大的表达式语言,用于在Struts2中访问和操作对象图。OGNL可以用来在视图层动态地获取或设置模型对象的属性,也可以在控制器层执行复杂的表达式来控制流程。...
这个“struts2-OGNL表达式测试”可能是一个测试项目或代码示例,旨在演示如何在Struts2应用中使用OGNL表达式。 OGNL是Struts2的核心组件之一,它允许开发者通过简单的字符串表达式来获取或设置对象的属性。这使得视...
包含Struts2框架的核心类库,以及Struts2的第三方插件类库 struts2-core-2.0.14 xwork-2.0.7 ognl-2.6.11 commons-logging-1.0.4 freemarker-2.3.8 等等。
- OGNL是Struts2默认的表达式语言,用于在Action对象和视图之间传递数据。 在Eclipse中导入这些源码后,你可以看到具体的类和方法实现,如ActionSupport、ActionContext、DefaultActionInvocation、Interceptor栈...
在Struts2中,OGNL(Object-Graph Navigation Language)扮演着核心角色,它是一种强大的表达式语言,用于在Action类和JSP页面之间交换数据。下面我们将深入探讨OGNL的基本概念、特性以及在Struts2中的应用。 1. ...
其中,OGNL(Object-Graph Navigation Language)是Struts2中的核心表达式语言,用于数据绑定和表示层的数据操作。这篇深入学习的文章主要探讨了OGNL表达式的原理和使用。 首先,我们来理解一下OGNL是什么。OGNL是...
OGNL(Object-Graph Navigation Language)是Struts2中的核心表达式语言,用于在Action对象和视图之间传递数据。在这个主题中,我们将深入探讨Struts2 OGNL2.6.11的源码,了解其内部工作原理和关键功能。 首先,...
5. **OGNL(Object-Graph Navigation Language)**:Struts 2内部使用OGNL作为表达式语言,用于在Action和视图之间传递数据,提供了灵活的数据绑定功能。 6. **Tiles插件**:Struts 2与Tiles框架集成,提供页面布局...
2. `struts-2.0.1/ognl.jar`:OGNL(Object-Graph Navigation Language)是Struts 2中用于表达式语言,用于在视图和模型之间传递数据。 3. `struts-2.0.1/xwork-core.jar`:XWork是Struts 2的基础,它提供了Action和...
除此之外,Struts2还依赖于其他一些库,如OGNL(Object-Graph Navigation Language)用于表达式语言,Freemarker或Velocity用于视图模板,以及各种插件来支持特定的功能,如文件上传、JSON处理等。 在标签中提到了...
6. **OGNL(Object-Graph Navigation Language)**:Struts 2内部大量使用OGNL作为表达式语言,用于在Action和视图之间传递数据。例如,`<s:property value="username" />`会显示Action中的username属性值。 7. **...
4. **OGNL(Object-Graph Navigation Language)**:OGNL 是 Struts 2 中用于访问和操作对象属性的表达式语言,它简化了视图层的数据绑定。例如,在 JSP 中,可以直接使用 `${property}` 来访问值栈中的属性。 5. *...
`ognl-3.0.6-javadoc.jar` 是OGNL的API文档。OGNL是Struts2中用于表达式语言的主要工具,它允许开发者动态地访问和修改对象的属性,以及执行复杂的表达式。通过Javadoc,开发者可以学习到如何使用OGNL表达式来绑定...
ognl-3.1.10.jar, org.apache.felix.framework-4.0.3.jar, org.apache.felix.main-4.0.3.jar, org.apache.felix.shell-1.4.3.jar, org.apache.felix.shell.tui-1.4.1.jar, org.osgi.compendium-4.0.0.jar, org.osgi....
在开发过程中,确保熟悉Struts2的生命周期、拦截器链、结果映射以及如何通过OGNL进行数据绑定,这些都是成功构建Struts2应用的关键知识点。同时,理解并合理利用Struts2的插件可以极大地提高开发效率和代码质量。
S2-057漏洞,全称为"Struts2 OGNL注入漏洞",主要源于Struts 2框架处理用户输入时的不当验证和处理。OGNL (Object-Graph Navigation Language) 是一种强大的表达式语言,用于获取和设置Java对象的属性。在Struts 2中...
5. **OGNL(Object-Graph Navigation Language)**:Struts2默认使用OGNL作为表达式语言,用于在Action与视图之间传递数据。OGNL允许直接访问对象的属性,甚至可以进行复杂的表达式计算。 6. **插件体系**:Struts2...
Struts2是一个基于MVC(Model-View-Controller)设计模式的开源Java Web框架,它在Web应用开发中被广泛使用。Struts2的核心是Action类,它负责处理用户请求,与模型进行交互,并将结果返回给视图。在Struts2的版本...
其中,OGNL(Object-Graph Navigation Language)是Struts2中的核心表达语言,用于在视图层与模型层之间传递数据。在深入理解OGNL的源码之前,我们首先需要了解OGNL的基本概念和用法。 OGNL是一种强大的表达式语言...
4. **OGNL(Object-Graph Navigation Language)**:Struts2默认使用OGNL作为表达式语言,用于在视图层和模型层之间传递数据。 5. **插件架构(Plugin Architecture)**:Struts2支持插件扩展,可以方便地添加新的...