`

深入解析OGNL投影

    博客分类:
  • java
阅读更多

先看这个表达式:list.{#me=#this,#root.map[#me]}

 

这个表达式有这么几个点:

 

1. #this

 

在"投影"里#this指向的是list的子元素, 我想这个大家都知道,就不多说了

 

2. #root

 

在"投影"里如何访问"投影"外面的元素,这个问题困扰了我很长时间, 今天看了下OGNL的源代码, 原来用#root可以访问根元素,#context可以访问上下文里的元素,#this可以访问当前对象的元素;

 

在struts里,原本最开始当前对象就是根元素,但到"投影"里就把当前对象指向了投影的子元素了

 

相关OGNL源代码如下:

 

if (RESERVED_KEYS.containsKey(key)) {
            if (key.equals(OgnlContext.THIS_CONTEXT_KEY)) {
                result = getCurrentObject();
            } else {
                if (key.equals(OgnlContext.ROOT_CONTEXT_KEY)) {
                    result = getRoot();
                } else {
                    if (key.equals(OgnlContext.CONTEXT_CONTEXT_KEY)) {
                        result = this;
                    } else {
                        if (key.equals(OgnlContext.TRACE_EVALUATIONS_CONTEXT_KEY)) {
                            result = getTraceEvaluations() ? Boolean.TRUE : Boolean.FALSE;
                        } else {
                            if (key.equals(OgnlContext.LAST_EVALUATION_CONTEXT_KEY)) {
                                result = getLastEvaluation();
                            } else {
                                if (key.equals(OgnlContext.KEEP_LAST_EVALUATION_CONTEXT_KEY)) {
                                    result = getKeepLastEvaluation() ? Boolean.TRUE : Boolean.FALSE;
                                } else {
                                    if (key.equals(OgnlContext.CLASS_RESOLVER_CONTEXT_KEY)) {
                                        result = getClassResolver();
                                    } else {
                                        if (key.equals(OgnlContext.TYPE_CONVERTER_CONTEXT_KEY)) {
                                            result = getTypeConverter();
                                        } else {
                                            if (key.equals(OgnlContext.MEMBER_ACCESS_CONTEXT_KEY)) {
                                                result = getMemberAccess();
                                            } else {
                                                throw new IllegalArgumentException("unknown reserved key '" + key + "'");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } else {
            result = values.get(key);
        }
 

 

3.  map[#me]

 

这样的写法和map.get(#me)的效果是一样, 但为什么不直接用#this呢? 原因在于4

 

4. #me=#this,

 

 为什么这么写? (逗号表达式就不解释了)

 

因为“投影”里面的context与外面的context是不同的,但“投影”里的方法使用的确是外面的context(这算不算是一个BUG.....),所以只好用一个普通变量作为引用,防止因为上下文不一样,造成第2点中给出的源代码解析成错误的值.

 

 

 

总结,

 

OGNL使用起来,还是很方便的.官方对其使用方法的文档写的也非常详细,但像作用域这样的"隐藏"概念确没多少资料,希望我的这篇文章能给大家提供一点帮助.

 

 

 


0
0
分享到:
评论

相关推荐

    ognl表达式java使用案例详解(测试通过)

    本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系留言发至邮箱),若测试不好可以联系本人提供指导. Struts 2默认的表达式语言是OGNL...

    ognl源码和ognl帮助文档.rar

    在这个压缩包中,包含的是OGNL的源码和帮助文档,这对于深入理解OGNL的工作原理以及在Struts2中的应用非常有帮助。 OGNL的核心特性包括: 1. **对象导航**:OGNL允许我们通过`.`操作符来访问对象的属性,甚至可以...

    ognl源码

    OGNL的解析过程分为两个主要阶段:解析(parsing)和求值(evaluation)。解析阶段将OGNL表达式转换为抽象语法树(AST),这个树结构反映了表达式的逻辑结构。求值阶段则根据AST遍历并执行相应的操作,如获取或设置...

    Struts2 通过ognl表达式实现投影

    Struts2 通过 OGNL 表达式实现投影 Struts2 框架中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,主要用于在 Struts2 应用程序中进行数据绑定和投影。OGNL 表达式可以用于过滤、投影和排序...

    ognl.jar资源包

    camel-ognl-1.6.4.jar, camel-ognl-2.8.1.jar, com.springsource.org.ognl-2.6.9.jar, com.springsource.org.ognl-sources-2.6.9.jar, ognl-2.5.1.jar, ognl-2.6.11.jar, ognl-2.6.3.jar, ognl-2.6.5.jar, ognl-...

    Struts2 如何使用OGNL表达式(三十八)

    本文将深入探讨如何在Struts2中有效地使用OGNL表达式。 首先,OGNL是Struts2的核心组成部分,它允许开发者在Action类和JSP页面之间灵活地传递和访问数据。在Action类中,你可以设置属性,然后在JSP页面上通过OGNL...

    struts2中的OGNL的源码

    在深入理解OGNL的源码之前,我们首先需要了解OGNL的基本概念和用法。 OGNL是一种强大的表达式语言,它允许动态地访问和修改对象的属性。它的主要特点包括: 1. **对象导航**:OGNL支持通过点号(`.`)和方括号(`...

    struts2.0中的ognl

    本篇文章将深入探讨OGNL在Struts2.0中的应用及其重要性。 一、OGNL简介 OGNL,全称为Object-Graph Navigation Language,是一种强大的、动态的、类型安全的表达式语言,允许程序开发者通过简单的字符串表达式来访问...

    ognl项目文件和源代码

    **ognl项目文件和源代码** OGNL (Object-Graph ...通过这个项目,开发者不仅可以学习到OGNL的用法,还能深入了解表达式语言的设计和实现,这对于提升Java编程技能,特别是对于Web开发和框架理解,是非常有价值的。

    ognl-2.6.11.jar 官方源码

    总而言之,ognl-2.6.11.jar的源码提供了深入了解OGNL这一强大表达式语言的机会,对于Java开发者尤其是框架开发者而言,研究源码能帮助他们更好地利用OGNL,提升代码的灵活性和可维护性。通过不断学习和实践,开发者...

    ognl的源码

    深入理解OGNL的源码对于掌握Struts2的工作原理以及优化应用程序性能至关重要。 1. **OGNL的基本概念** OGNL提供了一种简洁的语法来访问和操作对象图。它支持点号表示法(如`object.property`)、索引访问(如`...

    ognl源码及API

    总之,这个压缩包中的ognl源码和API文档是一份宝贵的资源,对于想要深入理解ognl工作原理或者需要优化使用ognl的开发者来说,它们将提供无价的指导。通过研究源码,你可以探索ognl的底层实现,而API文档则可以帮助你...

    ognl-2.6.11.jar源码

    **ognl-2.6.11.jar源码解析** ognl(Object-Graph Navigation Language)是一种强大的表达式语言,广泛应用于Java应用中,特别是与Struts2框架结合使用。Struts2是一款流行的MVC(Model-View-Controller)框架,它...

    ognl表达式 ognl表达式

    ### OGNL表达式的理解和应用 #### 一、OGNL简介与基本概念 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它是Struts2框架中的默认表达式语言,同时也被广泛...

    ognl的jar包

    特别是对于那些使用Struts2或其他依赖于OGNL的框架的项目,深入理解OGNL的原理和特性是非常有益的。下载“ognl-3.0.6-sources.jar”文件后,开发者可以阅读源码来了解其内部的工作机制,这对于调试、优化或者扩展...

    OGNL语言中文资料

    这篇中文资料将帮助你深入理解OGNL的核心概念、语法特性以及实际应用。 一、OGNL的基础知识 1. **对象导航**:OGNL的名称来源于其核心功能——对象图导航。它可以轻松地遍历对象的属性,甚至通过链式调用来访问嵌套...

    Struts2 技术内幕-深入解析Struts2架构设计与实现原理

    《Struts2技术内幕:深入解析Struts2架构设计与实现原理》由国内极为资深的Struts2技术专家(网名:downpour)亲自执笔,iteye兼CSDN产品总监范凯(网名:robbin)以及51CTO等技术社区鼎力推荐。《Struts2技术内幕:深入...

    ognl源代码以及api文档

    1. **Ognl类**:ognl库的主要入口点,提供静态方法来解析和执行ognl表达式,如`Ognl.getValue()`和`Ognl.setValue()`。 2. **Expression类**:表示ognl表达式,可以被编译并多次执行,提高性能。 3. **OgnlContext...

    ognl-2.7.3-src

    **ognl-2.7.3-src 源码解析** `ognl-2.7.3-src` 是一个开源的 Java 表达式语言(Expression Language)框架 OGNL (Object-Graph Navigation Language) 的源代码包。OGNL 是一个强大的、灵活的表达式语言,它允许...

Global site tag (gtag.js) - Google Analytics