先看这个表达式: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使用起来,还是很方便的.官方对其使用方法的文档写的也非常详细,但像作用域这样的"隐藏"概念确没多少资料,希望我的这篇文章能给大家提供一点帮助.
分享到:
相关推荐
本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系留言发至邮箱),若测试不好可以联系本人提供指导. Struts 2默认的表达式语言是OGNL...
OGNL百度百科OGNL百度百科OGNL百度百科OGNL百度百科OGNL百度百科OGNL百度百科
ognl表达式 ognl表达式 ognl表达式 ognl表达式
《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...
Struts2 OGNL---标签详解析 都有实例 适合初学者
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源码 ognl源码 ognl源码 ognl源码 ognl源码
主要介绍了Struts2 通过ognl表达式实现投影,具有一定参考价值,需要的朋友可以了解下。
对集合的投影(Project) 在集合中查询 查找第一个匹配项 查找最后一个匹配项 调用构造方法 调用静态方法 读取静态域(Static Fields) 表达式计算 伪Lambda表达式 供集合使用的伪属性 与Java语言不同的操作符...
ognl.jar ognl.jar
OGNL 最初是为了能够使用对象的属性名来建立 UI 组件 (component) 和 控制器 (controllers) 之间的联系,简单来说就是:视图 与 控制器 之间数据的联系。后来为了应付更加复杂的数据关系,Drew Davidson 发明了一个...
ognl ognl 文件
用于PingFederate的自定义数据存储,用于解析OGNL表达式 数据源不会访问任何实际的后端数据存储来检索用户属性,而是使用已配置的OGNL表达式处理现有属性。 这样,此数据存储可用于应用OGNL表达式将现有属性转换为...
赠送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
JS:ognl表达式 JS:ognl表达式 JS:ognl表达式
赠送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-3.0.14.jar ognl-3.0.21.jar 有需要的可以下载一下
OGNL表达式