Ognl框架
1说明:Struts2只是把Ognl作为它的表达式引擎,此文章SAMPLE只是单独的Ognl框架,与struts2没有任何联系
2.能力有限,代码中注释难免有误请包含或指证
3.目的:分享, 可作为"数据流转"入口
4.内容:以下为主代码内容,javaBean(User和Company)就不贴出来了,看代码里的setter就可以构造出javaBean了
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
/**
-
引入jar包:ognl.jar +javassist.jar
-
OGNL表达式引擎
-
1.表达式引擎作用:
-
略
-
2.数据流转
-
表达式引擎应用场景:略
-
3.设计模式:类似策略模式/监听器模式
-
根据root类型,指定具体的PropertyAccessor
-
比如,root为List则指派ListPropertyAccessor处理相应逻辑
-
root为Array则指派ArrayPropertyAccessor处理相应逻辑
-
4.调用层次:Ognl
Node
SimpleNode
ASTProperty
SimpleNode
OgnlRuntime
PropertyAccessor{ Object getProperty(Map context, Object target, Object name)} -
5.JJTree 一个有意思的东西,有兴趣的可以看看
-
@author 拈花为何不一笑
-
@since 8/23/2018
*/
public class OgnlExpressEngine {
/**
* 单元测试
*/
public static void main(String[] args) {
// testOgnlForObj();
// testOgnlForMap();
// testOgnlForList();
testOgnlForArray();
System.exit(0);
}
/**
* Ognl访问数组
* 访问数组元素rootInt[2],如何使用Ognl中的方法getValue呢
* 猜想了下expression处,用[2]代替,
* Ognl.getValue(expression, context,root);果真对了。
* 其它类似,比如map,list,set,obj平常你怎么访问它们的就试着写expression
*
* 源码片段:
* if (index instanceof Number)
{
int i = ((Number) index).intValue();
result = (i >= 0) ? Array.get(target, i) : null;
} else
{
throw new NoSuchPropertyException(target, index);
}
*/
private static void testOgnlForArray