学习Struts2的时候,觉得OGNL表达式语言很抽象,看了李刚的《Struts2.1权威指南》,感觉讲得不是很好。后来看了一位高手写的Struts2的文章,才有了一些头绪。
Struts2的OGNL表达式语言是基于Xwork的OGNL的,它在Xwork的基础上对OGNL进行了一些封装,因此先了解Xwork的OGNL是十分有必要的。Xwork的OGNL使用时比较容易理解。它有两个重要的概念:上下文环境和根对象。上下文环境是一个Map对象,所有的数据存取都是在上下文环境中进行的,你可以在存取数据时指定不同Map作为上下文环境。访问根对象时不需要加#前缀,而访问上下文环境中的其它对象需要加入#前缀。
Xwork中的OGNL通过Ognl类操作数据。
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Object name = Ognl.getValue(Ognl.parseExpression("name"), user);
System.out.println(name);
}
以上代码将User作为根对象(可以参见Ognl的API),访问其name属性,所以不需要前缀#,输出lijie。
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Map context = new HashMap();
context.put("user", user);
Object name = Ognl.getValue(Ognl.parseExpression("name"), context,user);
System.out.println(name);
}
上述代码将Map对象context作为上下文,user是其中的根对象,所以直接访问name属性,输出lijie。
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Map context = new HashMap();
context.put("user", user);
context.put("country", "China");
Object country = Ognl.getValue(Ognl.parseExpression("#country"), context,user);
System.out.println(country);
}
上述代码在context上下文中加入了一个String对象country,由于country不是根对象,所以访问时必须加前缀#,否则会抛出异常,指明根对象中没有country属性。上述代码输出China。
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Ognl.setValue("name", user, "Tom");
System.out.println(user.getName());
}
上述代码向User对象设置,输出Tom。
Struts2中的OGNL表达式语言是对Xwork的OGNL的封装。我们要理解一下几点:
1. Struts2中将ActionContext作为OGNL的上下文环境(ActionContext内部含有一个Map对象)
2. Struts2中的OGNL表达式语言的根对象是一个ValueStack,ValueStack中的每一个对象都被视为根对象。
Struts2框架将实例化的Action对象放入ValueStack中,如果是Action链,则多个Action都存在于ValueStack中。而ValueStack中除了Action外,Struts2框架还将parameters,request,response,session,application,attr等对象放到ActionContext中,访问这些对象需要加前缀#。
总结:Struts2中的数据处理基于Xwork的OGNL,它在OGNL的基础上进行了一定的封装。OGNL的核心概念是根对象(root)和上下文环境(context)---你可以传入一个Map对象作为上下文,向其中put进一个对象,那么这个对象可以作为根对象(ognl中可以向函数中传入不同的Map对象作为根对象来操作,也可以指定不同的根对象,而Struts2中,它固定了根对象ValueStack)。在Struts2中,ActionContext作为OGNL的上下文环境,它的根对象是一个ValueStack,ValueStack中的每个对象都被视为根对象。Struts2中的Action作为根对象存在(如果多个Action以chain的形式存在,则多个Action均存在于ValueStack中,均为根对象)。
以上是我大概的理解,具体的细节大家可以参考一些资料,不妥之处,希望大家批评指正。
分享到:
相关推荐
通过深入学习OGNL的源码,开发者可以更好地定制和优化Struts2应用,提升性能,增强安全性,并能解决遇到的特定问题。这是一项值得投入时间和精力的任务,特别是对于那些希望在Web开发领域有深入理解的人来说。
### Struts2中OGNL的使用详解 ...理解并熟练掌握OGNL的使用,对于深入学习和高效开发基于Struts2的应用程序至关重要。通过本文对OGNL在Struts2中的应用场景和使用技巧的介绍,希望能帮助开发者更好地利用这一强大工具。
Struts2是一个流行的Java Web应用程序框架,它极大地简化了MVC(模型-视图-控制器)架构的实现。...通过实践这个“Struts2 OGNL用法项目”,你可以深入学习OGNL的强大功能,并提升在Struts2框架下的开发能力。
Struts2 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,它在Struts2框架中扮演着核心角色,用于数据绑定、控制流程以及动态方法调用。这篇博文可能详细介绍了Struts2框架中OGNL的使用、工作原理...
在掌握Struts2和OGNL的基础上,开发者可以进一步学习Struts2的其他组件和特性,如标签库、异常处理、国际化支持、拦截器机制、输入校验、文件上传和下载等,这些都是构建复杂Web应用不可或缺的组件和功能。
OGNL(Object-Graph Navigation Language)是Struts2中的核心表达式语言,用于在Action对象和视图之间传递数据。在这个主题中,我们将深入探讨Struts2 OGNL2.6.11的源码,了解其内部工作原理和关键功能。 首先,...
Struts2 OGNL语言学习笔记 OGNL(Object-Graph Navigation Language)是 Struts 2 中的一种表达式语言,主要用于简化 JSP 页面中的编码,使页面与后台代码分离。下面是 OGNL 语言的主要特点和用法: 1. 支持对象...
在深入学习Struts2 OGNL表达式时,了解以下几点至关重要: 1. **OGNL基础语法**:包括变量引用、属性访问、集合操作、方法调用等。 2. **Struts2动作和结果**:如何在配置文件中使用OGNL定义Action和结果。 3. **...
深入学习这些源代码,开发者不仅可以了解OGNL的内部工作机制,还能提升对Struts2框架的理解,从而更好地设计和调试应用程序。同时,这也有助于学习其他类似的表达式语言或脚本引擎,因为很多概念和设计模式都是通用...
Struts2是一个流行的Java web应用程序框架,它极大地简化了MVC(模型-视图-控制器)架构的实现。...如果你想要深入学习Struts2和OGNL,可以参考给出的博客链接,或者查阅官方文档和其他相关的技术资源。
这个"Struts2 OGNL示例(Maven项目)"提供了使用OGNL与Struts2集成的实例,帮助开发者更好地理解和应用这一强大的特性。 首先,让我们了解什么是OGNL。OGNL是一种强大的表达式语言,允许我们访问和修改对象图中的...
通过学习这些知识点,开发者能够更高效地使用OGNL进行数据绑定和表达式处理,从而提升Struts2应用的开发效率和质量。在实际项目中,理解并熟练运用OGNL API不仅可以帮助开发者更好地控制应用程序的数据流,还可以为...
这个项目旨在帮助开发者理解和学习如何在Struts2中使用OGNL来操纵对象和数据。OGNL是Struts2中一个重要的组件,它允许在视图层和控制层之间传递和操作数据。 首先,我们来看`.classpath`、`.mymetadata`、`.project...
开发者可以通过阅读Struts2官方文档、相关博客(如提供的博文链接)以及参与社区讨论来深入学习OGNL和Struts2的使用技巧。同时,利用IDE的插件和工具,如IntelliJ IDEA的Struts2插件,可以帮助提高开发效率和代码...
Struts2是一个流行的Java web框架,它利用OGNL(Object-Graph Navigation Language)作为其核心表达式语言。OGNL是一种强大的表达式语言,允许开发者在Java对象之间导航和操作数据。在Struts2中,OGNL被广泛用于访问...
Struts2 OGNL是一个关于Java Web开发中的关键知识点,主要涉及到的是Apache Struts2框架与Object-Graph Navigation Language(OGNL)的结合使用。Struts2是一个流行的MVC(模型-视图-控制器)框架,它极大地简化了...
OGNL(Object-Graph Navigation Language)是Struts2框架中常用的一种表达式语言,用于在视图层方便地访问和操作模型数据。本篇笔记主要介绍了在Struts2中使用OGNL的一些基本用法。 首先,OGNL可以用来获取不同范围...
在阅读和学习"struts2对Ognl的封装--PropertyAccessor"相关的资料时,你可能会遇到以下概念: - OGNL表达式的语法和用法。 - PropertyAccessor接口的`getProperty`和`setProperty`方法。 - 如何自定义...
XWork是Struts2的核心组件,负责处理Action的执行,而OGNL(Object-Graph Navigation Language)则是Struts2中的表达式语言,用于数据绑定和访问对象属性。这个压缩包包含了这三个关键组件的源代码,对于开发者来说,...