Ognl表达式引擎

本文介绍了Ognl框架,它被Struts2用作表达式引擎,但这里单独探讨其核心功能。主要展示了Ognl如何实现数据流转,提到了其设计模式类似于策略模式和监听器模式,并通过单元测试演示了Ognl对对象、Map、List和数组的操作。代码中包含了使用Ognl进行表达式解析的关键方法。
摘要由CSDN通过智能技术生成

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值