Struts2内置了OGNL这是大家都知道的了,其实这种说话不严格,应该OGNL本身是一种很强大的表达式语言,XWork整合了OGNL的一部分并且将这部分内容做了相应的扩展,而Struts2又建立在XWork这个项目的基础之上,所以Struts2也就内置了OGNL这部分强大的功能。
为了详细些一步一步做记录吧。
先说OGNL,OGNL内部自己会维护一个OGNL上下文(OgnlContext)是一个实现了Map接口的对象,OGNL会将对象放在这个上下文中统一管理的,并且会有一个对象被指定为根对象(root)。假设有User和Customer这么两个类,分别有user和customer两个实例,这两个对象都有一个name属性,并且将user对象配置为唯一的根对象,那么就会有下面的情况:
#user.name 返回user.getName();
#customer.name 返回customer.getName();
#name 返回user.getName(); 因为user对象为根对象
OGNL访问对象的基本机制就是这样的。
在XWork中,ValueStack对象是上下文中的根对象,XWork中不仅可以根据表达式从ValueStack对象中获取对象,还可以获取对象的属性,XWork自己有一个强大的属性访问器,它可以自动搜索栈内的所有实体(从上到下),直到找到你所访问的对象和属性。假设ValueStack栈中有两个上面所说的user和customer两个对象,并且user是栈顶元素,customer在下面,就会有下面的情况:
name 返回user.getName(); 因为user在栈顶,搜索器找到一个匹配的属性就不会继续找下去
如果希望访问靠后对象的属性XWork提供了索引访问ValueStack的方法:
[0].name 返回user.getName()
[1].name 返回customer.getName();
了解上面这些之后Struts2中的OGNL就很好理解了,Struts2框架也没有对XWork中的OGNL做太大的修改,只是拿过来做了一下整合工作,Struts2将ActionContext设置为OGNL中的上下文,ValueStack依然是OGNL上下文中的根元素,大家知道application,session和request这几个对象也是在ActionContext中的,它们是和根对象ValueStack共存的,与根对象是无关的,就像刚开始说OGNL那个例子实在OGNL上下文中的两个平行对象,只不过ValueStack这个对象是这个OGNL上下文中的根对象(root)。如果要访问上下文中根对象中的对象和属性是不用加任何标记符号的,但是在访问application,session和request这几个范围内的对象和属性就要用"#"符号来告诉ognl不要在根对象中去搜索了,而是去我们指定的上下文中去找。用官方一个图来形象描述ValueStack和其他几个对象的关系:
|--request
|
|--application
|
context map---|--OgnlValueStack(root)
|
|--session
|
|--attr
|
|--parameters
基本原理就是这样了,举例验证理论。
1. ActionContext是OGNL的上下文,ValueStack对象是上下文中的根对象:
随便找一个Action给JSP页面传东西过去的例子,然后在Action的execute()方法中加入以下代码:
ActionContext.getContext().getValueStack().set("test", "love java");
在目标JSP页面空白处加上如下代码:
<s:label value="%{test}"></s:label>
再次跳转到该页面就可以看到love java出现在页面上了
2. 其他范围和ValueStack平行关系:
还找刚才那个例子,在Action中加入
request.setAttribute("test1", "love java1");
在JSP页面加入代码:
<s:label value="%{#request.test1}"></s:label>
这次跳转就可以看到love java1出现了
3. OGNL上下文的访问
Action中加入代码:
ActionContext.getContext().put("test2", "love java2");
JSP页面中加入:
<s:label value="%{#test}"></s:label>
看到love java2之后应该大彻大悟了吧,这里值得说一下就是在ActionContext.getContext().put("test2", "love java2")之后上下文结构:
|--request
|
|--application
|
context map---|--OgnlValueStack(root)
|
|--session
|
|--attr
|
|--parameters
|
|
|--test2
这样更清楚了吧!
总结:
1. 在JSP页面中"%{"就表示OGNL表达式开始,"}"表示OGNL表达式结束
2. 如果访问根对象中的对象和属性不用任何符号标志,如:%{Object.field}
3. 访问特定Scope中的对象和属性用"#"来通知OGNL查询器,如:%{#request.object},当然OGNL很强大,在一个链中,前一个对象做为解释下一个对象的上下文。你可以任意扩展这个链,在链中也可以访问对象中的方法。
分享到:
相关推荐
其中,OGNL(Object-Graph Navigation Language)是Struts2中的核心表达语言,用于在视图层与模型层之间传递数据。在深入理解OGNL的源码之前,我们首先需要了解OGNL的基本概念和用法。 OGNL是一种强大的表达式语言...
这篇博文可能详细介绍了Struts2框架中OGNL的使用、工作原理以及相关安全问题。 OGNL是一个轻量级的表达式语言,它的主要功能是获取和设置对象属性,支持复杂的运算符和函数调用,使得开发者能够在模板中灵活地访问...
在这个主题中,我们将深入探讨Struts2 OGNL2.6.11的源码,了解其内部工作原理和关键功能。 首先,OGNL作为一个强大的表达式语言,它的主要功能包括属性访问、方法调用、集合操作以及动态对象创建。在Struts2中,...
这个压缩包包含的是OGNL的2版本的源代码,这对于理解Struts2框架的工作原理以及OGNL语言的实现细节非常有帮助。 OGNL的主要功能是提供一种简洁的方式来获取和设置对象的属性,甚至可以处理复杂的对象图。例如,你...
这篇博客将深入探讨OGNL在Struts2中的应用,并通过案例"TextOgnl"来展示其工作原理。 一、OGNL的基本概念 OGNL是用于Java对象图形导航的语言,它可以轻松地访问和操作复杂的对象结构。在Struts2中,OGNL主要用作视...
在分析和调试Struts2应用时,了解OGNL的工作原理以及如何优化和防止潜在的安全风险至关重要。开发者可以通过阅读Struts2官方文档、相关博客(如提供的博文链接)以及参与社区讨论来深入学习OGNL和Struts2的使用技巧...
### Struts2中OGNL的概念及原理说明 #### 一、OGNL表达式的基本用法与特点 **OGNL**,即**Object Graphic Navigation Language**(对象图导航语言),是Struts2框架中用于处理对象及其属性的强大工具之一。通过...
Struts2 OGNL(Object-Graph Navigation Language)是一个强大的表达式语言,它在Struts2框架中扮演着核心角色,用于数据绑定、控制流程以及动态方法调用。本示例将深入探讨OGNL的基础知识及其在Struts2中的应用。 ...
"struts2对Ognl的封装--PropertyAccessor"这个主题主要涉及Struts2框架如何处理OGNL表达式,特别是如何通过PropertyAccessor接口来访问和操作对象的属性。 首先,我们来了解什么是OGNL。OGNL是Struts2的核心组件之...
这个压缩包包含了这三个关键组件的源代码,对于开发者来说,它提供了深入理解Struts2框架工作原理的宝贵资源。 `struts2-core-2.3.7-sources.jar` 是Struts2核心库的源代码,其中包含了许多关键组件,如Action、...
了解并熟练掌握OGNL对于深入理解Struts2的工作原理至关重要。通过OGNL,开发者可以更高效地在Action和视图之间传递和操作数据,实现动态的页面渲染。同时,由于OGNL与Struts2的拦截器机制紧密结合,开发者可以通过...
### 学习OGNL在Struts2中的工作原理 #### OGNL简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它是Struts2框架的一个核心特性之一,被广泛应用于框架的...
在实际开发中,理解OGNL的工作原理对于调试和优化Struts2应用至关重要。例如,当出现“无法找到属性”的异常时,可能是OGNL表达式错误或对象图中缺少相应属性。熟练掌握OGNL可以帮助我们快速定位问题并修复。 总的...
深入研究Struts2框架的源码,可以更好地理解OGNL的工作原理。例如,了解`ValueStack`类如何解析和执行OGNL表达式,以及`OGNLContext`如何管理上下文变量,对于优化性能和解决调试问题都非常有帮助。 **工具支持** ...
2. **数据绑定**:Struts1使用Form Bean,Struts2使用OGNL,后者更强大,支持动态数据绑定。 3. **异常处理**:Struts2的异常处理更直观,可以配置全局异常处理。 4. **性能**:Struts2在某些方面比Struts1更快,...
在这个主题中,我们将深入探讨OGNL(Object-Graph Navigation Language)以及如何通过`<s:property>`标签来访问Struts2中的值栈(Value Stack)。值栈是Struts2中一个核心的概念,它是一个存储用户请求数据和应用...
在**Struts2**框架中,Ognl是核心组件之一,负责处理视图到模型数据的绑定,以及动作方法的调用。通过Ognl,开发者可以轻松地在JSP页面中访问Action类的属性,实现动态控制流。 **1. OGNL的基本语法** OGNL表达式...
在 Eclipse 3.4.1 中,你可以使用 OGNL 的源码进行调试和学习,这对于理解 OGNL 的工作原理和优化 Struts2 应用程序非常有帮助。你可以设置源码路径,以便在遇到 OGNL 相关的错误时查看其内部实现。 总的来说,...
在Struts2框架中,OGNL(Object-Graph Navigation Language)是默认的表达式语言,用于数据绑定和页面表现层的交互。XWork则是Struts2的核心工作框架,它提供了动作(Action)执行、类型转换、异常处理等功能。 ...
核心技术篇首先分析了Struts2中多种具有代表性的设计模式,然后对Struts2中的精华——OGNL表达式引擎和XWork框架的原理及机制进行了全面深入的分析和讲解。运行主线篇首先对Struts2的两大运行主线——初始化主线和...