`

深入解析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百度百科

    OGNL百度百科OGNL百度百科OGNL百度百科OGNL百度百科OGNL百度百科OGNL百度百科

    ognl表达式 ognl表达式

    ognl表达式 ognl表达式 ognl表达式 ognl表达式

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

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

    开发工具 ognl-3.1.12

    开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12...

    Struts2 OGNL标签详解析实例

    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-...

    ognl源码.rar

    ognl源码 ognl源码 ognl源码 ognl源码 ognl源码

    Struts2 通过ognl表达式实现投影

    主要介绍了Struts2 通过ognl表达式实现投影,具有一定参考价值,需要的朋友可以了解下。

    OGNL中文版详细文档

    对集合的投影(Project) 在集合中查询 查找第一个匹配项 查找最后一个匹配项 调用构造方法 调用静态方法 读取静态域(Static Fields) 表达式计算 伪Lambda表达式 供集合使用的伪属性 与Java语言不同的操作符...

    ognl.jar ognl.jar

    ognl.jar ognl.jar

    OGNL教程,简单,看完懂OGNL语言

    OGNL 最初是为了能够使用对象的属性名来建立 UI 组件 (component) 和 控制器 (controllers) 之间的联系,简单来说就是:视图 与 控制器 之间数据的联系。后来为了应付更加复杂的数据关系,Drew Davidson 发明了一个...

    ognl 文件

    ognl ognl 文件

    ognl-datasource:用于解析OGNL表达式的PingFederate的自定义数据存储

    用于PingFederate的自定义数据存储,用于解析OGNL表达式 数据源不会访问任何实际的后端数据存储来检索用户属性,而是使用已配置的OGNL表达式处理现有属性。 这样,此数据存储可用于应用OGNL表达式将现有属性转换为...

    ognl-3.2.21-API文档-中文版.zip

    赠送jar包:ognl-3.2.21.jar; 赠送原API文档:ognl-3.2.21-javadoc.jar; 赠送源代码:ognl-3.2.21-sources.jar; 赠送Maven依赖信息文件:ognl-3.2.21.pom; 包含翻译后的API文档:ognl-3.2.21-javadoc-API文档-...

    OGNL2.6.9-API

    OGNL2.6.9-API

    JS:ognl表达式

    JS:ognl表达式 JS:ognl表达式 JS:ognl表达式

    ognl-3.1.12-API文档-中文版.zip

    赠送jar包:ognl-3.1.12.jar; 赠送原API文档:ognl-3.1.12-javadoc.jar; 赠送源代码:ognl-3.1.12-sources.jar; 赠送Maven依赖信息文件:ognl-3.1.12.pom; 包含翻译后的API文档:ognl-3.1.12-javadoc-API文档-...

    ognl的jar包

    ognl的两个版本的jar包,分别是 ognl-3.0.14.jar ognl-3.0.21.jar 有需要的可以下载一下

    OGNL表达式

    OGNL表达式

Global site tag (gtag.js) - Google Analytics